私は次のスクリプトを使用します
#!/bin/bash
echo 'Please enter the password of your XXXX:'
read -sp 'Password:' password
screen -dm bash -c ' BLABLA '
問題は、BLABLAのコマンドにパラメータパスワード($password
)が含まれていて、$password
引用符内に渡されないことです。''
画面で条件文を実行するには引用符が必要です... ' if ... then ...; fi
'
ベスト、V
答え1
$password
パラメータをに正しく渡すにはbash -c
、
screen -dm bash -c 'if [ "$1" = "somestring" ]; then echo ok; fi' bash "$password"
指示:
シェルオプションのオプション引数は、単一引用符で囲まれた
-c
文字列でなければなりません。そうでない場合、変数を挿入するとコード挿入の脆弱性が発生します。オプションではない最初のパラメータはランダムな文字列です
bash
。これはスクリプト$0
内に提供される値でbash -c
あり、シェルによって生成されたすべてのエラーメッセージに使用されます。通常、シェルの名前はこの文字列として使用されます。$1
残りのパラメータは、場所パラメータのリスト(inなど)に配置されます。$2
この場合、引用されたパスワード文字列である1つのパラメータを渡します。これはスクリプト$1
内で終わりますbash -c
。
この質問に対するStéphaneのコメントに注意してください。コマンドラインからパスワードを渡すことは本質的に安全ではありません。これは、コマンドの引数がプロセスリストに表示され、場合によっては監査ログとシェル履歴ファイルに保存される可能性があるためです。資格情報は時々制限付きのファイルに保存され、で利用できますbash -c
。私は知りません。正確に私はあなたがしたいことのための有用な例を示すことができません。
また、ランダムな文字列を正しく読み取るには、変数のIFS
値が空の文字列である必要があります。それ以外の場合、入力から一部の空白文字が削除されます。また、バックスラッシュ文字を正しく入力できるようにする必要がありますread -r
。
IFS= read -s -p 'password: ' -r password
使用するイニシャルは、echo
ユーザーにヒントを与えるために標準エラーストリームに書き込む必要があります。
echo 'Please enter the password of your XXXX:' >&2