Expect in Bash Script Spawn Id exp4 not open 错误

Expect in Bash Script Spawn Id exp4 not open Error

提问人:nkloney 提问时间:10/15/2023 更新时间:10/15/2023 访问量:38

问:

我收到一个错误,我对期望知道为什么会发生这种情况还不够了解send: Spawn id exp4 not open while executing

脚本:

#!/bin/bash

expect_ssh() {
        local ub_serv_ip="192.168.233.132"
        local ssh_username="administrator"
        local ssh_password="Password123!"
        local ub_serv_ip="127.0.0.1"
        local ssh_username="nkloney"

local script=$(expect <<EOF
        spawn ssh $ssh_username@$ub_serv_ip
        expect "*assword:"
        send "$password\r"
        expect "$ "
        send "hostname\r"
        expect "$ "
        set hostname \$expect_out(buffer)
        set hostname [string trim \$hostname]
        send "hostname -i\r"
        expect "$ "
        set ip_address \$expect_out(buffer)
        set ip_address [string trim \$ip_address]
        send "exit\r"
        expect eof
        puts \$hostname
        puts \$ip_address
EOF
)
        local hostname=$(echo "$script" | sed -n '1p')
        local ip_address=$(echo "$script" | sed -n '2p')
        export SERVER_HOSTNAME="$hostname"
        export SERVER_IP_ADDRESS="$ip_address"
}

expect_ssh

echo "Server Hostname: $SERVER_HOSTNAME"
echo "Server IP Address: $SERVER_IP_ADDRESS"

我希望它输出变量,以便我可以在 Bash 脚本中使用它们,但相反,程序需要整整一分钟才能运行,然后输出错误。

Linux Bash SSH 期望

评论

1赞 Charles Duffy 10/15/2023
使用字符串连接将变量替换到代码中通常是一个坏主意。使用带引号的 heredoc 并让您的期望/TCL 代码引用环境以获取传入值,这要好得多;否则,您会遇到安全问题,而不仅仅是特定于值的语法错误。
1赞 Charles Duffy 10/15/2023
无论如何,这里根本没有充分的理由使用期望;你一开始就不需要它。要么做正确的事并使用基于密钥的身份验证,要么通过利用 sshpass 来更好地做错误的事情,而不是尝试使用期望来推出自己的替代方案。
0赞 shellter 10/15/2023
以上都是真的。假设您正在探索,请注意 这是 SO 上的一个标签,但如果您只搜索,它不会返回任何结果。当我搜索时,有一些有用的消息,但有很多误报。也许 stackoverflow.com/questions/48209669/......可以帮忙。否则你将不得不继续寻找。发布一个小时前的修改后的问题的好节目,祝你好运![expect][expect][bash] expect script
1赞 glenn jackman 10/16/2023
“Spawn id not open”通常意味着生成的进程已经退出,但随后您向它发送了一些东西。在开发脚本时,请使用 to 启用详细调试。您将能够查看您的模式是否匹配。expect -d
1赞 Larry 10/24/2023
有趣。当我阅读此代码时,我希望它无限期挂起。您正在扩展 password(一个不存在的变量),而不是 ssh_password。因此,在第一个实例中,只应发送“\r”,导致 ssh 提示您重试,答案中可能没有“$”。除非在不重试的情况下配置服务器,否则 ssh 将退出并显示身份验证失败,并且您的下一次发送会尝试发送到已退出的 ssh 进程,这会导致您收到生成 ID 错误。

答: 暂无答案