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」ビットがすべて設定されており (「s」が 1 つある ping を除きますが、以下のエラー コードを参照してください)、たとえば、同一の ACLssh
を持っています。dir
では、なぜ出力を与えるべきssh
であり、失敗しても成功するのでしょうか? (フルパスまたは番号)gawk
dir
ls
更新: さらに厄介な/bin/gawk
ことに、同じメッセージがコード 256 で失敗し、/bin/tar
同様/bin/ping
にコード 512 で失敗します。
更新: OK、この部分は理にかなっています: コマンド ラインから失敗したバイナリを実行し、そのecho $?
直後に実行すると、 ssh
255 が返され、 2が返され、1 が返されます。これらは、mod_perl2 で取得したものの縮小バージョンです。ですので、リターンコードが 0 以外のものは動作しないようです。おそらくSTDERRに出力しているため、STDOUTは何もキャプチャしないため、空白が返されます。ping
tar
gawk
ああ、それが答えです-投稿します。