![带有密钥的两台服务器之间的 ssh 隧道](https://linux22.com/image/1559896/%E5%B8%A6%E6%9C%89%E5%AF%86%E9%92%A5%E7%9A%84%E4%B8%A4%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B9%8B%E9%97%B4%E7%9A%84%20ssh%20%E9%9A%A7%E9%81%93.png)
我有两台服务器,A 和 B,使用两个不同的密钥。我在服务器 A 上工作,需要将文件传输到服务器 B。但是我在传输文件时遇到了麻烦,因为当我尝试以下 ssh 隧道时,服务器连接被拒绝;
从服务器A:
ssh -L 1234:server_B:22 -p 45678 user_in_A@server_A
然后它似乎暂停了,过了一会儿,连接就过期了。
如果我使用如下密钥正常进行 scp,那么我就能传输文件,因此我将在 scp 和 ssh 中使用的代码结合起来。
ssh -i key -L 1234:server_B:22 -p 45678 user_in_A@server_A
但它不起作用。
在我这样做之前,我谷歌了一下是否有办法做到这一点。但大多数答案和解释似乎都指向了“ssh -L ...
没有关键”,那么我在这里错过了什么?也许是我还没有掌握的概念,或者我偏离了目标?
答案1
如果服务器 A 可以与服务器 B 的端口 22 建立 TCP 连接,并且您在服务器 A 中输入这些命令,则隧道是不必要的。
ssh -L 1234:server_B:22 -p 45678 user_in_A@server_A
如果你正在运行这些命令在服务器 A 上, 它的意思是:
- 你期望服务器 A 有
sshd
端口 45678 - 您正在从服务器 A 建立到 user_in_A@server_A 的 SSH 连接
- 您还建立了从服务器 A 的端口 1234 到服务器 B 的端口 22 的隧道,即服务器 A
sshd
将在服务器 A 的端口 1234 中设置 TCP 代理,并将到它的连接转发到服务器 B 的端口 22。
由于 SSH 连接是从服务器 A 到服务器 A,因此隧道的加密部分将完全在服务器 A 内,因此几乎无用。如果隧道有效,则意味着您可以简单地使用它scp
来传输文件而无需建立隧道:
scp -i key_for_user_in_B /some/where/local/files user_in_B@server_B:
或者
scp -i key_for_user_in_B user_in_B@server_B:/some/remote/path /some/local/path/
第一个会将文件从本地(A)“推送”到 B,第二个会将文件从 B“拉取”到本地(A)。