パスワードをハッシュ化するシェルスクリプトを作成しております。
パスワードの一文字目がハイフンの場合だとオプションと認識されエラーとなる為、シングルクォーテーションで囲みましたが、実行されるタイミングでシングルクォーテーションが消えてエラーとなります。
回避策がございましたらご教示下さい。
実行したコマンド
eval (command -arg1 -arg2 ’-password‘ )
実行するとシングルクォーテーションが消えて、
command -arg1 -arg2 -password
として実行され、引数3がオプションと誤認識されエラーとなる。
> ご推察の通りredhat製品のコマンドになります。
redhat製であれば、コマンド名を公開したほうが回答がつきやすいと思うのですが、そのコマンドはその会社専用のコマンドですか?
すみません、秘守義務があるため、具体的なコマンドの記述は控えさせて頂いております。
コマンドの仕様がわからないと回答のしようがありませんので質問の体をなしていません。
誠に申し訳ございません。
タグにbashとあるように、bash観点でご回答頂けると助かります。
最初に明確に記載すれば良かったのですが、、、
ですから、bashがコマンドに「どのような」引数を与えなければならないか、が問題ですよね。
ということは、そのコマンドの仕様はどうなのか、がわからないと、答えを導けないのではないですか?
他で回答してますが、
bash -x
で確認すると
シングルクォーテーションが消えるの動作ですので、commandの解釈でなくbashの解釈と認識していた次第です。
前にも書きましたが、
forループで回すと特殊記号があるものはシングルクォーテーションが残り、特殊記号がないものはシングルクォーテーションが消えます。
これはbash -xでデバッグで表示され、確認済みです。
bash ではシングルクオートで囲んだ中の文字は特別な意味を持たないようになります。シングルクオートはそのために「付加」する特別な文字なので、当然に、あなたの表現で言えば「消えます」。
> forループで回すと特殊記号があるものはシングルクォーテーションが残り、特殊記号がないものはシングルクォーテーションが消えます。
ちょっと意味がわかりません。具体例を示してもらえますか。
下記のようなことならシングルクオートは当然出力されません。
for s in aaa -bbb ccc; do eval "(echo '${s}')"; done
ご回答ありがとうございます。
例題に挙げて頂いた処理の流れとほぼ同じ処理をしております。
私も多少の経験はございますので、シングルクォーテーションの挙動にいては多少の知見がございますが、消えるというのは、デバッグ表示上で
command -arg1 -arg2 ’password‘
と表示され実行されるものと
command -arg1 -arg2 password
と、シングルクォーテーションが消えて表示されるものがあるという意味です。
その差異を見るに変数に代入したパスワードに特殊記号が含まれていたものは、シングルクォーテーションは残り、特殊記号が含まれてないものは消えてコマンドを実行しているようにデバッグ上に表示されておりました。
質問の目的は、コマンドに対して、-から始まる引数をオプションと解釈されないような形にして渡すことなのではないですか?
コマンドにとって「オプションと解釈されないような形」とはどういう形なのかが不明なため、その目的に対する回答がつかない状態となっています。
-x オプションの挙動に不審な点があるので、知識として知りたい、ということなら質問の仕方が違うかと。
そして、その不審な挙動を再現できるコードを示してください。
それは command の守秘義務などは関係ないはずです。
ご回答ありがとうございます。
AWSにインスタンスを立てて類似検証を実施いたしました。
test.sh
=====================
#!/bin/bash
for line in `cat password.txt`
do
eval "(echo '${line}')"
done
=====================
# bash -x test.sh
++ cat password.txt
+ for line in `cat password.txt`
+ eval '(echo '\''h5yu|*,aid'\'')'
++ echo 'h5yu|*,aid'
h5yu|*,aid
+ for line in `cat password.txt`
+ eval '(echo '\''ZrLjvRpM.4'\'')'
++ echo ZrLjvRpM.4
ZrLjvRpM.4
+ for line in `cat password.txt`
+ eval '(echo '\''TjE8EYCPC$'\'')'
++ echo 'TjE8EYCPC$'
TjE8EYCPC$
+ for line in `cat password.txt`
+ eval '(echo '\''fjXvm,N8Tj'\'')'
++ echo fjXvm,N8Tj
fjXvm,N8Tj
+ for line in `cat password.txt`
+ eval '(echo '\''UN%Gp,*8Gi'\'')'
++ echo 'UN%Gp,*8Gi'
UN%Gp,*8Gi
+ for line in `cat password.txt`
+ eval '(echo '\''D)439HNK3!'\'')'
++ echo 'D)439HNK3!'
D)439HNK3!
+ for line in `cat password.txt`
+ eval '(echo '\''Th3r|gtHy3'\'')'
++ echo 'Th3r|gtHy3'
Th3r|gtHy3
+ for line in `cat password.txt`
+ eval '(echo '\''#3n+Jm3BXD'\'')'
++ echo '#3n+Jm3BXD'
#3n+Jm3BXD
+ for line in `cat password.txt`
+ eval '(echo '\''~9tUj3,b&_'\'')'
++ echo '~9tUj3,b&_'
~9tUj3,b&_
+ for line in `cat password.txt`
+ eval '(echo '\''7.9%CRx6(-'\'')'
++ echo '7.9%CRx6(-'
7.9%CRx6(-
+ for line in `cat password.txt`
+ eval '(echo '\''bni7Z~z!Fn'\'')'
++ echo 'bni7Z~z!Fn'
bni7Z~z!Fn
+ for line in `cat password.txt`
+ eval '(echo '\''*Qy,P4e8|P'\'')'
++ echo '*Qy,P4e8|P'
*Qy,P4e8|P
+ for line in `cat password.txt`
+ eval '(echo '\''-BcA5Kwr#E'\'')'
++ echo -BcA5Kwr#E
-BcA5Kwr#E
+ for line in `cat password.txt`
+ eval '(echo '\''33Sm*x|,Y|'\'')'
++ echo '33Sm*x|,Y|'
33Sm*x|,Y|
+ for line in `cat password.txt`
+ eval '(echo '\''*nWa7NPXsS'\'')'
++ echo '*nWa7NPXsS'
*nWa7NPXsS
+ for line in `cat password.txt`
+ eval '(echo '\''TEDLP~2)Ri'\'')'
++ echo 'TEDLP~2)Ri'
TEDLP~2)Ri
+ for line in `cat password.txt`
+ eval '(echo '\''KVvA/j*9.T'\'')'
++ echo 'KVvA/j*9.T'
KVvA/j*9.T
+ for line in `cat password.txt`
+ eval '(echo '\''Gb67B)Uk3z'\'')'
++ echo 'Gb67B)Uk3z'
Gb67B)Uk3z
+ for line in `cat password.txt`
+ eval '(echo '\''.EH8xiAt+6'\'')'
++ echo .EH8xiAt+6
.EH8xiAt+6
+ for line in `cat password.txt`
+ eval '(echo '\''4Y$QAx|7hT'\'')'
++ echo '4Y$QAx|7hT'
4Y$QAx|7hT
上記のような出力結果となりました。
++ echo 'TEDLP~2)Ri'
のようにシングルクォーテーションが表示されているものもございますが、
++ echo .EH8xiAt+6
のようにシングルクォーテーションが表示されないものがあります。
上記において、これをハッシュ化のパスワードに流し込んだ場合にシングルクォーテーションが消えるパターンで最初の一文字目がハイフン(-)だとオプションと誤認識されエラーとなる処理です。
正直に言いますと、最初の一文字目がハイフンの場合はエラー処理に流す処理内容にしておりますので、
運用回避で対応する予定ですが、この辺を例外なく全てできたほうが気分的に良いので、あれば対処したいというレベルです。
それは単に bash -x の表示の仕方が違うだけの話です。
bash -xc "echo 'aaa'"
+ echo aaa
bash が echo に渡す引数は aaa です。なので -x による表示は echo aaa となっています。
bash -xc "echo 'a|a'"
+ echo 'a|a'
bash が echo に渡す引数は a|a です。ここにシェルにとって特別な文字が含まれているので -x による表示では敢えて echo 'a|a' と表示されています。
ちなみに
bash -xc 'echo "a|a"'
+ echo 'a|a'
ダブルクォートで囲っていたとしてもシングルクオートで表示されます。
以上のように、「シングルクオートが消える」というのは -x の表示の話であって、コマンドに渡す引数がどうなるかはまた別の話。
一文字目が - だとオプションだと解釈されてエラーになるのをどう回避するかというのはまったく別の問題ですね。
正直、なぜ別問題との結論となるのか理解しづらいですね。
また、bash -xcではコマンドの展開レベルがことなるので、意味をなしていないと思われます。
実際にハッシュ化するコマンドの引数として指定していた場合、先に示した表示結果で渡されたと考えられる挙動があります。
例えばですが、ハッシュ化コマンドに流す引数に特殊記号が含まれたいた場合、パスワードの代入された引数が特殊記号を解釈し中折れして中途半端な文字数をハッシュ化しますが、先の表示できちんとシングルクォーテーションが表示されていた場合は正常にハッシュ化がされます。
例
+ eval '(echo Gb67B)Uk3z )'
test.sh: eval: line 4: syntax error near unexpected token `Uk3z'
引数内の")"で最初の"("の対と解釈され中折してます。
しかし、先の表示例においては
+ eval '(echo '\''Gb67B)Uk3z'\'')'
++ echo 'Gb67B)Uk3z'
Gb67B)Uk3z
とシングルクォーテーションが表示、且つ効いて正常に変数内の値を展開できています。
その為、私は『++ echo 'Gb67B)Uk3z'』で表示された結果がそのままコマンド行として解釈していると考えております。
そして、ハイフン(-)の場合では
+ eval '(echo '\''-BcA5Kwr#E'\'')'
++ echo -BcA5Kwr#E
-BcA5Kwr#E
とシングルクォーテーションが表示されていない場合があるため、オプションとして解釈されエラーとなる認識です。
-x の表示結果がそのまま引数になっているわけではないということは私が示した通りです。
それは理解できますか?
++ echo 'Gb67B)Uk3z'
Gb67B)Uk3z
これはコマンドに対して Gb67B)Uk3z という引数を渡しています。
-x による表示にシングルクオートが付け足されているのは、この文字列の中に ) があるからです。
それだけのことです。
それも理解できますか?
さて、あなたはコマンドに何を渡したいのですか?
問題はそこではないのですか?
-x による表示にシングルクオートが付いているかどうかとエラーとの間に関係が無いのにあると思い込んで問題の本質を見誤っているように思います。
あのー。
変に小難しくする必要ないと思うのですが。
渡したい文字列にシングルクォーテーションがその中身を渡し、
シングルクォーテーションで囲まれてないものもその文字列を渡しますが、
特殊記号が含まれている場合はシングルクォーテーションで囲む表示していた場合は、bashが何を渡すべきか解釈して値を正確に渡してます。
シングルクォーテーションのあるなしでどの値を正確に渡しているかわかると思うのですが。。。
それで、今回の問題は特殊記号を含まずに一文字目がハイフンの場合にbashが渡した値は正しいが、コマンドはオプションとして解釈してエラーとなる。
ただし、手動で入力しシングルクォーテーションで囲んでいた場合においても、コマンドはシングルクォーテーションの中身を文字列と正しく認識するためとおる。
この手動と同じ状況をうまく作れないか?
ということですね。
小難しくしているのはあなたのほうかと。
では聞きます。
-aaa をオプションと解釈されないようにするには Command にどう渡せばよいのですか?
そもそもそういう問題なのでは?
これは何度もお伺いしているのに、そこは一向に答えられませんよね。
こんなの守秘義務は関係ないと思いますが。
そのまま -aaa を渡したらオプション引数と解釈されてエラーになるわけでしょう?
ではどう渡せばよいのですか?
その当たり前のことを論点にするのは控えて頂けないですか?
何を渡しているかわからなかったら、ハッシュ化したパスワードを登録した後にそのパスワードでログイン出来ないですわね。
なぜ問題を解決するための私の簡単な質問に答えずに文句ばかりおっしゃるのですか?
あなたからの情報で私が答えられることはすべて答えました。
納得できないならそれまでです。
がんばってください。
回答3件
あなたの回答
tips
プレビュー