2012-03-02 8 views
2

私はSTDINでパスワードを受け取り、いくつかの異なるチェックを経るbashスクリプトを書いています。BashはSTDINからの読み込み時にシンボルが展開されないようにします

シンボルを含むパスワードを使用すると問題が発生します。

プレーンパスワードgrassyはOKですが、gra$$yのような複雑な組み合わせはgra3308yに拡張されます。

これは私が使用していたスクリプトです:

read INPUT 

if [ $(echo -n $INPUT|wc -m) -ge 6 ] 

then exit 0 
else exit 1 

fi 

私は引用のすべての種類を試してみたが、私は特殊文字の拡大からSTDINパスワードを停止することはできません。

ここでは、これを解決するために何ができるのかについて、元の値を一重引用符で囲まない例を示します。スクリプト内の変数の展開の周り

[email protected] ~ $ echo gra$$| { read INPUT; echo ${INPUT}; } 
gra2598 
+0

これは拡張している標準ではなく、 'echo'を呼び出すシェルです...可能な方法の1つは、一時ファイルとそのファイルを 'shred -u'に保存することです。もう一つは 'eval'と' sed'を卑劣な方法で適用することです... – 0xC0000022L

+0

実際にSTDINから読み込むオリジナルのスクリプトは、STDINで 'gra $$'を入力するとうまく動作しますが、もちろんテストコマンドは '$$'それがINPUT変数で読み込まれる前に。 – anubhava

+0

'-r'を使用しない限り、' read'は入力のバックスラッシュを取ります。 – AmigoNico

答えて

2

二重引用符を使用:

read INPUT 
echo "Password was: $INPUT" 
if [ $(echo -n "$INPUT" | wc -m) -ge 6 ] 
then echo "OK"; exit 0 
else echo "Bogus"; exit 1 
fi 

スクリプトを開発している間、あなたが作業しているかを示すだけでなく、二重引用符を使用するようにechoを使用しています。

このプログラムで行を入力すると、入力した文字に対してシェル展開が行われません。あなたはechoを持つユーザータイピングをシミュレートする場合、あなたはこのように、任意のメタ文字の拡大からechoを実行シェルを防ぐために必要があります。

echo 'gra$$' | bash yourscript 

は、単一引用符を省略すると、シェルはPID(と$$を交換することを意味しますおそらく、パイプラインのシェルではなく、親シェルのPIDですが、PIDはあります)。これは、あなたが実行した後、5つの文字と改行を入力すると異なっている:

bash yourscript 

ます。また、使用することができます

$ cat > password-file 
gra$$ 
<control-D> 
$ cat password-file 
gra$$ 
$ bash yourscript < password-file 

<control-D>がEOF表示です。最後の改行が入力されてから入力されたゼロ文字をすべてフラッシュし、catはゼロバイトをEOFとして解釈します。したがってファイルには、 'g'、 'r'、 'a'、 '$'という2つの記号と改行が6文字含まれています。これはそのままあなたのスクリプトによって読み込まれます。データの拡張はありません。

+0

ありがとうジョナサン、私が何を考えていたかわからない。 +1 – Paulpro

+0

ちょうどそれを与え、それは働いている。私はあなたがエコー拡張について何を意味するかを見て、それは私に多くの混乱を引き起こしています。それを説明する時間をとってくれてありがとう! – David

+0

また、 'set -f'を使っていくつかのコマンドでグロビングを無効にし、再び有効にすることもできます... – 0xC0000022L

関連する問題