2

php の exec/passthru/system 関数を介してシェルに対してコマンドを実行しようとすると、コマンドから引用符が削除されるようです。

$str_file = '1323988284_700.csv';
exec("/usr/bin/lftp -e 'set ftp:passive-mode true; set ftp:ssl-protect-data yes; put /web/files/{$str_file}; bye;' -u user,pass ftp://ftp.site.com/uploaddir/");

プロセスのチェックからの出力は次のとおりです

ps faxxx | grep lftp
4486 ?        S      0:00  |       \_ /usr/bin/lftp -e set ftp:passive-mode true; set ftp:ssl-protect-data yes; put /web/files/1323988284_700.csv; bye; -u user,pass ftp://ftp.site.com/uploaddir/

ご覧のとおり、一重引用符なしで実行されているプロセスを示しています。これにより、lftp でエラーが発生します。

これは、プロセスリストに表示されているものをコマンドに入力すると、エラーが発生してlftpシェルに残るためだと思います。

PHPセーフモードはオフです

見積もりの​​ために次のことを試しました

\'
\\'
\\\'
\\\\'
''
'''
''''

アップデート


さらにテストしたときにそれを追加したいと思います..シェルスクリプト(run_ftp.sh)を作成し、それをphp経由で実行すると、run_ftp.shから引用符も削除されます..問題。

SELinux はオフです。Linux/Bash がこれを引き起こす可能性のある他のセキュリティ対策はありますか?

4

5 に答える 5

1

誰かがlftpのマニュアルページを読んだことがありますか?

「オプション」の下に次のように書かれています。

-eコマンドは指定されたコマンドを実行し、終了しません

-cコマンドは、指定されたコマンドを実行して終了します

したがって、-cの代わりに-eを使用しているため、lftpがハングします。

PHPやシェルが引用符を削除することとは何の関係もありません。シェルは常にこれを行います、それはそれがどのように機能するかです。PSからの出力は、コピーアンドペースト可能であることを意図していません。

于 2012-07-11T22:44:11.970 に答える
1

exec()PHPのsystem()コマンドはシェルを介して渡されます。シェルはコマンドラインを解析し、引用符を削除します。ただし、文字列全体を 1 つのパラメーターとして保持し、実際のexecve()システム コールなどにシャベルします。

アプリケーションは、一重引用符で囲まれた文字列を1 つのパラメーターとして受け取ります。ただし、psツールはそれらをそのままリストする場合があります。

ただし、lftpツールが独自の解析を行っている可能性があります (-eフラグはそのように聞こえます)。その場合、2 つのレベルの引用符が役立つ場合があります。

exec("lftp -e '\'multiple; commands; for the lftp thingy\''");
于 2011-12-15T23:16:31.190 に答える
1

PHP 関数proc_openを使用して解決策を見つけました。それはより複雑ですが、私にはうまくいきます。

$command = "lftp -u $USER,$PASSWORD -e 'get /tmp/backup-2012-08-15.zip; bye' sftp://$HOST";

$io = array();            
$p = proc_open($command,
           array(1 => array('pipe', 'w'),
                 2 => array('pipe', 'w')), $io);

/* Read output sent to stdout. */
while (!feof($io[1])) {
    echo "STDOUT: ".fgets($io[1]);
}
/* Read output sent to stderr. */
while (!feof($io[2])) {
    echo "STDERR: ".fgets($io[2]);
}

fclose($io[1]);
fclose($io[2]);
proc_close($p);

このコードは、 PHP SHELLツールに触発されました。PDT: 私の英語でごめんなさい

于 2013-03-13T22:07:51.590 に答える
0

自明のUNIXシェル見積もりチュートリアルがあります。試してみてください。

于 2011-12-15T23:09:38.350 に答える