リモートシステムにログインしてコマンドを実行するために必要なスクリプトがあります。このスクリプトは、ルートアカウントにパスワードを提供することを除いて動作します。ルートパスワードには、私が働くことができないドル記号が含まれています。ここで私はそのパスワードドル記号が含まれていない資格情報を提供する際に、この作品を確認したコード
#!/usr/bin/expect
set timeout 3
set username "root"
set password "Pas$word"
set hostname [lindex $argv 0]
log_user 0
send_user "\n#####\n# $hostname\n#####\n"
spawn ssh -q -o StrictHostKeyChecking=no [email protected]$hostname
expect {
timeout { send_user "\nFailed to get password prompt\n"; exit 1 }
eof { send_user "\nSSH failure for $hostname\n"; exit 1 }
"*assword"
}
send "$password\r"
expect {
timeout { send_user "\nLogin failed. Password incorrect.\n"; exit 1}
"*\$ "
}
send_user "\nPassword is correct\n"
expect "$ " { send "ls" }
ですが、私はそれがrootアカウントで動作するように取得することはできません。これは常にLogin failed. Password incorrect
タイムアウトエラーを生成します。パスワードの変更はオプションではありません。 ...私が間違ってやっている上の任意のアイデアを
set password "Pas\$word"
をと私は同じ結果を得る:私はそうのようなパスワードの定義で\
エスケープ文字を供給しようとしましたか?
おかげ 私が言ったように
EDIT。私はすでに$文字をエスケープしようとしました。ここで
set password "Pas\$word"
...
send_user "\n#####\n# $hostname\n#####\n"
send_user "Using password: $password\n"
...
コンソール出力されています:
[email protected]:~$ ./ssh_ls.sh 192.168.5.93
#####
# 192.168.5.93
#####
Using password: Pas$word
Login failed. Password incorrect.
しかし、明確にするために、私はここで変更がある...スクリプトは、変数が正しくパスワードが含まれている確認するために、起動パスワードのprint文を追加しました
は、引用符を取り除きます。私の答えをチェックアウトする。 –
私は 'set password {Pas $ word}'で十分だと思います。 'expect -d ssh-ls.sh'でスクリプトを実行すると、バックグラウンドで何が起こっているのかを見ることができます。 –