Linux小技巧scp命令
Linux伺服器運維小技巧scp命令詳細教程。
前言
今天給大家帶來的是linux中比較實用的命令scp。善用小技巧,解決工作中的痛點。
掌握一門好的技術或者說一門好的藝術,最快捷的方式就是融入到工作中。
在工作的不斷鞭策之下,我其實也想偷偷懶,有時候覺得怎樣簡單快捷怎樣來。在某種特定的工作環境下,有些操作被限制死了,只能用傳統的方式傳輸(比如訂製的商業加密U盤、光碟刻錄)。當你了解實際情況後,可能有更優解,你會尋求其它的突破口或者折中方案。
誇張的說法,我用了1分鐘熟悉了scp的用法,並直接運用於工作當中。然而,我教同事使用,他卻花了遠遠不止10倍的時間。其中的小竅門,你知道是為啥嗎?我的回答是:善用系統提供的幫助工具或者提示。

正文
一、SCP命令簡介
在Redhat系列可以使用幫助命令:man scp,快速上手,掌握使用方法。
如下圖使用scp或者man scp命令:

1、簡介
-
NAME:scp — 安全複製(遠程文件複製程式)
-
scp 在網路中的主機間進行文件複製。 它用 ssh(1) 來傳輸及驗證數據,提供與 ssh(1)相同的安全保護。 它不象 rcp(1), scp 會根據需要詢問口令。 在任何文件名中都可以包含主機名和用戶名,用來指定從/向該主機複製此文件。
-
Linux scp 命令主要用於 Linux 之間複製文件和目錄。
-
scp 是 secure copy 的縮寫, scp 是 linux 系統下基於 ssh 登陸進行安全的遠程文件拷貝命令。
-
scp 是加密的,rcp 是不加密的,scp 是 rcp 的加強版。
2、前世今生
-
作者
Timo Rinne [email protected] 和 Tatu Ylonen [email protected]
-
起源
scp 基於University of California BSD 的 rcp(1) 源程式碼
-
參考
rcp(1),sftp(1), ssh(1), ssh-add(1),ssh-agent(1),ssh-keygen(1),ssh_config(5),sshd(8)
二、測試環境搭建
1、排除干擾因素
- 防火牆規則
- 所在用戶的scp訪問許可權
- 默認埠是否變更
2、建議
可以租多台雲伺服器測試,按時計費那種(騰訊雲或者阿里雲)。
個人建議:採用VMware虛擬機搭建兩台linux服務環境進行測試學習。或者安裝git,使用git bash測試scp傳輸文件。有人會問,你為啥不直接用WinSCP或者FileZilla傳輸。生活在於折騰,消磨時間唄。從Windows到linux也是一樣的,當然這是本機搭建的VMware虛擬環境網路是打通的。不要問我為什麼,問就是省money唄。
3、準備環境
- VMware虛擬機工具
- Redhat系列、Ubuntu或者國產銀河麒麟
- 系統環境:X86平台
- ssh遠程工具xshell、SecureCRT、putty以及Git Bash等等,只要支援ssh遠程連接的工具。
這裡可以看看利用Git Bash工具,從Windows本地傳文件到搭建的linux伺服器上。

