bashスクリプトに変数を渡すPHPスクリプトがあります。
exec("bash.sh $path")
Bashスクリプトは次のとおりです。
#!/bin/bash
path=$1
echo $path
パスが次のようにドル記号で終わる場合:myfile.$$$
出力は次のとおりですmyfile.32577$
エコーが正確であるように、変数からドルをエスケープする方法は?
ベストアンサー1
PHPはexec()
シェルを介してコマンドを実行するため、スクリプトが実行される前でもコマンドラインを処理するシェルがあります。$$
シェルのプロセスIDは特殊変数ですが、変数であるように見える他の項目については同じ変数を取得します。
これPHPマニュアルexec
シェルで処理されるコマンドまたは引数を引用するように明示的に通知します。
警告する
ユーザー提供のデータがこの関数に渡されることを許可する場合は、次のようにします。escapeshellarg()またはescapeshellcmd()ユーザーがシステムをだまして任意のコマンドを実行できるようにしないことを確認します。
コマンドを直接実行できるsystem()
/othersバージョン(Perlの/マルチ引数バージョンなど)が見つからないため、唯一のオプションは次のようにすることです。exec()
system()
exec()
escapeshellarg()
。パラメータを一重引用符で囲み、一重引用符を処理します。
$ php -r '$foo="$$$"; system("/bin/echo $foo");'
21836$
$ php -r '$foo="$$$"; system("/bin/echo " . escapeshellarg($foo));'
$$$
(これを使用escapeshellcmd()
してスクリプト全体を引用できますが、これが必要な状況は避けたいです。シェル言語は、一部のあいまいな状況では引用が失敗するほど複雑です。)
また、Kusalalanandaが述べたように(通常どおり)Bashスクリプトで変数を参照したいと思います。したがって、.ドル記号のecho "$path"
代わりに使用するecho $path
ことはここでは問題ではなく、スペースとワイルドカードは問題です。
望むより:
- 噴射 Gregのwikiから
- いつ二重引用符が必要ですか?