2013-07-29 106 views
5

我有一个期望脚本,需要登录到远程系统并执行命令。这个脚本除了向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 [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" 

我也得到了相同的结果...什么我做错了任何想法?

感谢

编辑 正如我所说的。我已经试图逃避$角色。但要澄清,我添加脚本时启动,以验证正确的变量包含口令的密码打印语句......下面是变化:

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. 
+0

摆脱随时随地可以使用一组引号的。检查我的答案。 –

+0

我想'set password {Pas $ word}'应该就足够了。用'expect -d ssh-ls.sh'运行你的脚本来查看后台发生了什么。 –

回答

-1

这绝对应该帮助 -

set username root 
set password Pas\$word 

摆脱报价。

希望这会有所帮助。

+0

没有引号产生与引号相同的结果。登录失败。密码不正确。“ – linsek

+0

请注意,如果没有引号,密码在控制台输出中显示的内容与引号相同。 “使用密码:Pas $字” – linsek

+0

@njozwiak - 怎么样设置用户名根?你有没有摆脱那里的报价? –

-1

我最近有类似的问题。这对我有效:

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

注意双引号和分号。

+0

1)您的解决方案是'pa $$ word',而不是'pas $ word',并且 2)使用_expect_您需要将字符串两次转义:'pas \\\ $ word' –

3

我无法通过摆脱美元符号来获得此工作。通过使用\ x来指定美元符号的十六进制值,我的确有幸运。

设置密码 “PAS \ x24word”

2

尝试逃离反斜杠,那就是

Pas$word 

成为

Pas\\\$word 

这是脚本(即使PHP,Python中的常见问题)一个字符串获得两次甚至更多次的转义!

一个完全成熟的例子,我如何使用expect与SFTP,一个bash脚本里面:

#!/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

我有一个类似的问题,我想通过文件名与“$” expect脚本,并按照我

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

工作,我已经找到了这个临时的解决方案。我敢肯定,这个问题早已解决,只是提我是如何解决矿山:

实际密码:
Pas$word

分配到可变密码:
set password {Pas\$word}

在TCL(或希望您的代码),将大括号内的单词分组{}禁用大括号内的替换,因此您的密码将被存储为: Pas\$word
现在最后,当您通过期望发送密码Pas\$word将被翻译为Pas$word这是实际的密码。

但问题是如果密码是未知的,例如,密码是在加密文件中或必须被视为用户输入。我正在寻找这种类型的案件,我不知道密码中有多少美元唱歌。

0

下面我用它为我工作:

send \"Pas\\\$word\"

相关问题