我需要从代理后面的服务器访问数据。因此,我通常可以通过 ssh 连接到代理,然后通过 ssh 连接到目标以执行管理。但是,不确定如何在 bash 中实现这一点。我确实有一个本地 ssh 别名,当我“ssh 目标”时,它将自动通过代理进行隧道传输,但这必须位于我的环境中或其他地方,并且脚本不能使用它。
本质上,在 bash 中是否可以执行“ssh proxy ssh destination $commmand”?我尝试过这个命令,但没有成功。
答案1
这不是你想要的,但如果无法转发端口,你可以先设置 SSH 隧道:
ssh -L 2222:hostbehindproxy:22 user@proxy
进而
ssh -p 2222@localhost user@hostbehindproxy "command"
你可以想办法让隧道一直保持打开状态。一种非常粗暴的方法:
while true; do
# you need to have public key authentication for this to work on the background
ssh -N -L 2222:hostbehindproxy:22 user@proxy
sleep 1
done
答案2
您可以尝试在 ~/.ssh/config 中添加这些行
Host remote_server
HostName remote_server_url_or_ip
User remote_user
ProxyCommand ssh proxy_user@proxy nc %h %p
然后你将只能运行ssh 远程服务器。ip/url 和用户将是文件中定义的。它将首先 ssh 到代理人作为用户代理用户并在该会话中使用 nc 与远程服务器通信。
答案3
为了使用您编写的命令,您必须管理从代理服务器到目标服务器的身份验证。您可以在代理服务器上创建密钥对(使用 ssh-keygen),然后将公钥放在目标服务器的 authorized_keys 文件中(在您使用的用户的 .ssh/ 目录中)。
密钥交换后,您的“ssh proxy ssh destination $commmand”应该可以工作了。