
我有一個以下類型的 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-script和ssh 和 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 argument
:date: 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 會話會自動關閉。