lin*_*sek 8 authentication ssh bash expect remote-server
我有一个期望脚本,我需要登录到远程系统并执行命令.此脚本适用于向root帐户提供密码的例外.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" }
Run Code Online (Sandbox Code Playgroud)
我在提供密码不包含美元符号的凭据时验证了这一点,但我无法使用root帐户.它总是产生Login failed. Password incorrect超时错误.无法更改密码.我试图\在密码定义中提供转义字符,如下所示:
set password "Pas\$word"
Run Code Online (Sandbox Code Playgroud)
我得到了同样的结果......关于我做错了什么的任何想法?
谢谢
编辑 正如我所说.我已经试图逃避$字符.但为了澄清,我在脚本启动时为密码添加了一个print语句,以验证变量是否正确包含密码...以下是更改:
set password "Pas\$word"
...
send_user "\n#####\n# $hostname\n#####\n"
send_user "Using password: $password\n"
...
Run Code Online (Sandbox Code Playgroud)
这是控制台输出:
njozwiak@ubuntu:~$ ./ssh_ls.sh 192.168.5.93
#####
# 192.168.5.93
#####
Using password: Pas$word
Login failed. Password incorrect.
Run Code Online (Sandbox Code Playgroud)
尝试转义反斜杠,即
Pas$word
Run Code Online (Sandbox Code Playgroud)
变成
Pas\\\$word
Run Code Online (Sandbox Code Playgroud)
这是脚本(即使是 PHP、Python)的一个常见问题,其中一个字符串被转义两次甚至更多次!
我如何在 Bash 脚本中将expect与 SFTP 一起使用的完整示例:
#!/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
Run Code Online (Sandbox Code Playgroud)
我已经找到了一个临时的解决方案。我敢肯定这个问题早就解决了,只是提到我是如何解决我的问题的:
实际密码:
Pas$word
分配给可变密码:
set password {Pas\$word}
在TCL(或代码中的expect)中,将双括号{}中的单词分组会禁用大括号内的替换,因此您的密码将存储为:
Pas\$word
现在,最后,当您通过expect发送密码时,Pas\$word将转换为Pas$word实际密码密码。
但是问题是,如果密码未知,例如,密码位于加密文件中或必须用作用户输入。我一直在寻找这种情况,我不知道密码中的位置和数量。
SSa*_*ker -1
这绝对应该有帮助 -
set username root
set password Pas\$word
Run Code Online (Sandbox Code Playgroud)
去掉引号。
希望这可以帮助。