質問

問題があります ssh_exec() 「CD」コマンドの実行を拒否します。

サーバーに直接ログインしてコマンドを実行すると、正常に動作するため、コマンドに問題があるとは思いません。

私のコードは次のとおりです。

$str = ssh2_exec($sshStream, 'cp /var/www/compressed.tar.gz /var/www/vhosts/demo-domain1.com/httpdocs/');
$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR);
stream_set_blocking($str, true);
stream_set_blocking($errstr, true);
echo "Output: " . stream_get_contents($str);
echo "Error: " . stream_get_contents($errstr);

$str = ssh2_exec($sshStream, 'cd /var/www/vhosts/demo-domain1.com/httpdocs/');
$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR);
stream_set_blocking($str, true);
stream_set_blocking($errstr, true);
echo "Output: " . stream_get_contents($str);
echo "Error: " . stream_get_contents($errstr);

$str = ssh2_exec($sshStream, 'tar xzf c-class.tar.gz');
$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR);
stream_set_blocking($str, true);
stream_set_blocking($errstr, true);
echo "Output: " . stream_get_contents($str);
echo "Error: " . stream_get_contents($errstr);

ルートとしてログインしています。

最初のコマンドは正しく実行され、ファイルを場所にコピーします。 2番目のコマンドは実行されませんが、エラーは出力されません。 3番目のコマンドにはエラーが表示されます(明らかに、以前のCDコマンドが機能しないため)。

「PWD」を実行すると、ルートディレクトルにあると言って戻ってきたため、監督が変更されていないことを知っています。

前述のように、シェルからコマンドを実行した場合、それらは正常に実行されるため、構文が正しいと確信しています。

これは、CentosとPlesk 9を実行している1と1が提供する専用サーバーです。

役に立ちましたか?

解決

実行する ssh2_exec() PHPは、aを実行するプロセスを開始します ssh リモートサーバーで実行されます。

作成されたシェルプロセスには、現在の作業ディレクトリを含む独自の環境があります。
cd コマンドは、の作業ディレクトリを変更します shell それはあなたの2番目のコマンドによって開始されました。

その2番目のコマンドが終了すると、シェルはそれで死にます。作業監督情報とともに。

言い換えれば、コマンド n シェル環境はコマンドの実行中に記憶されません n+1.

環境の観点から互いに依存している間にシェルコマンドを動作させたい場合は、ユニークにいくつかのコマンドを入れる必要があります ssh2_exec お気に入り

 $str = ssh2_exec($sshStream, 'cd /var/www/vhosts/demo-domain1.com/httpdocs/;'
                            . 'tar xzf c-class.tar.gz');

 $errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR);
 stream_set_blocking($str, true);
 stream_set_blocking($errstr, true);
 echo "Output: " . stream_get_contents($str);
 echo "Error: " . stream_get_contents($errstr);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top