12

リモート システムにログインしてコマンドを実行するために必要なスクリプトが必要です。このスクリプトは、root アカウントにパスワードを提供することを除いて機能します。ルート パスワードにドル記号が含まれているため、うまく機能していないようです。ここにコードがあります

#!/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 $username@$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"

そして、私は同じ結果を得ます...私が間違っていることについてのアイデアはありますか?

ありがとう

編集 私が言ったように。私はすでに $ 文字をエスケープしようとしました。しかし、明確にするために、変数にパスワードが正しく含まれていることを確認するために、スクリプトの起動時にパスワードのprintステートメントを追加しました...変更は次のとおりです。

set password "Pas\$word"
...
send_user "\n#####\n# $hostname\n#####\n"
send_user "Using password: $password\n"
...

コンソール出力は次のとおりです。

njozwiak@ubuntu:~$ ./ssh_ls.sh 192.168.5.93

#####
# 192.168.5.93
#####
Using password: Pas$word

Login failed. Password incorrect.
4

8 に答える 8

7

バックスラッシュをエスケープしてみてください。

Pas$word

になる

Pas\\\$word

これは、文字列が 2 回以上エスケープされないスクリプト (PHP や Python でも) でよくある問題です。

Bashスクリプト内で、SFTPでexpectを使用する方法の本格的な例:

#!/bin/bash
host=mysftp.dmz
port=22
username=john

/usr/bin/expect <<EOF
set timeout -1
spawn sftp -C -oPort=$port $username@$host
expect "password:"
send "Pas\\\$word\r"
expect "sftp>"
send "get data.txt\r"
expect "sftp>"
send "bye\r"
EOF
于 2015-10-27T09:42:41.427 に答える
-1

最近、同様の問題がありました。これは私のために働いた:

$ PASS="pa\$\$word"; somecommand --user uname --password $PASS

二重引用符とセミコロンに注意してください。

于 2013-08-14T22:08:36.257 に答える