web-dev-qa-db-ja.com

Bashスクリプト呼び出しは、マスターSSH接続のスクリプトを期待します

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は多重化をサポートしていません

2
Big McLargeHuge

期待スクリプトを使用してハードコードされたプレーンテキストのパスワードを送信することは、一般的に非常に悪い考えです。スクリプト化可能なパスワードなしのSSH接続が必要な場合は、キーペア認証を使用することをお勧めします。

ssh-keygen # and then follow the prompts; don't set a passphrase
ssh-copy-id [email protected]

そうすれば、パスワードを入力しなくてもssh [email protected]できます。

~/.ssh/configControlディレクティブで設定された制御接続多重化を引き続き使用し、ssh -O exit [email protected]でマスター接続を閉じることができます。

また、コマンドをリモートで実行するだけのsshのユーティリティを使用する必要があります。キーペア認証を設定すると、次のことが可能になります。

ssh [email protected] /etc/init.d/dnsmasq restart

スクリプトで、すべての準備が整いました。

4
DopeGhoti

これがまだあなたの質問である場合:

「SSH接続は確立されていますが、SCPコマンドに再利用しようとすると、接続が切断されます。なぜですか?」

これは、expectスクリプトを使用して別のシェルを開始しているために発生します。 sshセッションはこのシェルにバインドされており、スクリプトが終了するとシェルも終了し、sshセッションが終了します。

申し訳ありませんが、この問題の簡単な解決策はありません。

0
KrimsKrams