SSH客户端(路由器上的dropbear)在后台没有输出



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

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

但是,如果在后台连接一个&符号来执行它,它似乎执行,但不打印输出,既不是在标准输出上,也不是在标准错误上,甚至重定向到文件(在大括号内)也不起作用…:

(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上默认接收窗口缓冲区的两倍大小)…进程如何知道它是否被放在后台?这个问题有解决方案吗?

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

我在作者的bug跟踪器上找到了一些解决方法。尝试从/dev/zero重定向输入如:

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

这对我来说很有效,因为我试图在我的博客页面上描述。

最新更新