パスワードクエリなしで後でホストにログインできるようにするために、次の構文を使用して公開鍵をホストにコピーしています。
ssh-copy-id $hostname
は$hostname
、システムのホスト名とユーザー名です (例: root@123.456.789.100
. ただし、このコマンドには少なくとも 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
たが、これまでのところ (すべてのコメントと提案が組み込まれています) です。
#!/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"
}
}
これは、最初のインタラクションを正しく「キャッチ」する限り機能しますが、2 番目のインタラクションはキャッチしません。正しいパスワード (fg4,57e4h) が使用されているようですが、ホスト マシンにログインしようとすると、パスワードの入力を求められます。また、エントリーがないことも確認し.ssh/authorized_hosts
ました。使用したパスワードも完全に正しいです。コピーして貼り付けるだけでログインできるからです。スクリプトはエラーを作成しませんが、次のexp_internal 1
出力を生成します。
./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 }
私は tcl の専門家でも期待の専門家でもありませんが、expect は正しい文字列 (パスワード) をssh-copy-id
コマンドに送信するようです。ただし、上記の expect コマンドでは公開鍵がホストにコピーされないため、問題があるはずです。