期望在 while/for 循环中不采用 ssh 参数

期望在 while/for 循环中不采用 ssh 参数

我正在尝试使用某些命令 获取dmidecode许多主机的远程计算机详细信息() 。expect

下面是expect我用于此目的的脚本。

while read i; do
{
/usr/bin/expect<<EOF
 spawn ssh "root@$i" dmidecode 
 expect "Password:"
 send "xxxx\r";
 interact
 EOF
  }
 done<iplist 

但这里的命令没有在远程计算机上执行。我尝试使用单引号、双引号和插入符号仍然没有成功。

在这里我想执行远程命令作为参数,例如:ssh <ip> <remote command>

请给我一些意见,我可能会错过一些参数,请帮助我

答案1

一种简化是消除有缺陷且缓慢的 shellwhile循环,这也将释放出来stdin用于interact.也就是说,输入文件将被传递给expect脚本中的 TCL 代码并由其读取。

#!/usr/bin/expect

if {[llength $argv] != 1} {
    puts stderr "Usage: $0 iplist-file"
    exit 1
}

set ipfh [open [lindex $argv 0]]

while {[gets $ipfh ip] >= 0} {
    spawn ssh root@$ip dmidecode
    expect "Password:"
    send "Hunter2\r";
    interact
}

答案2

thrig有一个很好的答案。如果您想坚持使用 bash(即使 while-read 循环非常慢,而且要获得正确的语法也很乏味),请使用不同的文件描述符从文件中读取并允许 Expect 保留 stdin:

while IFS= read -r -u3 ip; do
# .................^^^
    /usr/bin/expect << EOF
        spawn ssh "root@$ip" dmidecode 
        expect "Password:"
        send "xxxx\r";
        interact
EOF
done 3< iplist 
# ...^^

如果 dmidecode 命令不需要人工交互,interact则更改为expect eof

相关内容