開いているSSH接続を維持し、シェルスクリプトでそれを使用する方法は?

開いているSSH接続を維持し、シェルスクリプトでそれを使用する方法は?

現在私は次のように電話しています:

$ ssh [email protected] my_cmd

これは遅く、安全に自動化することは容易ではない。私はSSH接続を確立し、私のコマンドをhost.comに渡し、出力を印刷するスクリプトを持っていると思います。

それは可能ですか?

私のコンピュータをAuthorized_keysに追加することは私にとってオプションではなく、速度低下の問題を解決しません。

答え1

ControlMasterこの機能を既存チャネルでの多重化と呼びます。これにより、ssh はすべての鍵交換を実行し、一度だけログインするので、後続のコマンドはより速く実行されます。次の3行を使用して有効にできます.ssh/config

Host host.com
  ControlMaster auto
  ControlPath ~/.ssh/master-%C
  # for openssh < 6.7 you need to use this one:
  # ControlPath ~/.ssh/master-%r@%h-%p
  ControlPersist 5m

ニーズに合わせて調整できます。または、他のコマンドの実行中に開いているデフォルトの接続を開くこともできますControlPersist

この機能を調整する可能性はたくさんありますが、ControlPath他のユーザーが読めない、または乱用できない安全な場所にソケットを保管してください。

詳細はssh_config(5)マニュアルページで確認できます。

答え2

マシンを制御してジョブを自動化できる場合、Authorized_keysにキーを追加できないのはなぜですか?

ssh-copy-id -i ~/.ssh/foo [email protected]

これにより、接続するたびにパスワードを入力する必要がなくなります。

control master最大の問題が接続に時間がかかる場合は、SSH構成に追加して単一の接続を再利用できます。その接続を引き続き実行すると、後続の接続はほぼ瞬時に行われます。

Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 600

https://puppetlabs.com/blog/speed-up-ssh-by-reusing-connections

長期的に作業を自動化する場合は、次のように接続する自動化フレームワークを使用する方が良いかもしれません。

関連情報