如何在機器之間進行多跳 SCP 傳輸?

如何在機器之間進行多跳 SCP 傳輸?

我想將檔案從電腦 A 複製到伺服器 C,但只能透過伺服器 B 存取伺服器 C。

不是先傳輸到伺服器B,而是登入然後再傳輸到伺服器C,是否可以直接使用SCP或類似程式傳輸檔案?

(Emacs ranp-mode 具有遠端編輯檔案的功能)。

答案1

您可以新增-o選項來scp代替.ssh/config.

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_host在本例中是您的「伺服器 B」。

答案2

假設使用 OpenSSH,請新增至 .ssh/config 中的 SSH 配置

Host distant
ProxyCommand ssh near nc distant 22

這將使 SSH 能夠透過名為「near」的機器進行代理,「直接」連接到名為「distant」的機器。然後,它可以使用 scp 和 sftp 等應用程式連接到遠端電腦。

為此,您需要在名為“near”的電腦上安裝“nc”(又稱 netcat)。但許多現代系統已經擁有它。

假設您已經記住了 tar 的語法和操作規則,towo 的 tar 解決方案對於一次性問題更有效。

答案3

對於 (B) 機器附近的伺服器上的最新版本的 ssh,以下內容將在沒有 netcat 的情況下運作:

Host distant
    ProxyCommand ssh near -W distant:22

但是,它要求附近 (B) 計算機上的 AllowTcpForwarding 為 yes(預設值)

編輯:B 上需要 OpenSSH 5.4+

答案4

即使您需要使用憑證進行驗證(通常在 AWS 環境中),這也是可行且相對簡單的。

下面的命令會將檔案從 直接複製remotePathserver2您的電腦中localPath。在內部,scp 請求透過 進行代理server1

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

另一種方法也可以(上傳文件):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

如果您使用密碼身份驗證,請嘗試使用

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

如果您在兩台伺服器中使用相同的使用者憑證:

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>

-W選項內建於新版本的 OpenSSH 中,因此它僅適用於具有最低版本(5.4,除非您的發行版向後移植任何功能;例如,RHEL6 OpenSSH 5.3p1 包含此功能)的電腦。根據發行說明:http://www.openssh.com/txt/release-5.4

為 ssh(1) 新增了「netcat 模式」:「ssh -W host:port ...」 這將客戶端上的 stdio 連接到伺服器上的單一連接埠轉送。例如,這允許使用 ssh 作為 ProxyCommand 透過中間伺服器路由連接。

%h%p是主機和連接埠的佔位符。

相關內容