無論命令是否成功,我都需要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%/*}"