我正在尝试使用某些命令 获取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