bash - 如何在 Expect 脚本中发送带有 $ 符号的密码

标签 bash authentication ssh expect remote-server

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

我在提供其密码不包含美元符号的凭据时验证了它的有效性,但我无法让它与 root 帐户一起使用。它总是产生 Login failed。密码不正确 超时错误。更改密码不是一种选择。我试图在密码定义中提供 \ 转义字符,如下所示:

set password "Pas\$word"

我得到了相同的结果...我做错了什么有什么想法吗?

谢谢

编辑 就像我说的。我已经尝试过转义 $ 字符。但需要澄清的是,我在脚本启动时为密码添加了一条打印语句,以验证变量是否正确包含密码……这里是更改:

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.

最佳答案

尝试转义反斜杠,即

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 $username@$host
expect "password:"
send "Pas\\\$word\r"
expect "sftp>"
send "get data.txt\r"
expect "sftp>"
send "bye\r"
EOF

关于bash - 如何在 Expect 脚本中发送带有 $ 符号的密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17928947/

相关文章:

node.js - I/O 绑定(bind)和 CPU 绑定(bind)

linux - 分区可用空间的排序输出

庆典邮件 : command output in subject

git - 两个github帐户在同一台​​计算机上发生冲突

通过 SSH 代理主机的 git clone 问题

ssh - 从 windows 生成 gitlab ssh key

bash - 对列中的字符进行计数和索引

azure - 如何将 Azure 应用服务访问权限限制为仅特定 Google 用户?

PHP 登录脚本仅适用于 mysql 已知的用户名

ios - 使用内部应用程序凭据而不是用户凭据对 iOS 应用程序进行身份验证