无论命令是否成功,我都需要ssh
在不离开连接的服务器的情况下获得指示。
我使用这个命令:
ssh -q user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
我对该命令的问题是我没有留在连接的服务器中。我不想在ssh
命令之后添加测试,我希望像我到目前为止所做的那样 - 通过一个命令。
以下是它现在如何工作的示例:
[nir@dhcppc4 ~]$ ssh -q user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_NOK
[nir@dhcppc4 ~]$ hostname
dhcppc4
[nir@dhcppc4 ~]$ ssh -q user1@server2 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_OK
[nir@dhcppc4 ~]$ hostname
dhcppc4
这是我想要的示例:
[nir@dhcppc4 ~]$ ssh -q user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_NOK
[nir@dhcppc4 ~]$ hostname
dhcppc4
[nir@dhcppc4 ~]$ ssh -q user1@server2 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_OK
[nir@server2 ~]$ hostname
server2
答案1
需要输出“SSH_OK”在远程服务器上和本地主机上的“SSH_NOK”:
ssh -t -q $host 'echo '"$host"'SSH_OK; exec $SHELL' || echo "$host: SSH_NOK"
但我会坚持约翰的建议,即设置提示来指示您在哪台机器上 - 这实际上是您在问题中所建议的。您可能需要重新考虑所有额外的打印是否真的那么有用。
您可能还想详细说明您到底想要实现什么目标 - 可能有更好的方法。例如,如果您正在运行一个脚本,其输出已被解析并且可能以错误结束,但是可以从其输出中检测到该错误,则您需要true
在脚本执行之后添加(或作为在脚本之前运行的最后一个命令)永远退出) - 这将确保您的会话成功退出(即退出状态为零)并且不会调用“echo SSH_NOK”。
答案2
你想要的东西是做不到的。如果您留在新服务器中,则在退出服务器之前不会执行获取状态回显的命令部分。这就是 SSH 的工作原理。如果您在提示符中看到新的主机名,那么您就知道它有效并且您位于目标服务器上。
答案3
您需要处理echo 2>&1
.
例子
$ ssh -q skinner "echo 2>&1"
$
这是我使用我的一位主机 Skinner 要做的事情:
$ ssh -q skinnerrr "echo 2>&1 > /dev/null" && echo SSH_OK || echo SSH_NOK
SSH_NOK
$ ssh -q skinner "echo 2>&1 > /dev/null" && echo SSH_OK || echo SSH_NOK
SSH_OK
答案4
如果您的目标是首先确保可以连接到远程服务器,然后在本地和远程执行一堆操作,那么我的建议是
- 建立远程连接(而不是关闭它);
- 做你的事。
要建立远程连接,请运行主会话。然后,要执行远程操作,请利用现有连接。从属连接使用现有的 TCP 流,它们不需要任何额外的身份验证,因此它们将成功(并且快速建立),当然,除非网络或远程主机出现故障。
ssh_control=$(mktemp -d)/ssh.control
ssh -M -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1
if [ $? -eq 0 ]; then
do_some_local_stuff
ssh -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1
do_some_more_local_stuff
if ! ssh -O check -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1; then
echo 'Uh-oh! The SSH connection died abruptly.'
fi
fi
ssh -O exit -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1
rm "$ssh_control"
rmdir "${ssh_control%/*}"