获取 ssh 命令的指示

获取 ssh 命令的指示

无论命令是否成功,我都需要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

如果您的目标是首先确保可以连接到远程服务器,然后在本地和远程执行一堆操作,那么我的建议是

  1. 建立远程连接(而不是关闭它);
  2. 做你的事。

要建立远程连接,请运行主会话。然后,要执行远程操作,请利用现有连接。从属连接使用现有的 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%/*}"

相关内容