答案1
首先,这里的解决方案比问题中提供的链接中给出的解决方案更好,因为这个新解决方案不依赖于外部工具,例如netcat
:
Host C
ProxyCommand ssh -W %h:%p B
在主机 A 中.ssh/config
。用户不需要具备特定的计算机技能,他们只需要被告知即可。任何人都可以在一个文件中放入 2 行。
如果这确实是一个问题,可以将特定命令添加到.ssh/authorized_keys
主机 B 上的文件中:
command="ssh C" ssh-rsa <key_of_the_user_of_host_A>
因此,当用户这样做时ssh B
,主机 B 上的 SSH 服务器将自动运行,而不是在主机 B 上启动交互式 shell ssh C
(请参阅 sshd(8) 手册页)。但是,这将阻止主机 B 上的任何直接登录,并且任何其他 SSH 命令(例如/bin/bash -l
in ssh -t B /bin/bash -l
)将被忽略。正如手册页所说:
客户端最初提供的命令可在 SSH_ORIGINAL_COMMAND 环境变量中找到。
因此,可能还有一些改进的空间,要么在主机 C 上运行提供的命令,要么在某些条件下在主机 B 上运行它(如果考虑到此环境变量,则在引用时也要小心)。一个例子是:
command="ssh ${TTY:+-t} C ${SSH_ORIGINAL_COMMAND-$SHELL}" ssh-rsa <key>
如果有的话,它将在主机 C 上运行提供的命令(如果没有的话,将照常启动交互式 shell)。这样,scp
可能可以工作,但在我的机器上它会失败并出现“权限被拒绝”错误。但效果很好,如果您有问题,rsync
可以用作替代品。scp
重要的。不要选择在主机 B 上打开(必然是非特权)端口的解决方案。这要么不起作用,因为到此类端口的连接被大学的防火墙阻止,要么这将引入安全问题,因为这将允许用户通过端口 22 上的 SSH 服务器绕过主机 B 上的身份验证(使用跟踪等功能)。
答案2
在主机 B 上:
B$ ssh localhost -L 2222:C:22 -g
运行时每个人都可以通过 B:2222(tcp 端口 2222)连接到主机 C
对于永久解决方案,您可以screen
在主机 B 上运行 ssh 命令,并将 ssh 命令保留在后台。
(您可以使用比 ssh 到本地主机更简单的 tcp 重定向软件:例如 redir )
答案3
一种不需要在 B 上打开端口,但在 A 上打开一个端口的交互式转发解决方案如下:
在A上:
ssh -fNL 2222:C:22 B
ssh -p 2222 localhost
除了 @vinc17 提到的配置代理选项(以类似的方式工作)之外,了解这一点可能会很有用。