在任何人说要使用公钥之前,这不是一个选项,因为我正在处理客户服务器。
我有一个脚本维护一个包含客户服务器的所有IP /用户名/密码的文件。通过脚本我选择一个服务器并使用here here来预期登录到该服务器。
#### Code up here to set the variables.
exp_internal 1
/usr/bin/expect << EOFFF
if { $USE_TUNNEL == 1 } {
spawn ssh -L 4567:localhost:3306 $user\@$ip
} else {
spawn ssh $user\@$ip
}
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "$pass\r"
}
}
expect {
"$ " { send "<<<Send stuff>>>" }
"# " { send "<<<Send stuff>>>" }
}
interact
EOFFF
# End of bash script
我的问题是,在此文档结束后,它会关闭SSH会话并将我退回到本地服务器。我想打开远程ssh会话。
修改
我在exp_internal 1
之前添加了if { $USE_TUNNEL == 1 } {
。输出的结尾如下:
spawn ssh ****@***.***.***.***
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {22819}
expect: does "" (spawn_id exp4) match regular expression ".*es.*o.*"? no
".*sword.*"? no
****@***.***.***.***'s password:
expect: does "tms6@161.19.242.206's password: " (spawn_id exp4) match regular expression ".*es.*o.*"? no
".*sword.*"? yes
expect: set expect_out(0,string) "****@***.***.***.***'s password: "
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "****@***.***.***.***'s password: "
send: sending "***********\r" to { exp4 }
expect: does "" (spawn_id exp4) match glob pattern "$ "? no
"# "? no
expect: does "\r\n" (spawn_id exp4) match glob pattern "$ "? no
"# "? no
Last login: Thu Jun 4 13:39:10 2015 from ***.***.***.***
expect: does "\r\nLast login: Thu Jun 4 13:39:10 2015 from ***.***.***.***\r\r\n" (spawn_id exp4) match glob pattern "$ "? no
"# "? no
[***@********* ~]$
expect: does "\r\nLast login: Thu Jun 4 13:39:10 2015 from ***.***.***.***\r\r\n\u******@*********:~\u001b\[****@********* ~]$ " (spawn_id exp4) match glob pattern "$ "? yes
expect: set expect_out(0,string) "$ "
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "\r\nLast login: Thu Jun 4 13:39:10 2015 from ***.***.***.***\r\r\n\**********@*********:~\u001b\[***@**************** ~]$ "
send: sending "mylist TerminalProfile | cut -d'"' -f6\r" to { exp4 }
interact: received eof from spawn_id exp0
[*****@********** sign_on_one_file]$
我正在处理客户服务器,所以我为消除所有IP /用户名/主机名/密码而道歉。
所以我们很清楚,当它让我回到提示时的最后一行是本地机器的提示。不是我试图登录的遥控器。
当我将expect脚本提取到一个单独的文件中时,只需将其作为bash脚本的最后一行调用它就可以正常工作了。我希望将所有内容都放在一个文件中,以便于将脚本分发给我的同事。
编辑2
<<Send stuff>>
只是我公司所拥有的服务器上的一个功能。它是一个将mysql表打印为csv的包装器。
expect {
"$ " { send "mylist TerminalProfile | cut -d'\"' -f6\r" }
"# " { send "" }
}
interact
答案 0 :(得分:2)
我认为将“互动”和EOFFF混合在一起会产生同样的问题。 “Interact”告诉expect脚本从stdin读取,同时EOFFF在你的情况下意味着stdin被关闭,然后你得到了
“从spawn_id exp0收到eof”
根据这个Embedding an expect inside a bash script, 目前以下解决方案对我来说很好:
expect <(cat <<'EOD'
spawn ... (your script here)
EOD
)
EOD结束here-document,然后将整个事件包装在&lt;()进程替换块中。结果是expect会看到一个临时文件名,包括你here-document的内容。
另外两个解决方案:
我也期待其他一些方法,你能告诉我你的吗?