Shell 腳本:ssh 到遠端計算機,然後退出:「exit」不起作用

Shell 腳本:ssh 到遠端計算機,然後退出:「exit」不起作用

我有一個以下類型的 shell 腳本:

#!/bin/bash

ssh [email protected]
echo "Hi"
exit

我在本地運行它以在遠端伺服器上執行某些操作(由“echo“Hi”表示)。但是,當我運行它時,我在遠端伺服器上看到提示 - 因此“退出”命令沒有執行。然後,當我在遠端提示符號下手動鍵入“exit”時,我會看到“與 myremotemachine.com 的連接”已關閉,並且然後 「你好」。如何設定 shell 腳本,使其正確退出並顯示執行它的(本機)提示符號?

https://unix.stackexchange.com/questions/89747/ssh-exits-after-quit-case-in-bash-scriptssh 和 shell 通過 ssh :如何退出?似乎有些相關,但我無法適應那裡提出的想法。

更新

以下不是最小的版本導致Unmatched '..

#!/bin/bash

date=`date "+%Y-%m-%d"`
rsync -acxzP --delete --link-dest=/u3/mylogin/backup/old_backup /home/mylogin [email protected]:/u3/mylogin/backup/$date\_backup
ssh [email protected] bash -c "'
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
exit
'"

如果我刪除這段程式碼中的雙引號,我會得到bash: -c: option requires an argumentdate: Undefined variable.

答案1

這應該可以解決你的問題。

ssh [email protected] << HERE
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
HERE

或者您可以執行以下操作。將要在遠端主機上執行的所有命令放在單獨的腳本中。給它一個名字,例如remote.sh

現在運行以下命令

ssh [email protected] 'bash -s' < /path/to/remote.sh

其中remote.sh包含。

rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup

答案2

你可以做

$ssh user@comp echo abc<ENTER>

然後它將運行該命令(輸出 abc),然後退出

答案3

也許腳本末尾沒有換行符?

如果退出後沒有空白行(確切地說LF是換行符號),您的腳本將不會以程式設計方式「按 Enter」。

答案4

儘管巴洛普的答案是正確的,但我認為我們可以對其進行擴展,使其更加清晰。由於您似乎正在使用腳本,因此我建議如下:

#!/bin/bash

ssh [email protected] "echo Hi\!"

額外閱讀:我還建議您也研究一下特殊字元以及何時需要轉義它們,因為 bash 會自動解析雙引號中的感嘆號。您可以透過使用單引號或反斜線字元來「轉義」它來解決此問題。

編輯:

#!/bin/bash
date=`date "+%Y-%m-%d"`
rsync -acxzP --delete --link-dest=/u3/mylogin/backup/old_backup /home/mylogin [email protected]:/u3/mylogin/backup/$date\_backup
ssh [email protected] '
date=`date "+%Y-%m-%d"`
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
'

當我嘗試簡化版本時,日期變數工作沒有問題,也許這會修正您遇到的 bash -c 問題。最後也不需要退出,執行最後一個指令時,ssh 會話會自動關閉。

相關內容