我想將檔案從電腦 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 環境中),這也是可行且相對簡單的。
下面的命令會將檔案從 直接複製remotePath
到server2
您的電腦中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
是主機和連接埠的佔位符。