Linux 如何使用tty通过ssh运行screen执行命令
今天我尝试了很多方法,让ssh启动一个屏幕会话来执行命令。目标是在远程机器上运行命令,能够看到输出并分离和重新连接后者。我想在脚本中完成它,除了分离屏幕会话以关闭之外,不需要任何交互。到目前为止还没有令人满意的解决方案Linux 如何使用tty通过ssh运行screen执行命令,linux,bash,ssh,gnu-screen,Linux,Bash,Ssh,Gnu Screen,今天我尝试了很多方法,让ssh启动一个屏幕会话来执行命令。目标是在远程机器上运行命令,能够看到输出并分离和重新连接后者。我想在脚本中完成它,除了分离屏幕会话以关闭之外,不需要任何交互。到目前为止还没有令人满意的解决方案 ssh -t ${host} "\ source ~/.bashrc; \ echo \"done.\"; \ cd \"$exedir\"; \ if [ \$? -ne 0 ]; then \ echo \"could not
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
中的导出和定义。这就是为什么我试图包含源代码~/.bashrc
。我试图向remotexe.sh添加类似的命令或显式导出,但它的行为就像是由/bin/sh执行的。如果我使用传统的ssh登录,我可以立即运行remotexe.sh脚本而不会出错。我还尝试将shell-$shell
添加到我的.screenrc
这个解决方案的错误在哪里?我怎样才能更正它呢?我根本没有测试过你的代码,也不会保证它的合理性,但你肯定有引用错误。尝试:
ssh -t ${host} "
source ~/.bashrc;
echo done.;
cd \"$exedir\" || exit 1;
echo executing remotexe.sh ...;
screen -S remotexe -t remotexe -R nice -n$prio ./remotexe.sh ${exeparams[@]};"
最后一行中的
“
转义似乎有一些问题。请尝试用”
而不是“
引用整个代码段,以避免一些转义问题。然后字符串中的变量将不会被计算,对吗?我当然可以把字符串中的“
去掉。请原谅。然后用另一种方法:用“
包围代码段,用”
查找其中的任何字符串。上面的命令将-n$prio
作为参数传递给ssh。删除“
之前的尼斯
和之前的那一个代码>不需要在双引号字符串中转义换行符。另外,您可以执行cd$exedir | | exit 1
无需打印错误消息:cd
将为您打印一条。请注意,后面的分号是不必要的。我明白您的意思。但是在这两种情况下,屏幕
显示-n19
被解释为nice
的参数(不要问我为什么)。不幸的是,上述主要问题没有因您的更正而改变。您希望-n
作为什么参数?您正试图通过屏幕运行的命令是什么?(看起来您希望-n19
成为nice的参数,所以我很困惑。)nice-n$prio./remotexe.sh${exeparams[@]}
即,我确实希望它作为nice的参数,并将其作为nice的参数。