スクリプトを実行しており、expect
パスワードに1$
文字があります。シェルは次の文字を見つけて何かに展開し、それをエクスポートしますno such variable
。
この問題を解決する方法はありますか?
答え1
2つの方法があります。すべての特殊文字をバックスラッシュするか、パスワードの周りに中括弧を使用します。
expect1.1> set pass "\$Hunter2"
$Hunter2
expect1.2> set pass {$Hunter2}
$Hunter2
サム! 3つの方法:ファイルからパスワードを読みますthepasswordfile
。この方法の利点は、パスワードがコードにないことです。
#!/usr/bin/env expect
# wrap with catch(n) or try(n) if you don't want an error to abort
# the code...
set fh [open thepasswordfile]
set password [gets $fh]
puts $password
4.標準出力からパスワードを生成するプログラムからパスワードを収集します。
#!/usr/bin/env expect
if {[catch {exec ./getthepassword} results options]} {
puts $results
exit 1
}
puts $results
これは次のようになります。
$ cat fromstdin
#!/usr/bin/env expect
if {[catch {exec ./getthepassword} results options]} {
puts $results
exit 1
}
puts $results
$ cat getthepassword
#!/bin/sh
echo '$Hunter2'
$ chmod +x fromstdin getthepassword
$ ./fromstdin
$Hunter2
$
五!環境でパスワードを読む5つの方法(environ(7)
、、tclvars(n)
)
#!/usr/bin/env expect
set password $env(pass)
puts $password
export pass='$Hunter2'
この実装を呼び出す前に、親プロセスで同等の操作が完了したとします。欠点:環境変数は、パスワードを表示するために権限が必要な場合と必要ない場合があるすべての子プロセスに渡されます。疑わしい場合は、変数を使用またはコピーして変数の設定を解除してください。
#!/usr/bin/env expect
set password $env(pass)
unset env(pass)
...
答え2
$
同様の問題がありましたが、予想されるスクリプトにfileNameを渡したかったのですが、これは私にとって効果的でした。
filePath=$(echo -n $filePath | sed -e 's/\$/\\\$/g')