Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使用tty通过ssh运行screen执行命令_Linux_Bash_Ssh_Gnu Screen - Fatal编程技术网

Linux 如何使用tty通过ssh运行screen执行命令

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启动一个屏幕会话来执行命令。目标是在远程机器上运行命令,能够看到输出并分离和重新连接后者。我想在脚本中完成它,除了分离屏幕会话以关闭之外,不需要任何交互。到目前为止还没有令人满意的解决方案

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的参数。