取得 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%/*}"

相關內容