【发布时间】:2012-11-24 16:24:16
【问题描述】:
我今天尝试了很多方法来让 ssh 启动一个执行命令的屏幕会话。目标是在远程机器上运行命令并能够看到输出并分离和重新连接后者。我想从脚本中执行此操作,除了分离屏幕会话以关闭之外没有任何交互。目前还没有令人满意的解决方案。
ssh -t ${host} "\
source ~/.bashrc; \
echo \"done.\"; \
cd \"$exedir\"; \
if [ \$? -ne 0 ]; then \
echo \"could not cd into directory\"; \
exit 1; \
fi; \
echo \"executing remotexe.sh ...\"; \
screen -S "remotexe" -t "remotexe" -R "nice -n$prio ./remotexe.sh ${exeparams[@]}";"
我遇到的一些问题与将命令传递给 screen/ssh/bash 的奇怪方式有关,这会干扰参数和选项(我不太明白他们为什么不使用 -- 来解释以下内容带参数的命令)。上面的版本几乎可以工作。剩下的困难是 remotexe.sh(尤其是 make)中的命令显然错过了来自 .bashrc 的导出和定义。这就是我尝试包含source ~/.bashrc 的原因。我尝试向 remotexe.sh 添加类似的命令或显式导出,但它的行为就好像它是由 /bin/sh 执行的。如果我进行常规 ssh 登录,我可以立即运行 remotexe.sh 脚本而不会出错。我还尝试将shell -$SHELL 添加到我的.screenrc。
这个解决方案的错误在哪里?我该如何纠正?
【问题讨论】:
-
最后一行
"的转义似乎有些问题。尝试使用'而不是"引用整个sn-p,以节省一些逃避的麻烦。 -
那么字符串中的变量就不会被求值了吧?我当然可以排除字符串中的
"。 -
对不起。然后反过来做:使用
"包围sn-p 和'用于其中的任何字符串。 -
上面的命令将
-n$prio作为参数传递给ssh。删除nice之前的"和;之前的一个 -
没有必要在双引号字符串中以合理的外壳转义换行符。另外,您可以使用
cd $exedir || exit 1无需打印错误消息:cd将为您打印一条。
标签: linux bash ssh gnu-screen