2

私の会社では、OTP over ssh(ワンタイムパスワード)を使用して本番マシンにアクセスしています。相互作用は次のようになります。

$ ssh prod
otp-md5 942 st9621 extResponse: 

この時点で、Javaプログラムを実行して、SSHから取得した情報を使用してOTP応答を生成します。 注: ssh出力(この例では「942st9621」)からのハッシュは、入力として以下のコマンドに渡される必要があることに注意してください。このハッシュは、sshを実行するたびに変更されます。

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

次に、生成されたOTP( "LAD DARN BHOY TEST ACHE JUTE")を切り取って、他のコンソールウィンドウに貼り付けます。

したがって、すべてを明確にするために、sshコマンドから生成されたデータをパスワードと組み合わせてjopを実行するときに使用する必要があります。その後、結果はまだ実行中のsshコマンドに返されます。

このプロセスを自動化したいと思います。基本的に、ホスト名を取得し、パスワードを要求し、sshを呼び出し、otp-md5コードをjopに渡し、OTPをsshに戻すbashスクリプトを用意します。パスワードをコマンドライン引数として入力する必要がないのは便利です。これはコマンド履歴に保存されるため、セキュリティ上の大きな問題です。

これは可能ですか?

ありがとうございました

4

3 に答える 3

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 に答える
1

これは、glennjackmanによって投稿された優れた回答に基づいています。

#!/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 に答える
0

SSHとの対話の期待を見てみることができます。

于 2012-03-01T20:57:55.747 に答える