Linux 命令(30)—— scp 命令
1.簡介
scp(secure copy)命令是一個基于 SSH 安全的進行遠程文件拷貝命令,用于在 Linux 下遠程拷貝文件,和它類似的命令有 cp,不過 cp 只是在本機進行拷貝不能跨服務器,而且 scp 支持對傳輸的數據進行加密。
2.命令格式
scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 ... [[user@]host2:]file2
3.選項說明
-1使用 SSH 協議版本 1
-2使用 SSH 協議版本 2
-4使用 ipv4
-6使用 ipv6
-B以批處理模式運行,阻止 scp 詢問口令
-C使用壓縮,將 -C 標志傳遞給 SSH,從而打開壓縮功能
-c CIPHER使用指定的秘鑰對傳輸的文件進行加密
-F SSH_CONFIG指定 SSH 配置文件
-i IDENTITY_FILE從指定文件中讀取傳輸時使用的密鑰,此參數直接傳遞給 ssh
-l LIMIT指定寬帶限制
-o SSH_OPTION指定使用的 ssh 選項,可以使用 SSH_CONFIG 中使用的 ssh 選項
-P PORT指定遠程主機的端口號
-p保留文件的最后修改時間,最后訪問時間和權限模式
-q靜默模式,不顯示復制進度以及來自 ssh 的警告和診斷消息
-r以遞歸方式復制整個目錄
-S PROGRAM指定加密傳輸時所使用的程序。此程序必須能夠理解 ssh 的選項
-v使用冗余模式,使 scp 和 ssh 打印調試信息以及進度
注意事項:
(1)scp 返回 0 成功,>0 失敗;
(2)使用 scp 在不同主機之間進行文件傳輸,需要確保兩臺設備都開啟了ssh遠程登錄服務,且兩臺設備能互相通信;
(3)使用 scp 命令要確保使用的用戶具有可讀取遠程服務器相應文件的權限,否則scp 命令無法起作用。
4.常用示例
(1)遠程主機之間,使用 scp 拷貝多個文件。
方法一:將多個文件放在同一個目錄中,使用scp -r來拷貝,參考如下代碼:
scp -r uername@sourceHostName:sourcedir username@destinationHostName:destinationdir
方法二:將多個文件或者目錄使用tar打包后作為單個文件傳輸。
方法三:scp支持同時拷貝多個文件的功能。
scp file1 file2 remote_username@remote_ip:remote_folder
(2)從本地復制文件到遠程。
命令格式:
scp local_file remote_username@remote_ip:remote_folder
# 或
scp local_file remote_username@remote_ip:remote_file
# 或
scp local_file remote_ip:remote_folder
# 或
scp local_file remote_ip:remote_file
第1,2個指定了用戶名,命令執行后需要再輸入密碼,第1個僅指定了遠程的目錄,文件名字不變,第2個指定了文件名;
第3,4個沒有指定用戶名,命令執行后需要輸入用戶名和密碼,第3個僅指定了遠程的目錄,文件名字不變,第4個指定了文件名。
應用實例:
scp /home/space/music/1.mp3 root@www.runoob.com:/home/root/others/music
scp /home/space/music/1.mp3 root@www.runoob.com:/home/root/others/music/001.mp3
scp /home/space/music/1.mp3 www.runoob.com:/home/root/others/music
scp /home/space/music/1.mp3 www.runoob.com:/home/root/others/music/001.mp3
(3)使用 scp 復制目錄。
命令格式:
scp -r local_folder remote_username@remote_ip:remote_folder
# 或
scp -r local_folder remote_ip:remote_folder
第 1 個指定了用戶名,命令執行后需要再輸入密碼;
第 2 個沒有指定用戶名,命令執行后需要輸入用戶名和密碼。
應用實例:
scp -r /home/space/music/ root@www.runoob.com:/home/root/others/
scp -r /home/space/music/ www.runoob.com:/home/root/others/
上面命令將本地 music 目錄復制到遠程 others 目錄下。
(4)從遠程復制到本地。
從遠程復制到本地,只要將從本地復制到遠程的命令的后2個參數調換順序即可,如下實例
應用實例:
scp root@www.runoob.com:/home/root/others/music /home/space/music/1.mp3
scp -r www.runoob.com:/home/root/others/ /home/space/music/
**說明:**如果遠程服務器防火墻有為scp命令設置了指定的端口,我們需要使用 -P 參數來設置命令的端口號,命令格式如下:
#scp 命令使用端口號 4588
scp -P 4588 remote@www.runoob.com:/usr/local/sin.sh /home/administrator
(5)使用 expect 和 scp 實現不同主機之間文件的自動傳輸。
腳本如下:
#!/usr/bin/expect
set timeout 5
spawn scp dablelv@172.25.44.22:/yourpath/yourfile root@10.130.89.104:/destinationpath
expect "dablelv@172.25.44.22's password:"
send "123456\n"
expect "root@10.130.89.104's password:"
send "123456\n"
interact eof
腳本解釋:
第一行:#!/usr/bin/expect 指明該腳本由expect來解析。這里的expect其實和linux下的bash、Windows下的cmd.exe是一類東西,都是可執行程序,也可用于腳本的解析器。expect的主要作用是解析自動交互的腳本,比如實現ssh的自動登錄,無需手動輸入密碼等。
第二行:set timeout 5 用于設置expect的expect命令的等待時間為5秒,如果expect等待的值在5秒內沒有出現在標準輸出,那么expect腳本繼續執行。expect的默認timeout為10s。
第三行:spawn scp dablelv@172.25.44.22:/yourpath/yourfile。spawn是expect的內置命令,不是Linux可執行程序,使用which spawn 是查不到spawn所在路徑的。這個就好比cd是shell的內建命令,離開shell,就無法執行cd一樣。 它主要的功能是給ssh運行進程加個殼,用來傳遞交互指令。 它主要的功能是給后面需要執行的命令加個殼,用來傳遞交互指令。
第四行:expect "dablelv@172.25.44.22's password:" expect命令也是expect的內建命令,其作用就是等待標準輸出出現指定的值,如果有則立即返回,向下執行;否則就一直等待,等待的最長時間由上面的set timeout來指定。
第五行:send "123456\n"就是在expect等待到指定的值之后向標準輸出發送的值,這里就是執行交互動作,與手工輸入密碼的動作等效。效果上跟用戶手動在終端上輸入123456之后敲一個回車一樣。
第六、七行實現的功能同第五六行,因為scp需要登錄到兩個主機實現文件的網絡傳輸,所以這里是登錄第二臺主機需要輸入的密碼。
第八行:interact eof 表示expect腳本執行結束。執行完成上述命令后,此時Expect會把控制權交給控制臺,這個時候就變回手工操作。如果是使用ssh登錄其它主機的話,需要保持在交互狀態,那么此時需要interact,如果沒有這一句登錄完成后會立刻退出,而不是留在遠程終端上。如果你只是登錄過去執行一段命令就退出,可將其改為expect eof。
如果出現 ": no such file or directory 這樣的錯誤,很可能是因為在本地Windows環境編輯,上傳到Linux下執行因文件格式不同導致的,可使用vi或者vim在末行模式使用:set ff來查看文件格式,如果是dos格式的話,那么需要使用:set ff=unix 來改變文件格式。
參考文獻
[1] scp(1) manual
[2] Linux命令大全.scp命令
[3] Linux scp命令
[4] expect簡單教程
總結
以上是生活随笔為你收集整理的Linux 命令(30)—— scp 命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php static 访问,使用PHP访
- 下一篇: iOS16.2beta4更新内容及升级建