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

时间:2018-10-29 17:07:29

标签: expect

因为我的公司坚持使用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"
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
}

我还应该指出,我从来没有收到“了解它”的信息,但是我真的不需要它来工作,只是好奇为什么它没有。我需要可靠地工作才能使脚本运行,并且在大多数情况下,脚本似乎没有运行。

对于弱势期望用户的任何想法将不胜感激。

1 个答案:

答案 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