三、SCP命令詳細操作說明
1、語法
usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 ... [[user@]host2:]file2
簡單來看:
scp [可選參數] 本地文件 目標目錄
scp /root/av/local_file.av remote_username@ip:/root/av
scp [可選參數] 本地目錄 目標目錄
scp -r /root/av/ remote_username@ip:/root/
2、參數解析
默認scp傳輸情況下,會顯示傳輸的速率以及進度。
只介紹部分,具體可以參考官方文檔。常用的、重要的也就那麼幾個。
| 參數 | 作用 |
|---|---|
| -1 | 強制scp命令使用協議ssh1 |
| -2 | 強制scp命令使用協議ssh2 |
| -4 | 強制scp命令只使用IPv4定址 |
| -6 | 強制scp命令只使用IPv6定址 |
| -B | 使用批處理模式(傳輸過程中不詢問傳輸口令或短語) |
| -C | 允許壓縮。(將-C標誌傳遞給ssh,從而打開壓縮功能) |
| -p | 保留原文件的修改時間,訪問時間和訪問許可權 |
| -q | 不顯示傳輸進度條 |
| -r | 遞歸複製整個目錄 |
| -v | 詳細方式顯示輸出。scp和ssh(1)會顯示出整個過程的調試資訊。這些資訊用於調試連接,驗證和配置問題 |
| -c cipher | 以cipher將數據傳輸進行加密,這個選項將直接傳遞給ssh |
| -F ssh_config | 指定一個替代的ssh配置文件,此參數直接傳遞給ssh |
| -i identity_file | 從指定文件中讀取傳輸時使用的密鑰文件,此參數直接傳遞給ssh |
| -l limit | 限定用戶所能使用的頻寬,以Kbit/s為單位 |
| -P port | 注意此處是大寫P, port是指定數據傳輸用到的埠號 |
| -S program | 指定加密傳輸時所使用的程式。此程式必須能夠理解ssh(1)的選項 |
3、應用場景
一點小建議:如果不是很理解操作的意義。你可以這樣看待:本機到伺服器或者是伺服器到到伺服器,將其都看作是倉庫,我需要將一壺油或一箱香飄飄者是轉移到另一個倉庫(目的地)。單件的時候,直接傳一個過去;量大的時候,將其所在目錄打包傳輸過去。操作方便快捷,只需要簡單的幾行命令搞定文件傳輸。
命令格式介紹
#複製文件格式
scp local_file remote_username@remote_ip:remote_directory
#或者
scp local_file remote_username@remote_ip:remote_file
#或者
scp local_file remote_ip:remote_directory
#或者
scp local_file remote_ip:remote_file
複製目錄命令格式
#複製命令格式
scp -r local_directory remote_username@remote_ip:remote_directory
#或者
scp -r local_directory remote_ip:remote_directory
3.1、本地到遠程
1、準備了兩台Centos7伺服器,已經設置好了靜態IP
採用虛擬機搭建環境
- ip:192.168.245.147
- ip:192.168.245.131
2、在147伺服器上準備測試內容
下面舉例子的內容,啊啊啊就不要多幻想哈。只是想騷一騷而已,哈哈哈!!!
程式設計師都懂的,形象生動的sex教育片。
#新增一個av目錄
mkdir /root/av
#新增cangls文件並添加內容
echo "cangls av" > /root/av/cangls.av
3、指定用戶名
個人推薦使用指定用戶名,方便快捷。
a、傳輸文件
注意:第一次使用scp命令時會提示驗證,輸入yes即可通過。
#切記傳輸文件時,目標目錄後面不要加/,否則會提示拒絕,這個習慣至今沒改過來
scp /root/av/cangls.av [email protected]:/root
傳文件時,root目錄後面的 / 需要去掉,傳輸完成如下

b、驗證

傳輸文件並指定文件名
#傳輸文件,指定文件名,注意看目標文件名改了方便區別
scp /root/av/cangls.av [email protected]:/root/test.av

指定文件名並驗證

傳輸目錄:加上參數-r
#傳輸目錄,需要加上-r參數
scp -r /root/av/ [email protected]:/root/

傳輸目錄,到目標伺服器驗證

4、不指定用戶名
輸入的時候需要手動輸入用戶名和密碼。
傳輸文件並沿用原始文件名
#傳輸文件,沿用原始文件名
scp /root/av/cangls.av 192.168.245.131:/root
傳輸文件,指定文件名
#傳輸文件,指定文件名,注意看目標文件名改了方便區別
scp /root/av/cangls.av 192.168.245.131:/root/test.av
傳輸目錄,需要加上-r參數
#傳輸目錄,需要加上-r參數
scp -r /root/av/ 192.168.245.131:/root/
3.2、遠程到本地
從遠程複製到本地,說白了就是需要知道遠程的伺服器IP以及用戶名密碼,反過來操作即可從遠程取貨物。換個角度思考就是原本從A端傳到B端,此時從B端傳到A端。前提是兩端互通,不然會只進不出。
1、從遠程取cangls.av文件到本地的root目錄下
scp [email protected]:/root/av/cangls.av /root

2、從遠程取av目錄到本地的root目錄下
scp -r [email protected]:/root/av/ /root/

4、注意事項
如果遠程伺服器防火牆有為scp命令設置了指定的埠,我們需要使用 -P 參數來設置命令的埠號,命令格式如下:
scp 命令使用指定埠號 6022
#從遠程伺服器獲取文件到本地,指定埠
scp -P 6022 remote@ip:/usr/local/av.sh /root
使用scp需要具備讀取文件的許可權,如果沒有許可權則無法傳輸。

