为什么我的Expect脚本只呼应命令不运行?

问题描述 投票:0回答:1

我正试图自动执行一些 ssh 流程。我有我的Expect代码。但我的Expect代码只是回声打印出命令。它并没有实际运行命令。

#!/usr/bin/expect -f

set timeout 10
set usrnm "aaaaaa"
set pwd "pppppp"
set addr1 "xxx.cloud.xxx.com -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
set addr2 "xxx.xxxx.xxxx.com"

spawn ssh $usrnm@$addr1

expect {

    "(yes/no)?" {send "yes\r";exp_continue}

    "password: " {send  "$pwd\r"}

}


expect "*#"
send "ssh $usrnm@$addr2\r"

expect {

    "(yes/no)?" {send "yes\r";exp_continue}

    "password:" {send  "$pwd\r"}

}

expect "*#"

send "cd /tmp/myself/folder\r"

expect "*#"

send "./run_engine.sh test.py\r"

expect eof

#interact

所以如果我做

expect my_expect.exp

它只是打印命令。

spawn ssh [email protected] -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no (10s later) ssh [email protected] (10s later) cd /tmp/amz337/COAFALV (10s later) ./run_engine.sh test.py (exit)

我的脚本有什么问题?

bash shell ssh automation expect
1个回答
1
投票

因为Tcl(因此Expect)不会在变量被替换时改变字的边界。你是想准确地登录到名为的主机。

xxx.cloud.xxx.com -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

空格和所有的字

从逻辑上讲,将 ssh 选项到一个存放地址的变量中。我建议。

set addr1 "xxx.cloud.xxx.com"
set addr2 "xxx.xxxx.xxxx.com"
set ssh_opts($addr1) {-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no}
set ssh_opts($addr2) {}

那么

spawn ssh {*}$ssh_opts($addr1) $usrnm@$addr1

{*} 语法是Tcl的 "splat "操作符,它将一个带空格的词分割成各个词。参见 https:/tcl.tkmantcl8.6TclCmdTcl.htm。 第5条规则。

之后,当你连接到第二台机器时,你将插值成一个字符串,所以溅射是不必要的。

send "ssh $ssh_opts($addr2) $usrnm@$addr2\r"

你可能想抓住超时事件,然后中止脚本。

expect {
    timeout      {error "timed-out connecting to $addr1"}
    "(yes/no)?"  {send "yes\r"; exp_continue}
    "password: " {send  "$pwd\r"}
}

在你的脚本结束时, 在run_engine脚本完成后, 你仍然连接着addr2, 所以. . expect eof 将不会实际检测到产生的进程的EOF。你会在10秒后超时,Expect进程会退出。为了整洁,你应该。

send "./run_engine.sh test.py\r"
expect "*#"
send "exit\r"
# This prompt is from addr1
expect "*#"
send "exit\r"
# _Now_ the spawned ssh process will end
expect eof

如果你认为 run_engine 脚本的时间会超过 10 秒, 你应该在发送该命令之前调整超时变量。

另外,在开发Expect脚本的时候,你应该开启调试功能。

exp_internal 1

那会让你看到幕后发生的事情 特别是当你看到你的模式是否匹配的时候

© www.soinside.com 2019 - 2024. All rights reserved.