bash - 期待新线

标签 bash ssh expect

我正在尝试制作一个 bash/expect 脚本以通过 ssh 连接到 APC PDU(配电盘)并根据命令行参数远程重启 socket ​​。到目前为止我有这个:

#!/usr/bin/expect

#usage: pdu.sh user pass ipaddr outletNum

set user [lrange $argv 0 0]
set pass [lrange $argv 1 1]
set ipaddr [lrange $argv 2 2]
set outlet [lrange $argv 3 3]

spawn ssh $user@$ipaddr

sleep 60

expect "*?assword*"
send "$pass\n"
expect ">"

sleep 5

send "1\n"
expect ">"
send "2\n"
expect ">"
send "1\n"
expect ">"

send "$outlet\n"
expect ">"
send "1\n"
expect ">"
send "2\n"
send "yes\n"
expect ">"
send "1\n"
send "yes\n"

send "exit\n"

所以 SSH 的生成工作正常,它正确输入了密码,但是在我连接到 PDU 之后,它显示了选项界面,我的脚本发送了 12 而不是 1(输入)2。抱歉如果那令人困惑。这是它的作用:

它显示 12 而不是 1,然后是换行符,然后是 2。我特别让它在这一行的 1 之后发送换行符 send "1\n"

为什么\n 在此示例中不起作用?谢谢!

最佳答案

期望使用\r(回车)而不是\n(UNIX 新行)。 您还可以通过以下方式稍微简化您的期望脚本:

expect {
 ">" {send "1\r"; exp_continue}
 # Next expect token and response and so on 
} 

关于bash - 期待新线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36989343/

相关文章:

python - 使用附加参数在本地执行远程 python 脚本

linux - 如何使用脚本在远程服务器上设置 `sudo su postgres`

python - SSH 关闭时保持 Django runserver 事件

ssh - 无法在代理计算机上使用sudo获取SSH ProxyCommand

java - 强制 read() 方法读取最少字符数

macos - 如果有一个冒号( :) in the directory name, 我怎么能把它添加到 $PATH?

bash - 将我的容器入门文件翻译为docker-compose.yml

linux - 将两个 Excel 文件合并为具有共同标题的第三个文件

linux - 为什么超时在这个期望脚本中不起作用?

bash - 通过SSH使用rsync和spawn上传