【问题标题】:How to run screen executing a command over ssh with tty如何使用 tty 通过 ssh 运行屏幕执行命令
【发布时间】: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


【解决方案1】:

我根本没有测试过你的代码,也不会保证这样做的合理性,但你肯定有一个引用错误。试试:

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

【讨论】:

  • 请注意,结尾的分号是不必要的。
  • 我明白你的意思。然而,在这两种情况下,screen 都表明-n19 被解释为nice 的参数(不要问我为什么)。不幸的是,您的更正并未改变上述主要问题。
  • 您希望-n 成为什么参数?您试图通过屏幕运行的命令到底是什么? (看起来你希望 -n19 成为 nice 的参数,所以我很困惑。)
  • nice -n$prio ./remotexe.sh ${exeparams[@]}
  • 即我确实希望它作为 nice 的论据,并且它被作为 nice 的论据。
猜你喜欢
  • 2011-09-10
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 2010-10-08
  • 2011-01-25
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多