我试图在bash中使用一个期望脚本来登录路由器,执行命令并将输出存储在文本文件中。

#!/usr/bin/bash
FQDN=$1
LogFile=/tmp/Router_${FQDN}.txt
> $LogFile
expect -d  <<EOF > $LogFile
set timeout 20
set FQDN [lindex $argv 0]
set Username "user"
set Password "***$$$"
spawn ssh $Username@$FQDN
expect "*assword:"
send "$Password\r"
expect "#"
send "some command\r"
expect "#"
send "exit\r"
sleep 1
exit
expect eof
EOF
cat $LogFile

我收到以下错误消息。

system personnel  =\r\r\n= may provide the evidence of such monitoring to law enforcement officials.    =\r\r\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==\r\r\npassword: "
send: sending "\n" to { exp6 }

expect: does "" (spawn_id exp6) match glob pattern "#"? no
password:
Enter old password:

基于该错误,脚本似乎正在敲击{return}键“ \\ r”,该键不会在密码提示时发送。

ssh一旦我没有回报。 不知道我要去哪里错了。


这是我的期望脚本,可以正常工作。 只有当我在bash脚本中对此进行编码时,它才会失败。

#!/usr/bin/expect -f

set timeout 20
set FQDN [lindex $argv 0]
set Username "user"
set Password "***$$$"
spawn ssh -o "StrictHostKeyChecking no" $Username@$FQDN
expect "*assword: "
send "$Password\r"
expect "#"
send "some command\r"
expect "#"
send "exit\r"
sleep 1
exit

-Abhi

#1楼 票数:1 已采纳

在一个here-doc文件中,shell会扩展$Username$Password类的变量,因此它们不会被视为Expect扩展的文字。 由于这些shell变量没有在任何地方设置,因此它们被扩展为空字符串。 结果,它正在执行ssh @$FQDN并发送一个空密码。

您需要转义$以便Expect可以处理它们。

您还不需要在Expect脚本中set FQDN行,因为您正在为此使用shell变量。

#!/usr/bin/bash
FQDN=$1
LogFile=/tmp/Router_${FQDN}.txt
> $LogFile
expect -d  <<EOF > $LogFile
set timeout 20
set Username "user"
set Password "***$$$"
spawn ssh \$Username@$FQDN
expect "*assword:"
send "\$Password\r"
expect "#"
send "some command\r"
expect "#"
send "exit\r"
sleep 1
exit
expect eof
EOF
cat $LogFile

或者您可以将它们设置为shell变量,就像FQDN一样。

#!/usr/bin/bash
FQDN=$1
Username=user
Password="***$$$"
LogFile=/tmp/Router_${FQDN}.txt
> $LogFile
expect -d  <<EOF > $LogFile
set timeout 20
spawn ssh $Username@$FQDN
expect "*assword:"
send "$Password\r"
expect "#"
send "some command\r"
expect "#"
send "exit\r"
sleep 1
exit
expect eof
EOF
cat $LogFile

  ask by Abhinandan Aithal translate from so

未解决问题?本站智能推荐:

4回复

在expect脚本中输入sudo密码

我在bash脚本中有一个期望代码,就像这样 在执行another_script.sh期间,我被提示输入sudo密码,但我不能,因为我很期待。 为了让我能够输入sudo密码并让脚本继续运行,我该怎么办? 我不想在脚本中保存密码然后将其传递给expect,但我希望能够输入密码。
1回复

使用Expect脚本隐藏密码

我使用脚本登录到电源代理,并通过网络连接了ssh。 据我所知,所有其他信息都会被跟踪。 我对此表示同意。 我的问题是如何隐藏密码,如下所示: 我尝试将密码存储在/home/casper/.password ,然后在其上执行chmod 400,然后将其放入{send "/home/ca
1回复

我在使用bash脚本中的Expect为SFTP命令提供密码时如何获取二进制sftp的返回码

我正在尝试在bash脚本中使用Expect提供SFTP密码并输入其他命令。 我试图获取二进制SFTP的返回码。 我的测试脚本:
9回复

在Bash脚本中使用Expect为SSH命令提供密码

我正在尝试在 Bash 脚本中使用 Expect 来提供 SSH 密码。 提供密码有效,但我没有像我应该的那样进入 SSH 会话。 它回到海峡回到 Bash。 我的脚本: 我的脚本的输出: 我想要我的 SSH 会话,并且只有当我退出它时,才能返回到我的 Bash 脚本。 我之所以在 Expect 之
4回复

使用'expect'自动发送密码[重复]

这个问题在这里已经有了答案: 在 Bash 脚本中使用 Expect 为 SSH 命令提供密码(9 个回答) 4年前关闭。 我正在尝试将文件从远程服务器复
3回复

期望通过ssh提示脚本更改密码

目前我有一个bash脚本,在ssh上做一些事情时使用expect。 看起来像: somescript.sh通过ssh对远程服务器执行命令,但现在我的登录需要更改密码。 我试过了 但我得到一个错误说:
2回复

“Expect”命令行脚本连接到VPN并输入密码

我正在尝试编写一个“期望”脚本来连接到 VPN ......尝试编写并期望( https://likegeeks.com/expect-command/ )脚本来连接到 VPN,这是正确的想法: 连接的命令是: 所以期望脚本将是这样的:
1回复

如何使用密码提示在bash脚本中检查路由器的SSH登录状态

我正在运行一项任务,需要检查 400 台远程路由器上的 SSH 登录状态。 我在 bash 中使用 expect 制作了脚本,它通过 SSH 连接远程路由器并在其上运行一些命令。 但是,有些路由器不响应 SSH。 我正在使用 if 语句来避免那些在 SSH 上失败的路由器。 仅当我们没有密码输入或保