在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
,但我无法弄清楚模式: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
和{{1给出2,tar
给出1.这些是我在mod_perl2中获得的缩小版本。所以,似乎任何返回代码不是0的东西都不起作用。可能它输出到STDERR,因此STDOUT不捕获任何东西,因此空白返回。
啊哈,这就是答案 - 将发布。
答案 0 :(得分:0)
如果您重定向STDERR也会在qx中捕获它,如下所示:
die qx(ssh 2>&1);
...您将获得命令行输出的输出。所以它并不是因为它没有运行,只是因为它没有向STDOUT写任何内容。