0

在带有 perl 5.10.1 的 CentOS 6.4 上的 Apache 2.2 上。

我正在尝试从 mod_perl 脚本中获取远程目录列表,该脚本显然(如果我die qx(id))运行为apache. 但我什至无法在ssh没有参数的情况下运行,只是让它打印它的帮助信息。所以这就是我在这个问题中要问的问题 - 这不是ssh无法连接。

die qx(which ssh);

死于:

/usr/bin/ssh

和:

die qx(ls -al /usr/bin/ssh);

死于:

-rwxr-xr-x. 1 root root 376920 Feb 21  2013 /usr/bin/ssh

好的,所以,它可以找到它,看到它,并对其具有执行权限(对于 /usr/bin 和 /usr 也是如此。)但是然后:

die qx(/usr/bin/ssh); # or just 'ssh'

死于空数组,所以我尝试了:

system("ssh") == 0 or die "failed: $! (code $?)"; # or '/usr/bin/ssh'

...死于:

No such file or directory (code 65280)

为什么是这样?我怎样才能得到die qx(ssh)die qx(/usr/bin/ssh)死亡的期望值:

usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-i identity_file] [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]

有趣的是,从 bash 提示符中我得到了这个:

$ sudo su apache ssh
This account is currently not available.

那么......我怎样才能ls从一个不可用但又不可用的帐户运行ssh呢?它们都是程序,为什么它们在这里的行为不同?

更新:不只是ssh,但我无法弄清楚模式:gawktarping也不起作用。然而df, ls, dir,pwd都可以。但:

$ ls -al /bin/ls
-rwxr-xr-x. 1 root root 109208 May 23 07:00 /bin/ls
$ ls -al /usr/bin/dir
-rwxr-xr-x. 1 root root 109208 May 23 07:00 /usr/bin/dir
$ ls -al /bin/pwd
-rwxr-xr-x. 1 root root 28008 May 23 07:00 /bin/pwd
$ ls -al /bin/df
-rwxr-xr-x. 1 root root 73808 May 23 07:00 /bin/df

$ ls -al /bin/gawk
-rwxr-xr-x. 1 root root 375360 Aug  7  2012 /bin/gawk
$ ls -al /bin/tar
-rwxr-xr-x. 1 root root 390616 Feb 21  2013 /bin/tar
$ ls -al /usr/bin/ssh
-rwxr-xr-x. 1 root root 376920 Feb 21  2013 /usr/bin/ssh
$ ls -al /bin/ping
-rwsr-xr-x. 1 root root 40760 Jun  5 06:39 /bin/ping

因此,它们都设置了所有“x”位(除了 ping 其一个“s”,但请参见下面的错误代码),例如,ssh并且dir具有相同的 ACL。那么,为什么应该ssh并且gawk未能提供任何输出却又成功了呢?(完整路径或没有。)dirls

更新:更令人困惑的是,/bin/gawk失败并显示相同的消息,但代码为 256,/bin/tar同样/bin/ping,代码为 512。

更新:好的,这部分是有道理的:如果我从命令行运行失败的二进制文件,然后echo $?立即运行,ssh给出 255,ping给出tar2,gawk给出 1。这些是我在 mod_perl2 中得到的缩小版本。因此,似乎返回码不是 0 的任何东西都不起作用。可能它正在输出到 STDERR,因此 STDOUT 不捕获任何内容,因此返回空白。

啊哈,这就是答案——将发布。

4

1 回答 1

0

如果您重定向 STDERR 以在您的 qx 中也捕获它,如下所示:

die qx(ssh 2>&1);

...你会得到你在命令行上得到的输出。所以不是它没有运行,只是它没有向 STDOUT 写入任何内容。

于 2013-10-25T13:55:48.290 回答