【问题标题】:ssh script commands lost after exiting nested shell退出嵌套 shell 后 ssh 脚本命令丢失
【发布时间】:2017-08-15 04:06:51
【问题描述】:

我正在像这样通过 ssh 执行脚本:

ssh $USER@somehost 'bash -s' < ./myscript.sh

myscript.sh内:

echo '1'
sudo -i -u svcacct   # use the service account
echo '2'
exit                 # last working command
echo '3'             
exit
echo '4'

输出:

shellA$ 1
shellB$ 2
shellA$

如您所见,exit 命令在正确退出内部会话时会阻止后续脚本命令运行。 ssh 连接挂起(Ctrl-C 退出)。我该如何解决这个问题?

【问题讨论】:

  • 有几种方法可能会出错,但最简单的方法之一是由sudo -i 启动的内部 bash (被告知它是交互式的,因此可能有一个真正的 TTY 与键盘本身)读取超出exit,即使exit是它执行的最后一个命令。如果它消耗了echo '4' 输入行,则该输入不可用于任何其他进程。

标签: linux bash shell ssh terminal


【解决方案1】:

发出123 的工作实现如下所示:

echo '1'
sudo -u svcacct -i bash -s <<'EOF-1'
echo '2'
EOF-1
echo '3'             
exit
echo '4'

请注意,我们依赖于任何程序退出而将 stdin 的文件描述符与任何特定内容排队等待读取,而是提供 svcacct 实例仅来自不同 heredoc 的一个非常有限且特定的 stdin 子集。

【讨论】: