【问题标题】:ssh client (dropbear on a router) does no output when put in backgroundssh 客户端(路由器上的 dropbear)放在后台时不输出
【发布时间】:2013-06-20 19:08:31
【问题描述】:

我正在尝试使用 Linux 机器上的 bash 脚本在远程 Linux 机器上自动化一些事情,并且有一个工作命令(大括号是 cmd 连接的遗留物):

(ssh -i /path/to/private_key user@remoteHost 'sh -c "echo 1; echo 2; echo 3; uname -a"')

但是,如果在后台连接一个 & 号来执行它,它似乎会执行,但没有输出输出,无论是在 stdout 上还是在 stderr 上,甚至重定向到文件(大括号内)也不起作用。 ..:

(ssh -i /path/to/private_key user@remoteHost 'sh -c "echo 1; echo 2; echo 3; uname -a"') &

顺便说一句,我在 Linux 2.4.37.10 上的 BusyBox v1.17.4 中运行 ssh 客户端 dropbear v0.52(TomatoUSB 构建在 WRT54G 上)。

有没有办法获得输出?这种行为的原因是什么?

编辑:

为方便起见,这里是简单的 ssh 帮助输出(在我的 TomatoUSB 上):

Dropbear client v0.52
Usage: ssh [options] [user@]host[/port][,[user@]host/port],...] [command]
Options are:
-p <remoteport>
-l <username>
-t    Allocate a pty
-T    Don't allocate a pty
-N    Don't run a remote command
-f    Run in background after auth
-y    Always accept remote host key if unknown
-s    Request a subsystem (use for sftp)
-i <identityfile>   (multiple allowed)
-L <listenport:remotehost:remoteport> Local port forwarding
-g    Allow remote hosts to connect to forwarded ports
-R <listenport:remotehost:remoteport> Remote port forwarding
-W <receive_window_buffer> (default 12288, larger may be faster, max 1MB)
-K <keepalive>  (0 is never, default 0)
-I <idle_timeout>  (0 is never, default 0)
-B <endhost:endport> Netcat-alike forwarding
-J <proxy_program> Use program pipe rather than TCP connection

1天后修改:

牙套不疼,不管有没有结果都是一样的。我想将 ssh 身份验证置于后台,因此 -f 选项不是解决方案。有趣的附注:如果指定了意外选项(如 -v),则会显示错误消息 WARNING: Ignoring unknown argument '-v' - 即使放在后台,所以从后台进程获取输出通常在我的环境中工作。

我在 x86 Ubuntu 常规 ssh 客户端上试过:它可以工作。我还在 x86 Ubuntu 上尝试了dbclient:也可以。所以这个问题似乎特定于 TomatoUSB 构建 - 或者在“dropbear v0.52”内部是 TomatoUSB 构建和 Ubuntu 提供的构建之间的未知修复(帮助输出的差异只是双倍大小的默认接收窗口缓冲区在 Ubuntu 上)......进程如何知道它是否被置于后台? 问题有解决办法吗?

【问题讨论】:

  • 你试过在详细模式下运行它吗? (-v)
  • 现在,但我只得到WARNING: Ignoring unknown argument '-v' - 即使在后台执行,但仍然没有其他输出。
  • 如果你真的在执行 ( .... ) 包括 '( )' 字符,你能删除那些吗?这些被解释为对子外壳(进程)的调用。他们可能正在“吞噬”您的输出。我以前一直用输出做后台 ssh。它应该可以工作。
  • 查看here 列出的示例。您可能会在那里找到解决方案。
  • 感谢您的快速 cmets - 但这一切还没有解决。 @JusticeCassel 该问题讲述了将远程命令置于后台,但我想将ssh 本身置于后台,就像 Jon Ericsons 在那里的回答一样。明天我会尝试它是否适用于 x86 Ubuntu 非 dropbear。 @shellter 我删除了大括号,但遗憾的是没有任何区别。

标签: ssh busybox


【解决方案1】:

我在我的 OpenWRT 路由器上遇到了类似的问题。如果没有标准输入,Dropbear SSH 客户端不会将任何内容写入输出,例如当由 cron 运行时。我认为 & 对进程标准输入具有相同的效果(无输入)。

我在作者的 bugtracker 上找到了一些解决方法。尝试从 /dev/zero 重定向输入。 喜欢:

ssh -i yourkey user@remotehost "echo 123" </dev/zero &

正如我试图在my blog page 描述的那样,它对我有用。

【讨论】:

  • 我在这里遇到了与 OpenWRT 相同的问题(KAMIKAZE,出血边缘,r20828)。试图将 ssh 的输出捕获到 init.d 脚本中的变量中。我尝试了一切,然后找到了这个解决方法!它就像一个魅力,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 2014-07-21
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多