1

cygwin と sshd が正常に動作するようになりました。また、パテを使用する場合はまったく問題ありません。複数のコマンドに対しても期待どおりに応答します。しかし、phpseclib を使用すると、最初のコマンドに対してのみ応答が返されます。後続のコマンドは空白の応答を返しています。これは私が実行しようとしているスクリプトです -

<?php
include('Net/SSH2.php');
define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX);
$host = "XXXX";
$username = "XXXX"; 
$password = "XXXX"; 
$ssh = new Net_SSH2($host);
if (!$ssh->login($username, $password)) {
    exit('Login Failed');
}
echo $ssh->exec('nproc');
echo $ssh->exec('nproc');
echo $ssh->getLog();
?>

ただし、新しい ssh オブジェクトを作成すると、応答が返されます。しかし、2 番目の実行要求に同じオブジェクトを使用することはできません。ターゲットが centos マシンの場合、これは正常に機能しています。

そして、これはphpseclibのログ出力です - http://pastebin.com/ff3sfux7

4

2 に答える 2

1

それは変だ。FWIW phpseclib の問題ではなく、サーバーの問題のようです。ログを見ると、2 つの<- NET_SSH2_MSG_CHANNEL_EOFパケットが表示されます。nproc の応答は最初の応答の直前 ( <- NET_SSH2_MSG_CHANNEL_DATA) ですが、2 番目の応答には同様の応答はありません。

nproc リクエストを行うたびに、サーバーは最終的に終了ステータス SSH_MSG_CHANNEL_REQUESTを送信します。ログファイルの最初のものは次のとおりです。

<- NET_SSH2_MSG_CHANNEL_REQUEST (since last: 0.0839, network: 0.0838s)
00000000  00:00:00:00:00:00:00:0b:65:78:69:74:2d:73:74:61  ........exit-sta
00000010  74:75:73:00:00:00:00:00                          tus.....

これがログファイルの2番目のものです

<- NET_SSH2_MSG_CHANNEL_REQUEST (since last: 0.0461, network: 0.046s)
00000000  00:00:00:00:00:00:00:0b:65:78:69:74:2d:73:74:61  ........exit-sta
00000010  74:75:73:00:00:00:00:ff                          tus.....

最後のバイトが最初のもの (良いもの) の 00 と 2 番目のもの (悪いもの) の ff であることを除けば、どちらもほとんど同じです。終了ステータスの SSH_MSG_CHANNEL_REQUEST パケットの詳細は次のとおりです。

  byte      SSH_MSG_CHANNEL_REQUEST
  uint32    recipient channel
  string    "exit-status"
  boolean   FALSE
  uint32    exit_status

したがって、基本的に最後の 4 バイトは、255 の uint32 exit_status を表します。

ウィキペディアの終了ステータスに関する記事「終了ステータスは 0 から 255 の間である」を引用します。また、

シェルの目的のために、ゼロの終了ステータスで終了するコマンドは成功しました。ゼロ以外の終了ステータスは失敗を示します。

そのため、2 番目のコマンドを実行したときに、Linux ボックスで何らかのエラーが発生しました。

stderr( SSH_MSG_CHANNEL_EXTENDED_DATA) にも何も出力されていないので、何が起こっているのかわかりません。

http://tldp.org/LDP/abs/html/exitcodes.htmlによると、255 終了ステータスは「終了ステータスが範囲外」を意味します。すなわち。exit -1nproc はまたはを実行しようとしましたexit 256。いずれにしても、nproc のバグか何かである可能性があります。システム上のすべてが最新であることを確認してみてください。

于 2015-02-01T01:48:32.573 に答える