运行远程脚本时,Expect的结果不可靠



因为我的公司坚持使用sudo,我现在不得不放弃我为运行远程命令而构建的ssh系统。

我有一个脚本,它将连接到服务器,sudo到db2inst所有者帐户,然后运行一个脚本(以前交付到/tmp中(。也许每10次中就有1次是有效的(为我的测试输出"Hello world"(。

下面是远程服务器上的ksh脚本(/tmp/cow/generic.ksh(:

#!/usr/bin/ksh93
echo "Hello world"

[我也尝试过添加sleep 5和wait,结果喜忧参半,但它并不能解决问题]

我在本地运行的预期脚本是:

#!/usr/bin/expect
set spath /tmp/cwow/generic.ksh
set pass $env(MYEXPECTPASS)
set user $env(MYEXPECTUSER)
if { [llength $argv] != 2 } {
send_user "USAGE: $argv0 host instn"
exit
}
set host   [lindex $argv 0]
set inst   [lindex $argv 1]
set timeout 10
log_user 1
exp_internal 0
eval spawn /usr/bin/ssh -t $user@$host "sudo su - cwow"
expect {
timeout { send_user "TimedOut"; exit }
-glob "assword:" {
send "$passr"
expect {
-glob "assword:" {
send "$passr"
expect {
-glob " " {
send "/tmp/cwow/generic.kshrn"
expect {
-glob "world" {
send_user "Got itr"
}
}
}
}
}
}
}
}

我还应该注意到,我从来没有收到"收到"的信息,但我真的不需要它,只是好奇为什么它没有。我需要可靠地工作的是让脚本运行,而且在大多数情况下,它似乎不会运行

任何针对弱预期用户的想法都将不胜感激。

(不是答案,只是格式化的注释(

您不需要嵌套所有期望的命令:如果您期望一个没有操作体的模式,脚本将继续执行下一个命令。这更可读,IMO:

expect {
timeout { send_user "TimedOut"; exit }
"assword:" 
}
send "$passr"
expect "assword:" 
send "$passr"
expect " "
send "/tmp/cwow/generic.kshr"
expect "world" 
send_user "Got itn"

注意,您应该将send添加到派生进程中,并将r设置为"按Enter键"。但CCD_ 3用于CCD_。

最新更新