#!/usr/bin/expect -f の変数から送信される

#!/usr/bin/expect -f の変数から送信される

私はoverthewire.org/wargames/bandit1をプレイしています。 bandit0からパスワードreadmeを受け取りましたが、bandit 1にsshに接続するために32文字のパスワードを入力したくありません。パスワードを自動で渡したいです。

パスワードファイルをダウンロードし、nanoを使用して文字列の先頭に "pass ="を追加しました。それからそれから次のようにすることができます。

root@system:~/# source /root/Downloads/readme; export pass; echo $pass
<passwordText>

次に、ここで質問された別の質問(回答2)に基づいてこのスクリプトを作成しました。https://stackoverflow.com/questions/16928004/how-to-enter-ssh-password-using-bash)

#!/usr/bin/expect -f
spawn ssh [email protected] -p 2220 -l bandit1
expect "assword:"
send $pass
interact

その後、スクリプトファイルを保存してchmod u + xして実行します。出力には変数を読み取れないと表示されます。

password: can't read "pass": no such variable
while executing
"send $pass"
(file "./bandit1" line 4)

スクリプトが変数のパスワードを正しくエコーするので、ヘッダーに関連していることがわかります。

#!/usr/bin/env bash
export pass=""
source /root/Downloads/readme
export pass
echo $pass

しかし、bashスクリプトヘッダーに関する具体的な情報が見つかりません。誰かが私がこれを明確にするのを助けることができますか?

答え1

$passスクリプトで使用されるのはexpectTCL変数です。これは、シェル変数に関連しないか、残念ながら環境に渡された文字列と重複します(マンenviron(7)ページを参照)。 TCLでは、変数を介して環境にアクセスできますenvtclvars(n)マンページを参照)。だから、

$ cat envtest
#!/usr/bin/env expect
puts $env(pass)
set pass $env(pass)
puts $pass
$ chmod +x envtest
$ export pass=Hunter2
$ ./envtest
Hunter2
Hunter2
$ 

したがって、expectコードは次のように書くことができます。

#!/usr/bin/expect -f
spawn ssh [email protected] -p 2220 -l bandit1
expect "assword:"
send $env(pass)
interact

pass環境文字列への直接アクセス(冗長環境変数の生成を防ぐ方法はあまりありません。

しかもパスワードを処理するさまざまな方法expect環境は面倒ではありません(おそらく子プロセスに渡され、読み込まれます...)。

関連情報