2013-07-29 23 views
5

リモートシステムにログインしてコマンドを実行するために必要なスクリプトがあります。このスクリプトは、ルートアカウントにパスワードを提供することを除いて動作します。ルートパスワードには、私が働くことができないドル記号が含まれています。ここで私はそのパスワードドル記号が含まれていない資格情報を提供する際に、この作品を確認したコード

#!/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文を追加しました
+0

は、引用符を取り除きます。私の答えをチェックアウトする。 –

+0

私は 'set password {Pas $ word}'で十分だと思います。 'expect -d ssh-ls.sh'でスクリプトを実行すると、バックグラウンドで何が起こっているのかを見ることができます。 –

答えて

-1

これは間違いなく役立つはず -

set username root 
set password Pas\$word 

を引用符を取り除きます。

希望します。

+0

引用符は引用符と同じ結果を生成しません。 'ログインに失敗しました。パスワードは正しくありません。 – linsek

+0

引用符を付けないと、パスワードはコンソール出力と同じように引用符で表示されます。 "パスワードを使う:Pas $ word" – linsek

+0

@njozwiak - ユーザ名を設定するのはどうですか?引用符も削除しましたか? –

-1

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

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

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

+0

1)あなたの解答は 'pa $ word'ではなく' pas $ word'で、 2)_expect_で 'pas \\\ $ word'という文字列を2回エスケープする必要があります。 –

3

ドル記号をエスケープするだけでは、この作業を行うことができませんでした。 \ xを使用してドル記号の16進値を指定すると運が良かったです。

セットパスワード "パの\のx24word"

2

は、バックスラッシュをエスケープしてみ、それが

Pas$word 

であること。これは、スクリプトで(でもPHP、Pythonの持つ共通の問題である

Pas\\\$word 

なり)ここで、文字列は2回以上アンエスケープされます。

私はbashスクリプト内で、SFTPでexpectを使用する方法を本格例:私は同じ問題を持っていたので、私はこの質問を見つけた

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

/usr/bin/expect <<EOF 
set timeout -1 
spawn sftp -C -oPort=$port [email protected]$host 
expect "password:" 
send "Pas\\\$word\r" 
expect "sftp>" 
send "get data.txt\r" 
expect "sftp>" 
send "bye\r" 
EOF 
0

、私はそれが古い質問ですが、誰のために知っています

set CorrectedPassword [ string map -nocase { "\$" "\\\$" } $MyPassword ] 

$ CorrectedPasswordはログイン手順で受け入れられます。 -nocaseは必要ありませんが、デフォルトでインクルードする方が安全です。

0

私はこのためのその場しのぎの解決策を見つけた「$」でスクリプトを期待して、私

filePath=$(echo -n $filePath | sed -e 's/\$/\\\$/g') 
2

のために働いていた以下のファイル名を渡したい、同様の問題がありました。私はこの問題はちょうど私が鉱山を解決する方法に言及、ずっと前に解決確信している:

実際のパスワード:TCLで
set password {Pas\$word}

(またはあなたに期待:
Pas$word

割り当て変数パスワードに括弧内の単語をグループ化すると、中括弧内の置換が無効になるため、パスワードは次のように格納されます。 Pas\$word
最後に、Pas\$wordは実際のパスワードであるPas$wordと解釈されます。

しかし、問題は、パスワードが不明な場合です。たとえば、パスワードが暗号化されたファイル内にあるか、ユーザー入力として取得する必要がある場合などです。私はパスワードのどこに何個の$ singsがあるのか​​わからないこのタイプのケースを探していました。

0

私は以下で使用し、それが私の仕事:あなたがセットを使用しているところはどこでも

send \"Pas\\\$word\"

関連する問題