我有以下类型的 shell 脚本:
#!/bin/bash
ssh [email protected]
echo "Hi"
exit
我在本地运行它以在远程服务器上执行某些操作(以“echo "Hi"”表示)。但是,当我运行它时,我看到远程服务器上的提示符 - 因此“exit”命令未执行。当我在远程提示符上手动输入“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
是换行符) - 您的脚本将不会以编程方式“按下回车键”。
答案4
虽然 barlops 的答案是正确的,但我认为我们可以对其进行扩展,使其更清晰。由于您似乎正在使用脚本,我建议这样做:
#!/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 会话会自动关闭。