Bash - 変数にドル記号が含まれています。

Bash - 変数にドル記号が含まれています。

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ことはここでは問題ではなく、スペースとワイルドカードは問題です。

望むより:

おすすめ記事