这是我在following bash脚本中使用的代码段:
for user_input in `awk '{print}' testfile_$$.txt`
do
ipaddress=`echo $user_input | cut -d';' -f 1`
command="${config_mode}`echo $user_input | cut -d';' -f 2-`"
ping -w 1 $ipaddress 1> /dev/null 2> $ERR_LOG_FILE 1> $LOG_FILE
if [ $? -eq 0 ];then
ssh "$USERNAME@$ipaddress" "$command"
>> $LOG_FILE
fi
done
如何使用expect在此脚本中自动执行ssh登录。
我很期待并且开始测试它(它失败了):
#!/usr/bin/bash
set force_conservative 0 ;# set to 1 to force conservative mode even if
;# script wasn't run conservatively originally
if {$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} {
sleep .1
exp_send -s -- $arg
}
}
#
set timeout -1
spawn ssh auto21@10.38.227.229 {uname -a; df -h}
match_max 100000
expect "*?assword: "
send -- "bar01\r"
expect eof
我是否需要在expect脚本中再次编写bash脚本,或者它可以在bash脚本中使用 如果可以的话:
更多我需要获取bash变量 $ command , $ username , $ password , $ ipaddress 并在期望部分使用它
你会建议什么解决方案? 要么 我可以创建一个expect脚本并从bash脚本调用它只是为了登录,错误处理,执行,日志文件
答案 0 :(得分:7)
你需要运行两个单独的脚本,一个调用expect脚本的shell脚本
#!/usr/bin/bash
set force_conservative 0 ;
更改为
#!/usr/bin/expect
set force_conservative 0 ;
或者在你的shell脚本中我不确定格式,但你可以发送expect -c with command来执行:
expect -c "send \"hello\n\"" -c "expect \"#\""
expect -c "send \"hello\n\"; expect \"#\""
实际上还有另外一种选择
#!/bin/bash
echo "shell script"
/usr/bin/expect<<EOF
set force_conservative 0 ;# set to 1 to force conservative mode even if
;# script wasn't run conservatively originally
if {$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} {
sleep .1
exp_send -s -- $arg
}
}
#
set timeout -1
spawn ssh auto21@10.38.227.229 {uname -a; df -h}
match_max 100000
expect "*?assword: "
send -- "bar01\r"
expect eof
EOF