在带有 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
,但我无法弄清楚模式: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”位(除了 ping 其一个“s”,但请参见下面的错误代码),例如,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 的任何东西都不起作用。可能它正在输出到 STDERR,因此 STDOUT 不捕获任何内容,因此返回空白。
啊哈,这就是答案——将发布。