使用脚本中的otp调用ssh



我的公司使用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。一个很好的选择是而不是必须键入我的密码作为命令行参数,因为这将存储在命令历史记录中,这是一个很大的安全问题。

这可能吗?

感谢

未测试。预期脚本可能类似

#!/usr/bin/env expect
set otp [exec java -jar jop.jar 942 st9621 [lindex $argv 0]]
spawn ssh prod
expect -re {extResponse: *$}
send -- "$otpr"
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 -- "$otpr"
}
interact

这是基于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 -- "$otpr"
}
interact

您可以看看与SSH交互的预期。

最新更新