題 我的(第三)個電腦的兩個遠程主機之間的scp


我有兩個遠程主機。
host1-> 10.3.0.1
host2-> 10.3.0.2
兩者都運行一個ssh服務器。

ssh服務器偵聽host1中的端口22和host2中的端口6969。 現在,使用我的本地機器,我需要從host1複製到host2,而無需通過ssh登錄host1或host2。就像是,

scp user@10.3.0.1:/path/to/file user@10.3.0.2/path/to/file

我怎麼能這樣做,請注意兩台主機為ssh使用不同的端口。


112
2017-12-10 13:49


起源


您是在詢問是否可以從遠程主機轉移到遠程主機,或者您是否在不提供密碼的情況下詢問如何進行操作? - glenn jackman
雖然 -P 如果遠程到遠程傳輸,則存在指定要使用的端口的標誌,ssh沒有關於如何指定每個主機端口的已定義行為... - mveroone


答案:


在過去,在哪種方式 scp 工作時,被叫(天真)在遠程系統之間複製文件,非常不方便:例如,如果你寫了

    scp user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

scp 會先開一個 ssh 在remote1上進行會話,然後它就會運行 scp 從那裡到remote2。為此,您必須在remote1上設置remote2的授權憑據。

相反,現代的方式,(“現代”,因為它僅在幾年前實施,也許不是每個人都有 -3-能 scp)需要兩個步驟。第一個必要步驟是使用 ~/.ssh/config 設置連接到remote1和remote2的所有選項,如下所示:

    Host remote1.example.org
    Port 2222
    IdentityFile /path/to/host1-id_rsa

    Host remote2.example.org
    Port 6969
    IdentityFile /path/to/host2-id_rsa

這樣就可以將所有必要的選項傳遞給命令 沒有含糊之處:例如,如果我們在CLI上說過 使用端口2222 沒有上述配置,我們是否指的是不清楚的 REMOTE1 或者 REMOTE2,同樣適用於包含密碼鍵的文件。這樣CLI保持整潔和簡單。

其次,使用 -3 選項,如下:

    scp -3 user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

-3 選項指示 scp 通過發出命令的PC路由流量,即使它是傳輸的第三方。這樣,授權憑證必須僅駐留在發布PC(第三方)上。


185
2017-12-10 18:32



供將來參考:如果在共享身份文件的兩台主機(如EC2實例)之間複製文件,則不需要配置文件。一個-i參數足以連接到兩個主機。 - Artur Czajka
另外值得注意的是,對於Google Compute Engine,支持添加到您的 ~/.ssh/config 文件: cloud.google.com/compute/docs/gcloud-compute 但我不認為AWS有同樣的支持 - modulitos


上次我試過這個,scp無法做到這一點。你的命令行看起來沒問題。此解決方法將起作用:

ssh -p port_on_machine1 user@machine1 "cat /path/to/file/one"|ssh -p port_on_machine2 user@machine2 "cat >/path/to/file/two"

5
2017-12-10 14:17



我的scp手冊頁說:“也允許在兩個遠程主機之間複製。” - glenn jackman
謝謝,很高興聽到。對scp你可以給一個-P標誌(它是由一些BSD人寫的,這是因為它的參數處理是如此悲慘:-(),但似乎你不能在遠程主機上指定不同的端口。對不起,但我認為,只有這種解決方法左派(或者有很多棘手的解決方案,使用ssh但避免使用scp - 例如,sftpfs,但它們並不是最簡單的。)我使用端口設置擴展了我的解決方法。 - peterh


在我的情況下,我正在遠程複製遠程複製,沒有 -3 論點。 使用'-P'參數給出的端口與第一個服務器一起使用,但端口22與第二個服務器一起使用。

ssh -P 1234 user@server1.mydomain.com user@server2.otherdomain.com

解決方案是編輯 /etc/ssh/ssh_config 檔案 server1 並添加以下行:

Host *.otherdomain.com
   Port  1234

以這種方式,端口1234用於它們兩者。它也可能不同。

該解決方案比以前的解決方案具有更好的吞吐量,因為通信是直接的


4
2018-01-26 14:18



perez有沒有辦法通過兩個不同的端口從comman線路為兩個不同的遠程機器實現scp? - Red Bottle