2013-10-16 7 views
7

ユーザ名、例えば[email protected]。しかし、このコマンドは、少なくとも1つのパスワードクエリを必要とし - 時々 - タイプの追加の相互作用:

The authenticity of host 'xxx (xxx)' can't be established. 
RSA key fingerprint is xxx. 
Are you sure you want to continue connecting (yes/no)? 

は、私がここにexpectと私の問題を解決しようとした、としている私は、すべてのコメントを(これまでに持っているものあなたが最初のやりとりを正しく捕まえる限りは動作しますが、2番目の対話は正しく捕捉されます。正しいパスワード(fg4,57e4h)が使用されているようですが、ホストマシンにログインしようとすると、パスワードを尋ねられます。私はまた、.ssh/authorized_hostsのエントリが作成されていないことを確認しました。使用されたパスワードも絶対に正しいです。ログインしてコピーして貼り付けるだけです。私はどちらもTCL午前も専門家を期待していますが、期待しているようだssh-copy-idコマンドに正しい文字列(すなわち、パスワード)を送信し、

./expect_keygen XXX 
spawn ssh-copy-id XXX 
parent: waiting for sync byte 
parent: telling child to go ahead 
parent: now unsynchronized from child 
spawn: returns {3602} 

expect: does "" (spawn_id exp6) match glob pattern "*re you sure you want to continue connecting"? no 
"*assword*"? no 
XXX's password: 
expect: does "XXX's password: " (spawn_id exp6) match glob pattern "*re you sure you want to continue connecting"? no 
"*assword*"? yes 
expect: set expect_out(0,string) "XXX's password: " 
expect: set expect_out(spawn_id) "exp6" 
expect: set expect_out(buffer) "XXX's password: " 
send: sending "fg4,57e4h\r" to { exp6 } 

:スクリプトは次のexp_internal 1出力を任意のエラーを作成しますが、生成されません。しかし、上記の期待コマンドであるにもかかわらず、問題がなければならない公開鍵をホストにコピーする。

+1

なぜ['ssh-copy-id'](http://man.cx/ssh-copy-id)を使用しないのですか?それがそれのためのものです。 –

+0

これはタスクを簡略化します。変更なしで自分のコードスニペットで動作しますか?オプションのyes/noの質問については、これも処理されますか(私は今確認できません)。 – Alex

+0

スクリプトの最後にプロンプ​​トが表示されるようにしてください。あなたのスクリプトでは、生成されたプロセスはパスワードを送信した直後に終了し、ssh-id-copyプロシージャ全体が完了することは保証されません。 – asdone

答えて

0

私はtcl/expectスクリプトを共有したいと思います。それはかなりうまくいく。

#!/usr/bin/env tclsh 

package require Expect 

set prompt {[$❯#] } 
set keyfile "~/.ssh/id_rsa.pub" 
set needcopy 0 

if {![file exists $keyfile]} { 
    spawn ssh-keygen 
    interact 
} 

spawn ssh $argv 

expect { 
    {continue connecting (yes/no)?} { 
     send "yes\r" 
     exp_continue 
    } 
    {[Pp]ass*: } { 
     set needcopy 1 
     interact "\r" { 
      send "\r" 
      exp_continue 
     } 
    } 
    $prompt 
} 

if {$needcopy} { 
    set fd [open $keyfile] 
    gets $fd pubkey 
    close $fd 
    send " mkdir -p ~/.ssh\r" 
    expect $prompt 
    send " cat >> ~/.ssh/authorized_keys <<EOF\r$pubkey\rEOF\r" 
    expect $prompt 
} 
interact 
+0

うわー、私は4年以上前にその質問をしました。 – Alex

+0

あなたはまだ答えを受け入れていませんでした:3 – Amos

+0

ああ男の子!私はいくつかの会社を間に入れ替えました。私は1つの答え;-)を受け入れるように表示されます – Alex

1

表示されるエラーは、コマンドを実行するシェルを使用していないspawnの結果です。あなたは、シェルの制御文字をしたい場合は、シェルを起動する必要があります。

spawn ssh-copy-id $hostname 

spawn sh -c "cat $home/.ssh/id_rsa.pub | ssh $hostname 'cat >> $home/.ssh/authorized_keys'" 

しかし、私はssh-copy-idはあなたに同じ質問をしますので、これはドロップイン置換されるべきだと思います

あなたがまたはプロンプト「接続継続」表示されない場合があります場合は、ネストされたとの期待必要exp_continue

spawn ssh-copy-id $hostname 

expect { 
    timeout { send_user "\nFailed to get password prompt\n"; exit 1 } 
    eof { send_user "\nSSH failure for $hostname\n"; exit 1 } 

    "*re you sure you want to continue connecting" { 
     send "yes\r" 
     exp_continue 
    } 
    "*assword*" { 
     send "mysecretpassword\r" 
    } 
} 
+0

あなたの提案は機能しません。私は 'ssh-copy-id'を使うために' spawn'コマンドを置き換えましたが、 'expectスクリプトはパスワードを要求します。たぶんそれは正規表現ですか?おそらく、来ることがない「はい/いいえ」という質問を待つことを「期待」しているのでしょうか? – Alex

+0

スクリプトの先頭に 'exp_internal 1'を追加すると、何が起きているのかが分かります。 –

+0

私が思ったことは、パターンを待つことを期待しています。このパターンは必ずしも発生しません。さまざまな要因によって発生する可能性があります。スクリプトは、パスワードのプロンプトまたはyes/noのプロンプトとパスワードのプロンプトだけを '期待する'ように、最上位を変更する必要があります。どのようにこれを適切に達成することができますか? – Alex

4

通常の状態では、SSHツールチェーンはstdinからではなく、端末からパスワードを要求します。 provide custom SSH_ASKPASS programでパスワードを入力することができます。

単純なスクリプトaskpassを作成します。SH:

#!/bin/sh 
echo $PASSWORD 

、その後、SSHで使用するように設定:

chmod a+x askpass.sh 
export SSH_ASKPASS=askpass.sh 

は、最終的には(期待せず)にssh-コピー-IDを実行します。

export DISPLAY=:0 
PASSWORD=mySecurePassword setsid ssh-copy-id -o StrictHostKeyChecking=no hishost.thatwas.secure.com 

がsetsidは、端末からデタッチ(SSHそれからパニックしてaskpassプログラムを探します) DISPLAYもsshでチェックされます(あなたのaskpassはGUIだと思います)

このアプローチでは、隠されたセキュリティ上の脆弱性が存在する可能性があることに注意してください。

0

expectでのアプローチが失敗した場合でも、sshpassを試すことができます。

2

これで問題は解決します。

#!/usr/bin/expect 
set timeout 9 
set hostname  [lindex $argv 0] 

spawn ssh-copy-id $hostname 

expect { 
    timeout { send_user "\nFailed to get password prompt\n"; exit 1 } 
    eof { send_user "\nSSH failure for $hostname\n"; exit 1 } 

    "*re you sure you want to continue connecting" { 
     send "yes\r" 
     exp_continue  
    } 
    "*assword*" { 
     send "fg4,57e4h\r" 
     interact 
     exit 0 
    } 
} 
+0

あなたが行った変更を指摘することができます。 – Zereges

+0

これを目の当たりにして、interact *とexit 0が "* assword *"スタンザに追加されました。 –

関連する問題

 関連する問題