0

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ではありませんが、パターンがわかりません: gawktar、およびpingも機能しません。それでも、、、dfそしてlsすべてそうですdirpwdしかし:

$ 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であり、失敗しても成功するのでしょうか? (フルパスまたは番号)gawkdirls

更新: さらに厄介な/bin/gawkことに、同じメッセージがコード 256 で失敗し、/bin/tar同様/bin/pingにコード 512 で失敗します。

更新: OK、この部分は理にかなっています: コマンド ラインから失敗したバイナリを実行し、そのecho $?直後に実行すると、 ssh255 が返され、 2が返され、1 が返されます。これらは、mod_perl2 で取得したものの縮小バージョンです。ですので、リターンコードが 0 以外のものは動作しないようです。おそらくSTDERRに出力しているため、STDOUTは何もキャプチャしないため、空白が返されます。pingtargawk

ああ、それが答えです-投稿します。

4

1 に答える 1

0

次のように、STDERR をリダイレクトして qx にもキャプチャする場合:

die qx(ssh 2>&1);

...コマンドラインで得られる出力が得られます。したがって、実行されていないわけではなく、STDOUT に何も書き込まれていないだけです。

于 2013-10-25T13:55:48.290 に答える