bash
スクリプトを呼び出してbashスクリプトの残りのSSHコマンドに使用されるマスターSSH接続を確立するexpect
スクリプトを作成しようとしています。
〜/ .ssh/config:
ControlMaster auto
ControlPath ~/.ssh/control-%r@%h:%p
upload.sh:
#!/usr/bin/bash
expect -f /home/Dave/bin/ssh.exp
scp /home/Dave/bin/test [email protected]:/root/test
ssh [email protected] "echo 'Test' >> /root/test"
ssh -O exit [email protected]
ssh.exp:
#!/usr/bin/expect -f
# Enable some diagnostic output
exp_internal 1
spawn /usr/bin/ssh -M -N [email protected]
expect {
-re ".*yes.*no.*" {
exp_send "yes\r"
exp_continue
}
-re ".*password.*" {
exp_send "OMGSECRET\r"
}
}
$ bin/upload.sh
spawn /usr/bin/ssh -M -N [email protected]
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {5212}
Gate keeper glob pattern for '.*yes.*no.*' is ''. Not usable, disabling the performance booster.
Gate keeper glob pattern for '.*password.*' is '*password*'. Activating booster.
expect: does "" (spawn_id exp4) match regular expression ".*yes.*no.*"? (No Gate, RE only) gate=yes re=no
".*password.*"? Gate "*password*"? gate=no
[email protected]'s password:
expect: does "[email protected]'s password: " (spawn_id exp4) match regular expression ".*yes.*no.*"? (No Gate, RE only) gate=yes re=no
".*password.*"? Gate "*password*"? gate=yes re=yes
expect: set expect_out(0,string) "[email protected]'s password: "
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "[email protected]'s password: "
send: sending "OMGSECRET\r" to { exp4 }
mux_client_request_session: read from master failed: Connection reset by peer
[email protected]'s password:
[email protected]'s password:
SSH接続は確立されていますが、SCPコマンドに再利用しようとすると、接続が切断されます。どうして?
考えられる最後の悲しい編集:残念ながら、それは表示されます cygwinは多重化をサポートしていません 。
期待スクリプトを使用してハードコードされたプレーンテキストのパスワードを送信することは、一般的に非常に悪い考えです。スクリプト化可能なパスワードなしのSSH接続が必要な場合は、キーペア認証を使用することをお勧めします。
ssh-keygen # and then follow the prompts; don't set a passphrase
ssh-copy-id [email protected]
そうすれば、パスワードを入力しなくてもssh [email protected]
できます。
~/.ssh/config
のControl
ディレクティブで設定された制御接続多重化を引き続き使用し、ssh -O exit [email protected]
でマスター接続を閉じることができます。
また、コマンドをリモートで実行するだけのssh
のユーティリティを使用する必要があります。キーペア認証を設定すると、次のことが可能になります。
ssh [email protected] /etc/init.d/dnsmasq restart
スクリプトで、すべての準備が整いました。
これがまだあなたの質問である場合:
「SSH接続は確立されていますが、SCPコマンドに再利用しようとすると、接続が切断されます。なぜですか?」
これは、expectスクリプトを使用して別のシェルを開始しているために発生します。 sshセッションはこのシェルにバインドされており、スクリプトが終了するとシェルも終了し、sshセッションが終了します。
申し訳ありませんが、この問題の簡単な解決策はありません。