私は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
スクリプトで使用されるのはexpect
TCL変数です。これは、シェル変数に関連しないか、残念ながら環境に渡された文字列と重複します(マンenviron(7)
ページを参照)。 TCLでは、変数を介して環境にアクセスできますenv
(tclvars(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
環境は面倒ではありません(おそらく子プロセスに渡され、読み込まれます...)。