某些二进制文件运行,而其他二进制文件不运行(尽管ls可见性和+ x)来自mod_perl2脚本

时间:2013-10-24 14:45:43

标签: linux perl apache2.2 mod-perl2 qx

在CentOS 6.4上的Apache 2.2上使用perl 5.10.1。

我正在尝试从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也不起作用。然而,dflsdirpwd都可以。但是:

$ 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',但在下面看到它的错误代码),例如,sshdir具有相同的ACL 。那么为什么sshgawk无法提供任何输出但dirls成功? (完整路径或否。)

更新:更令人困惑的是,/bin/gawk使用相同的消息但代码256失败,/bin/tar/bin/ping类似,但代码为512。

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

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

1 个答案:

答案 0 :(得分:0)

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

die qx(ssh 2>&1);

...您将获得命令行输出的输出。所以它并不是因为它没有运行,只是因为它没有向STDOUT写任何内容。