gpt4 book ai didi

ssh - 使用Expect通过SSH进行两步登录

转载 作者:行者123 更新时间:2023-12-02 14:34:51 24 4
gpt4 key购买 nike

我正在尝试创建一个通过ssh登录的脚本,但要使其变得更难一点,我必须ssh进入一台服务器,然后ssh进入另一台服务器以进入要使用的服务器。到目前为止,我拥有的代码可以很好地使我进入第一个服务器,但是当它尝试ssh进入下一个服务器时,则无法正常工作。

#! /usr/bin/expect -f

# set servers to ssh into
set server1 "foo"
set server2 "bar"

# get username
send_user -- "Enter username: "
expect_user -re "(.*)\n"
set user $expect_out(1,string)

# get password
# don't ouput password to the user
stty -echo
send_user -- "Enter password for \"$user\": "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set password $expect_out(1,string)

# start the login
spawn ssh $user@$server1
expect "assword:"
send -- "$password\r"

# problems happen after here

# required to ssh from the <something> into <something else>
# the host name varies, e.g. host1, host2, host3, etc.
# so this just detects the last character
expect -re "\$ $"
send -- "ssh $user@$server2\r"
# sometimes it outputs this, sometimes it doesn't
expect "(yes/no)?"
send -- "yes\r"
expect "assword:"
send -- "$password\r"

interact

两个服务器的用户名和密码相同。

最佳答案

你弄错了

expect -re "\$ $"; # WRONG

如果要使文字美元符号与行尾匹配,则必须使用
expect -re "\\\$ $"; # CORRECT

它将与文字美元符号和行尾的空格匹配。

另外,为了匹配一些常见的已知提示,您可以定义一个变量,例如
set prompt "#|>|%|\\\$ $"; # We escaped the `$` symbol with backslash to match literal '$' 

最后一个美元符号表示行尾。

使用 expect时,我们必须伴随 -re标志将其指定为正则表达式。
expect -re $prompt

如果我们不知道某个特定的单词是否会到达输出中,或者我们不确定出现的顺序,则建议使用 exp_continue
send -- "ssh $user@$server2\r"
# sometimes it outputs this, sometimes it doesn't
expect {
"(yes/no)?" {send -- "yes\r";exp_continue}
"ssword:" {send -- "$password\r"}
}
expect -re $prompt

关于ssh - 使用Expect通过SSH进行两步登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33009674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com