SCP (secure copy) 是通過SSH(Secure Shell protocol)安全加密的方式,允許你在兩個locations之間安全地複製文件或目錄。
使用scp命令,可以實現:
通過本地伺服器,實現遠程伺服器之間的文件或目錄複製其基本語法為:
scp [OPTION] [user@]SRC_HOST:]file1 [user@]DEST_HOST:]file2[user@]SRC_HOST:]file1代表源文件或目錄,[user@]DEST_HOST:]file2代表目標文件或目錄。
其常用選項為:
-P:指定目標主機的埠號
-p:保留原文件的修改時間,訪問時間和訪問權限
-r:遞歸複製整個目錄
-q: quiet模式,不顯示文件複製過程中的進度、警告和診斷信息
-C:啟用壓縮。scp 命令依賴 ssh 進行數據傳輸,因此它需要 ssh 密鑰或密碼才能在遠程系統上進行身份驗證。
冒號 (:) 是 scp 區分本地和遠程主機的方式。
為了能夠複製文件,必須至少具有源文件的讀取權限和目標目錄的寫入權限。
注意: 當目標伺服器上已有相同的文件或目錄,scp 將在沒有警告的情況下覆蓋其文件。
示例複製本地伺服器上的文件到遠程伺服器從本地伺服器複製文件到遠程伺服器上的某個目錄下:
# 複製本地伺服器上的file.txt到遠程伺服器的/remote/directory目錄下
>cmd scp file.txt remote_username@10.10.0.2:/remote/directory
# 輸出
remote_username@10.10.0.2's password:
file.txt 100% 0 0.0KB/s 00:00
Copy其中file.txt為我們要複製的源文件,remote_username為我們將要把源文件複製到的遠程伺服器上的用戶名,10.10.0.2為遠程伺服器的IP位址。/remote/directory為要把源文件複製到的目標伺服器上的目錄,如果不指定目錄,將會直接把文件複製到目標用戶的家目錄下;如果指定目錄和文件名,將會把源文件複製到目標伺服器指定的目錄,並把源文件名修改為指定的文件名,如下:
# 複製本地伺服器上的file.txt到遠程伺服器的/remote/directory目錄下,並命名為newfilename.txt
>cmd scp file.txt remote_username@10.10.0.2:/remote/directory/newfilename.txt如果遠程伺服器的埠不為默認的22時,需要指定埠號:
# 指定埠號為1029
>cmd scp -P 1029 file.txt remote_username@10.10.0.2:/remote/directory當複製整個文件夾時,需要加-r選項:
# 將/local/directory目錄及目錄下的所有子目錄和文件複製到目標伺服器
>cmd scp -r /local/directory remote_username@10.10.0.2:/remote/directory
# 當文件非常大時,我們可以使用-C選項,啟用壓縮模式,來減少時間
>cmd scp -C -r /local/directory remote_username@10.10.0.2:/remote/directory
# 如果我們不想看到提示信息,可以使用-q選項,啟用安靜模式
>cmd scp -C -q -r /local/directory remote_username@10.10.0.2:/remote/directory
# 如果還想保留原文件的修改時間,訪問時間和訪問權限,可以添加-p選項
>cmd scp -C -q -p -r /local/directory remote_username@10.10.0.2:/remote/directory
複製遠程伺服器上的文件到本地伺服器和複製本地伺服器上的文件到遠程伺服器類似,只是把源文件/目錄和目標文件/目錄的位置調換了。
# 從遠程伺服器複製/remote/file.txt到本地伺服器的/local/directory
>cmd scp remote_username@10.10.0.2:/remote/file.txt /local/directory
通過本地伺服器,實現遠程伺服器之間的文件或目錄複製與 rsync 不同,使用 scp 命令,我們無需登錄其中一臺伺服器即可將文件從一臺遠程主機傳輸到另一臺遠程主機。
# 把遠程伺服器host1.com上user1下的/files/file.txt文件複製到遠程伺服器host2.com上user2下的/dir目錄下
>cmd scp user1@host1.com:/files/file.txt user2@host2.com:/dir
應用實例當我們想在兩個普通用戶之間移動文件,如果使用簡單的cp/mv命令,會出現一種我們不希望看到的情況——當把user1的file1.txt移動到user2的home下時,這個文件的擁有者還是user1,即默認情況下,user2隻有讀權限,沒有寫權限(自然也沒有移動權限)。即使user1通過修改該文件的文件權限,讓user2可寫,移動到user2的home目錄下file1.txt文件的擁有者還是user1,而且非得root才能改成user2。
這種情況下,我們當然有很多解決辦法,例如,先用user1用戶登錄,把文件copy到系統臨時目錄/tmp,然後切換到user2用戶,再從系統臨時目錄/tmp把文件copy到user2的home目錄:
# 登錄user1用戶
>cmd
cp file1.txt /tmp/
su - user2
cp /tmp/file1.txt ~/
exit
rm /tmp/file1.txt這個辦法有點曲折,弊端也很明顯,文件需要複製兩次,花兩倍的時間。
而如果我們使用scp命令,只需要一行命令即可:
# 登錄user2用戶,輸入user1用戶密碼,開始文件傳輸
scp user1@localhost:/home/user1/file1.txt ./
# 或登錄user1用戶,輸入user2用戶密碼,開始文件傳輸
scp file1.txt bar@localhost:/home/user2/如果要複製的不是文件,而是整個目錄(例如dir1),則添加-r選項即可:
# 登錄user2用戶,輸入user1用戶密碼,開始文件傳輸
scp -r user1@localhost:/home/user1/dir1 ./
# 或登錄user1用戶,輸入user2用戶密碼,開始文件傳輸
scp -r dir1 bar@localhost:/home/user2/
Reference1.https://www.jb51.net/article/91394.htm
2.https://linuxize.com/post/how-to-use-scp-command-to-securely-transfer-files/
3.https://www.geeksforgeeks.org/scp-command-in-linux-with-examples/