Linux 某些二进制文件运行,而其他二进制文件不运行';t(不管ls可见性和+;x)来自mod#u perl2脚本

Linux 某些二进制文件运行,而其他二进制文件不运行';t(不管ls可见性和+;x)来自mod#u perl2脚本,linux,perl,apache2.2,mod-perl2,qx,Linux,Perl,Apache2.2,Mod Perl2,Qx,在CentOS 6.4和perl 5.10.1上的Apache 2.2上 我试图从mod_perl脚本中获取远程目录列表,显然(如果我dieqx(id))是作为apache运行的。但是我甚至不能在没有参数的情况下运行ssh,只是让它打印帮助信息。所以这就是我在这个问题中要问的——这不是关于ssh无法连接 die qx(which ssh); 死亡原因: /usr/bin/ssh -rwxr-xr-x. 1 root root 376920 Feb 21 2013 /usr/bin/ssh

在CentOS 6.4和perl 5.10.1上的Apache 2.2上

我试图从mod_perl脚本中获取远程目录列表,显然(如果我
dieqx(id)
)是作为
apache
运行的。但是我甚至不能在没有参数的情况下运行
ssh
,只是让它打印帮助信息。所以这就是我在这个问题中要问的——这不是关于
ssh
无法连接

die qx(which ssh);
死亡原因:

/usr/bin/ssh
-rwxr-xr-x. 1 root root 376920 Feb 21  2013 /usr/bin/ssh
No such file or directory (code 65280)
以及:

死亡原因:

/usr/bin/ssh
-rwxr-xr-x. 1 root root 376920 Feb 21  2013 /usr/bin/ssh
No such file or directory (code 65280)
好的,它可以找到它,看到它,并且对它有执行权限(对于/usr/bin和/usr也是如此),但是:

die qx(/usr/bin/ssh); # or just 'ssh'
使用空数组死亡,因此我尝试:

system("ssh") == 0 or die "failed: $! (code $?)"; # or '/usr/bin/ssh'
…随着以下情况而死亡:

/usr/bin/ssh
-rwxr-xr-x. 1 root root 376920 Feb 21  2013 /usr/bin/ssh
No such file or directory (code 65280)
为什么会这样?如何使
dieqx(ssh)
dieqx(/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
,而且我也搞不清模式:
gawk
tar
,和
ping
也不起作用。然而,
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”位(除了使用“s”进行ping,但请参见下面的错误代码),例如,
ssh
dir
具有相同的ACL。那么为什么
ssh
gawk
不能给出任何输出,但是
dir
ls
成功了呢?(完整路径或编号)

更新:更令人困惑的是,
/bin/gawk
失败的消息是相同的,但代码是256;而
/bin/tar
/bin/ping
失败的消息是相同的,但代码是512

更新:好的,这部分很有意义:如果我从命令行运行失败的二进制文件,然后紧接着运行
echo$?
ssh
给出255,
ping
tar
给出2,而
gawk
给出1。这些是我在mod_perl2中得到的缩小版本。所以,似乎任何返回代码不是0的东西都不起作用。可能是输出到STDRR,所以STDUT没有捕获任何东西,因此空白返回。
啊哈,这就是答案——如果您重定向STDERR并在qx中捕获它,将发布。

,如下所示:

die qx(ssh 2>&1);

…您将在命令行上获得输出。所以这并不是说它没有运行,只是它没有向STDOUT写入任何内容。

哇,耐莉。请重新考虑您的应用程序架构。从web脚本启动SSH命令在几个层面上都有问题。例如,您可以考虑从CRON运行SSH命令并将输出写入文件吗?也许SELinux阻止了这一点?@ MikkoLipasti,它是一个Intranet脚本,用于控制远程服务器上的还原。我需要获取可从中还原的备份列表。@SlavenRezic,selinux已完全禁用。