2

我的公司使用 OTP over ssh(一次性密码)来访问我们的生产机器。交互可能如下所示:

$ ssh prod
otp-md5 942 st9621 extResponse: 

此时,我运行一个 Java 程序,使用从 SSH 获得的信息生成 OTP 响应。 注意:来自 ssh 输出的哈希(本例中为“942 st9621”)必须作为输入传递给下面的命令。每次 ssh 时,此哈希都会更改。

$ java -jar jop.jar 942 st9621 <password>
LAD DARN BHOY TEST ACHE JUTE

现在我将生成的 OTP(“LAD DARN BHOY TEST ACHE JUTE”)剪切并粘贴到另一个控制台窗口中。

所以,只是为了让一切清楚:我在运行 jop 时需要使用从 ssh 命令生成的数据和我的密码,然后将结果传递回仍在运行的 ssh 命令。

我很想自动化这个过程。基本上,有一个 bash 脚本,它需要一个主机名,要求输入密码,然后调用 ssh,将 otp-md5 代码传递给 jop,然后将 OTP 传递回 ssh。一个不错的选择是不必输入我的密码作为命令行参数,因为这将存储在命令历史记录中,这是一个很大的安全问题。

这可能吗?

谢谢

4

3 回答 3

1

这是基于 glenn jackman 发布的出色答案:

#!/usr/bin/env expect

# Get host from command line
set host     [lindex $argv 0]

# Read password from the user
send_user "Password: "
# Turn off echo to hide password
stty -echo
expect -re "(.+)\n"
set password $expect_out(1,string)
# Turn echo back on
stty echo

# SSH into server
spawn ssh "$host"
expect -re {otp-md5 ([^ ]+) ([^ ]+) extResponse: *$} {
    set otp [exec java -jar jop.jar $expect_out(1,string) $expect_out(2,string) "$password"]
    send_user "\n$otp"
    send -- "$otp\r"
}
interact
于 2012-03-02T20:04:36.780 回答
1

未经测试。期望脚本可能类似于

#!/usr/bin/env expect
set otp [exec java -jar jop.jar 942 st9621 [lindex $argv 0]]
spawn ssh prod
expect -re {extResponse: *$}
send -- "$otp\r"
interact

你会像这样使用它:optssh.exp <password>

响应更新,仍未测试。

#!/usr/bin/env expect
spawn ssh prod
expect -re {otp-md5 ([^ ]+) ([^ ]+) extResponse: *$} {
    set otp [exec java -jar jop.jar $expect_out(1,string) $expect_out(2,string) [lindex $argv 0]]
    send -- "$otp\r"
}
interact
于 2012-03-01T21:27:15.280 回答
0

你可以看看expect与 SSH 交互。

于 2012-03-01T20:57:55.747 回答