1

ライブラリをPHP使用して、動的シェル コマンドを SSH 経由でサーバーに渡しています。ssh2私が渡しているコマンドは次のとおりです(これは単なる例であり、コマンドは動的でユーザーが生成したものです)。

$command = 'ls -al
free -m';

改行に注意してください。ユーザーは改行とタブを含む完全な bash スクリプトを入力できるため、これは必須です。次に、次の手順を実行して、ssh2 ライブラリで実行する実際のコマンドを作成します。

$command = str_replace("'", "\'", $command);
$command = 'echo $\'' . $command . '\' | bash';

最終的なコマンドは次のとおりです。

echo $'ls -al
free -m' | bash

上記のコマンドはシェルで直接実行されますが、ssh2 を使用して PHP から実行すると、次のようになります。

ls: invalid option --  
Try `ls --help' for more information.

だから私は、特殊文字がいくつかあるに違いないか、ドル記号がエスケープされていないのではないかと思ったので、次のようにしました。

  print_r(bin2hex($command));

結果は次のとおりです。

 6563686f2024276c73202d616c0d0a66726565202d6d27207c2062617368

ただし、16 進数を ascii に変換すると、正しいコマンドが返されます (上記とまったく同じ)。

何がこれを引き起こしているのでしょうか?

4

1 に答える 1

0

このエラーは、PHP ではなく bash から発生します。

シェルでコマンドを試すと、同じエラーが発生します。

しかし、なぜこのような複雑な方法で bash を実行しているのですか?

代わりに、コマンドとしてproc_open()withを使用bashし、stdin ファイルハンドルでユーザー入力をフィードします。

使用方法の例が必要な場合: https://stackoverflow.com/a/2390755/664364

PS。ユーザーが webserver ユーザーとして任意のコマンドを実行できるようにしていることを理解していただければ幸いです。

于 2012-09-13T01:11:31.253 に答える