在bash脚本中保持SSH打开



在任何人说使用公钥之前,这不是一个选项,因为我正在处理客户服务器。

我有一个脚本,用于维护一个包含客户服务器的所有IP/用户名/密码的文件。通过这个脚本,我选择了一个服务器,并使用一个期望值文档登录到该服务器。

#### 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 "yesr"
        exp_continue
    }
    -re ".*sword.*" {
        exp_send "$passr"
    }
}
expect {
    "$ " { send "<<<Send stuff>>>" }
    "# " { send "<<<Send stuff>>>" }
}
interact
EOFFF
# End of bash script

我的问题是,在这里文档结束后,它关闭SSH会话,并把我扔回我的本地服务器。我想保持远程ssh会话打开。

编辑我在if { $USE_TUNNEL == 1 } {之前添加了exp_internal 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 "rn" (spawn_id exp4) match glob pattern "$ "? no
"# "? no
Last login: Thu Jun  4 13:39:10 2015 from ***.***.***.***
expect: does "rnLast login: Thu Jun  4 13:39:10 2015 from ***.***.***.***rrn" (spawn_id exp4) match glob pattern "$ "? no
"# "? no
[***@********* ~]$
expect: does "rnLast login: Thu Jun  4 13:39:10 2015 from ***.***.***.***rrnu******@*********:~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) "rnLast login: Thu Jun  4 13:39:10 2015 from ***.***.***.***rrn**********@*********:~u001b[***@**************** ~]$ "
send: sending "mylist TerminalProfile | cut -d'"' -f6r" 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'"' -f6r" }
    "# " { send "" }
}
interact

我认为我们有同样的问题,造成的"交互"和eoff在一起。"交互"告诉期望脚本从stdin读取,同时eoff在你的情况下意味着stdin已关闭,然后你得到

"received eof from spawn_id exp0"

在bash脚本中嵌入expect目前下面的解决方案对我很好:

expect <(cat <<'EOD'
spawn ... (your script here)
EOD
)

EOD结束此处文档,然后将整个内容包装在<()进程替换块中。结果是expect将看到一个临时文件名,其中包括您的here-document的内容。


其他两个解决方案:

  1. 使用临时文件保存期望脚本,然后执行脚本
  2. 使用expect的"-c"选项,把你的expect命令放在"-c"后面

我也期待一些其他的方法,你能告诉我你的吗?

相关内容

  • 没有找到相关文章

最新更新