每天一個linux命令:拷貝命令家族(cp、scp、rsync) — scp
1. scp功能
scp 命令可以在 2個 linux 主機間複製文件; scp 即secure copy, scp是linux系統下基於ssh的遠程文件拷貝命令,所以,使用scp命令之前要保證目標主機開啓了ssh server。
更多精彩請查看:www.zicreate.com
2.命令格式
scp [參數] [源路徑] [目標路徑]
#遠程主機路徑格式爲 username@host:filename
3.主要命令參數
-1:使用ssh協議版本1;
-2:使用ssh協議版本2;
-4:使用ipv4;
-6:使用ipv6;
-B:以批處理模式運行;
-C:使用壓縮;
-F:指定ssh配置文件;
-l:指定寬帶限制;
-o:指定使用的ssh選項;
-P:指定遠程主機的端口號;
-p:保留文件的最後修改時間,最後訪問時間和權限模式;
-q:不顯示覆制進度;
-r:以遞歸方式複製。
4.使用場景
場景1:從本地複製到遠程
命令:
$ scp zicreate.txt [email protected]:/tmp/
The authenticity of host ‘10.239.85.241 (10.239.85.241)’ can’t be established.
ECDSA key fingerprint is 21:fe:c6:5f:91:7e:b6:28:b3:fe:aa:8e:24:3a:2d:2b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘10.239.85.241’ (ECDSA) to the list of known hosts.
[email protected]’s password:
zicreate.txt 100% 640 0.6KB/s 00:00
如上所示,第一次建立ssh鏈接時會詢問,輸入yes即可。由於scp是基於ssh登陸進行安全的遠程文件拷貝,所以,拷貝時需要指定遠程主機的用戶名稱以及對應的密碼,只有經過認證的用戶才具有拷貝權利,並不是可以隨便拷貝的。
場景2:從遠程複製到本地
命令:
$ rm zicreate.txt
rm: remove regular file ‘zicreate.txt’? y
$ scp root@10.239.85.241:/tmp/zicreate.txt ./
root@10.239.85.241's password:
zicreate.txt 100% 640 0.6KB/s 00:00
$ ls -l zicreate.txt
-rw-r--r--. 1 root root 640 Dec 28 02:52 zicreate.txt
場景1與場景2的操作是一樣的,唯一的區別僅在於 [源路徑] [目標路徑] 的定義不同而已。
場景3:複製文件夾
使用scp 進行文件夾複製時只需要加上 “-r” 參數即可,其他如通配符之類的組合操作可以參考cp命令。使用方式如下:
$ scp -r [email protected]:/tmp/dir1 ./ #從遠程拷貝文件夾到本地
$ scp -r ./dir1 [email protected]:/tmp #從本地拷貝文件夾到遠程
默認進行復制操作時會顯示傳輸進度以及傳輸速率。
其他參數相關操作實際使用較少,不再詳述。
擴展
與scp相似有一個同樣功能的命令rcp。scp 是 rcp 的加強版,是security cp,而 rcp 是不加密的remote cp。所以,有了scp 基本上不需要 rcp 了,本系列文章不再講解 rcp 的使用。
腦洞
在這裏先劇透一個牛逼的命令 nc — Netcat。
以下演示如何通過 nc 進行文件以及目錄的遠程傳輸。
在這個示例中,假設有兩臺電腦 A / B。A作爲服務器(ip=10.239.85.234),B爲客戶端(ip=10.239.85.241)。
1. 文件傳輸
Server
$ nc -l 1234 < zicreate.txt
Client
$ nc -n 10.239.85.234 1234 > recv.txt
在這裏我們創建了一個socke服務在A的1234端口上,並且重定向 netcat 的輸入爲文件 zicreate.txt,那麼當任何 client 成功連接到 server 該端口時,netcat 會發送文件 zicreate.txt 的內容到 client。
在 client 我們將接收到的數據重定向輸出到 recv.txt,當 Client 連接到 server , server 發送文件內容, Client 保存文件內容.
當然,server 端也可以接收文件,方法如下:
同樣是 A 作爲Server,
Server
$ nc -l 1234 > recv.txt
Client
$ nc -n 10.239.85.234 1234 < recv.txt
2. 目錄傳輸
發送一個文件很簡單,但是如果我們想要發送多個文件,或者整個目錄,一樣很簡單,只需要使用壓縮工具tar,壓縮後發送壓縮包。
具體命令如下:
Server
$ tar -cvf – ./dir1 | nc -l 1234
Client
$ nc -n 10.239.85.234 1234 | tar -xvf -
在server 上,我們創建一個tar歸檔包並且通過”-“在控制檯重定向它,然後使用管道重定向給netcat,netcat可以通過網絡發送它。
在client 我們下載該壓縮包,然後通過管道接收歸檔包並解壓爲文件夾。
如果想要節省帶寬傳輸壓縮包,我們可以使用bzip2或者其他工具壓縮。
關於netcat 更多高級操作此處不在展開,留待以後講解。