我正在远程服务器上工作并使用 PuTTy。我想使用 sftp 将文件传输到我的本地计算机。我需要在远程提示符下连接到本地计算机,但如何找到连接字符串或执行此操作的信息?我需要执行 sftp 进行连接,然后我可以使用 get/put 进行传输。谢谢。
答案1
当您连接到 OpenSSH 服务器时,会话中启动的进程可以查看SSH_CONNECTION
环境变量以获取有关底层 TCP 连接的信息:
$ echo $SSH_CONNECTION
192.168.2.114 57650 192.168.2.5 22
这里,192.168.2.114是客户端主机(运行 SSH 客户端),57650是客户端 TCP 端口,192.168.2.5是服务器主机(运行 SSH 服务器)并且22当然是服务器的TCP端口。
因此,您可以执行类似的操作echo $SSH_CONNECTION | awk '{ print $1 }'
并尝试连接到该设备。
您无法获取远程用户名或密码,但使用公钥认证和代理转发的一些技巧可以让您免于输入密码。
然而这一切很可能都行不通。因为今天,您通常位于 NAT 防火墙后面。除非您手动设置端口转发,否则所有传入连接都将被拒绝或丢弃。
当我连接到互联网上的主机时,它看起来有点不同:
$ echo $SSH_CONNECTION
46.223.226.204 57691 94.130.123.123 22
$ ssh 46.223.226.204
ssh: connect to host 46.223.226.204 port 22: Connection timed out
注意客户端主机就是现在46.223.226.204尽管内部192.168.2.114。我没有设置 SSH 的端口转发,因此连接失败。
我很幸运,因为我仍然拥有正常的 IPv4 连接。然而,越来越多的 ISP 正在使用运营商级 NAT,这使得端口转发等功能无法实现。连接(如打开 TCP 连接)通常应被视为互联网上的单向连接。
总结:从您的 PC 启动 SFTP 连接。这是唯一的方法。
答案2
实际上,即使本地计算机位于 NAT 和/或限制性防火墙后面,也可以通过反向隧道实现这一点。基本上,您让 SSH 连接从服务器上的随机端口建立隧道回到本地计算机上的 SSH 服务。
首先,选择一个服务器上尚未使用的随机端口(注意:最大可能的端口是 65535)。您可能必须猜测哪个端口未被使用,但如果您猜错了,只需断开连接,重新配置为其他端口,然后重试。我将使用端口 54321 作为示例。
我不使用PuTTy,但根据这和这,你需要做的是进入设置 -> 连接 -> SSH -> 隧道,在源端口中输入随机端口,在目标中输入“localhost:22”,然后选择下面的远程选项。然后就可以正常连接到服务器了。
(如果您使用 OpenSSH,您可以使用类似的方法ssh -R54321:localhost:22 serveruser@serveraddress
来获得相同的效果。)
然后,在远程服务器上,使用以下命令通过隧道重新连接:
sftp -P 54321 localuser@localhost
请注意,您在此处使用的用户名是您在本地计算机上使用的用户名,而不是您在服务器上的用户名。
顺便说一句,当您这样做时,您允许服务器上的任何其他人也有可能通过该隧道重新连接到您的本地计算机。所有关于 SSH 安全的常见警告都适用:确保您计算机上的服务仅对以下用户锁定:应该通过 SSH 连接,并且密码很难猜测。
理想情况下,禁用密码验证,转而使用公钥验证。我认为你可以在计算机上存储私钥和公钥,然后使用代理转发让服务器使用你本地的私钥来验证反向连接。