我想要实现的是在跳转服务器后面的两台服务器上测试 ssh 连接。要求是实际加载 shell(提示),然后退出服务器(连接)。首先我尝试过:
ssh -A -t [email protected] \
"command1; ssh user1@server1 exit; ssh user2@server2 exit"
在加载提示符(shell)之前,它会连接并立即退出 ssh 连接。我找到了解决方法:
ssh -A -t [email protected] \
"command1; ssh user1@server1 <<EOF
EOF
ssh user2@server2 <<EOF
EOF
"
通过使用 EOF,它实际上需要一些命令,因此等待提示,并且由于没有提示,因此退出。
有更好/更好的方法来实现我的目标吗?
答案1
有一种替代方法称为.ssh/config
创建一个名为 .ssh/config 的文件,并进行以下编辑
Host Server-Jump-*
User username
IdentityFile ~/.ssh/id_rsa # -- if you want to provide key
ForwardAgent yes
ServerAliveInterval 60
ServerAliveCountMax 12
Host Server1
Hostname 21.19.6.19
Port 2222
Host Server2
Hostname Server2-IP
Port 22
ProxyCommand ssh -W %h:%p Server1
保存此文件。
现在尝试下面的命令
ssh Server2
proxy命令部分说明
-W host:port
Requests that standard input and output on the client be forwarded to host on port over the secure channel. Implies -N, -T, ExitOnForwardFailure and ClearAllForwardings. Works
with Protocol version 2 only.
`%h` Host name to connect
`%p` Port name to connect
答案2
由于我不想为此使用配置文件,因为这将被更多人在几台计算机上使用(不想每次进行更改时都更新所有内容),所以我得出了这个解决方案:
ssh -A -t user@server1 \
"command1
echo -e "command2" | ssh user1@server2
echo -e "command3" | ssh user2@server3"
这让我以良好的格式得到了我需要的准确输出
答案3
显然,这是一个全自动的连接退出过程,您不需要来自标准输入的任何内容。那么,为什么不关闭标准输入呢?
<&- ssh -A -t [email protected] "
command1
ssh user1@server1
ssh user2@server2
"
command1
如果由于 stdin 关闭而出现奇怪的错误,您可以替换<&-
为< /dev/null