2012-11-24 81 views
0

我今天尝试了很多事情,让ssh启动一个执行命令的屏幕会话。目标是在远程机器上运行命令,并能够看到输出并分离并重新附加后者。我想从脚本内部完成,除非将屏幕会话关闭。目前还没有令人满意的解如何运行屏幕执行一个命令通过ssh与tty

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[@]}";" 

一些我遇到的都涉及到一种奇特的方式来传递与参数和选项干扰到屏幕/ SSH/bash的命令的问题(我不明白为什么他们不使用--解释什么作为带有参数的命令)。上述版本几乎可以工作。剩下的难题是remotexe.sh中的命令(特别是make)显然错过了.bashrc的输出和定义。这就是为什么我试图包括source ~/.bashrc。我试图添加类似的命令或显式导出到remotexe.sh,但它的行为就好像它是由/ bin/sh执行的。如果我做传统的ssh登录,我可以立即运行remotexe.sh脚本而不会出错。我也尝试将shell -$SHELL添加到我的.screenrc

该解决方案的错误在哪里?我该如何纠正它?

+0

似乎有一些问题的'“'在最后一行尝试用引号将整个片断'''而不是'。”'来保存自己一些逃避头疼的转义。 – Thomas

+0

然后字符串中的变量将不会被评估,对吧?我当然可以去掉字符串中的''' – highsciguy

+0

请原谅我,然后反过来:使用'''将代码片段和'''包围其中的任何字符串。 – Thomas

回答

0

我还没有测试过你的代码,也不会担保这一点的理智,但是你肯定有引用错误。尝试:

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[@]};" 
+1

请注意,尾部的分号是不必要的 –

+0

我明白你的意思,但在这两种情况下'screen'都显示'-n19'被解释为参数'不错'(不要问我为什么)上面描述的主要问题不幸的是你的更正没有改变 – highsciguy

+0

你希望'-n'成为一个参数吗?到底什么是你试图运行的命令通过屏幕?(它看起来像你想'-n19'是一个很好的参数,所以我很困惑。) –