因为我的公司坚持使用sudo,所以我现在必须废弃我为运行远程命令而构建的ssh系统。
我有一个脚本将连接到服务器,对db2 inst所有者帐户进行sudo操作,然后运行一个脚本(以前已传递到/ tmp中)。也许有十倍的效果会起作用(我的测试输出“ Hello world”)。
这是远程服务器(/tmp/cwow/generic.ksh)上的ksh脚本:
#!/usr/bin/ksh93
echo "Hello world"
[我也尝试过添加sleep 5并等待混合结果,但这并不能解决问题]
我在本地运行的期望脚本是:
#!/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 inst\n"
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 "$pass\r"
expect {
-glob "assword:" {
send "$pass\r"
expect {
-glob " " {
send "/tmp/cwow/generic.ksh\r\n"
expect {
-glob "world" {
send_user "Got it\r"
}
}
}
}
}
}
}
}
我还应该指出,我从来没有收到“了解它”的信息,但是我真的不需要它来工作,只是好奇为什么它没有。我需要可靠地工作才能使脚本运行,并且在大多数情况下,脚本似乎没有运行。
对于弱势期望用户的任何想法将不胜感激。
答案 0 :(得分:0)
(不是答案,只是带格式的注释)
您不需要嵌套所有的Expect命令:如果您期望一个没有动作主体的模式,脚本将继续执行下一个命令。 IMO,这更具可读性:
expect {
timeout { send_user "TimedOut"; exit }
"assword:"
}
send "$pass\r"
expect "assword:"
send "$pass\r"
expect " "
send "/tmp/cwow/generic.ksh\r"
expect "world"
send_user "Got it\n"
请注意,您应send
\r
进入生成的进程,并将其作为“命中Enter”。但是\n
用于send_user
。