リモートSSHセッションを「保存」しますか?

リモートSSHセッションを「保存」しますか?

スクリプトでこれを実行しようとしています。リモートホストでいくつかのコマンドを実行する必要があります。現在私はこれをしています:

ssh root@host 'bash -s' < command1
ssh root@host 'bash -s' < command2
ssh root@host 'bash -s' < command3

ただし、これはサーバーに繰り返し接続する必要があるため、コマンド処理の間に時間がかかることを意味します。私は次のようなものを探しています:

varSession=$(ssh root@host 'bash -s')
varSeesion < command1
varSeesion < command2
varSeesion < command3

今回もスクリプトを通じてこれらのコマンドを実行する必要があります。見てみましたが、screenスクリプトで利用できるかどうかはわかりません。

答え1

あなたは使用することができControlMasterますControlPersistコマンドの終了後も接続を維持できます。

と一緒に使用する場合は、ControlMaster初期クライアント接続が閉じられた後にデフォルト接続がバックグラウンドで開かれていることを指定します(将来のクライアント接続を待機)。に設定すると、noデフォルト接続はバックグラウンドに配置されず、初期クライアント接続が終了した直後に終了します。yesまたは に設定すると、デフォルトの0接続はバックグラウンドで無期限に保持されます(ssh -O exit""などのメカニズムによって終了または閉じられるまで)。秒単位の時間に設定するか、に記録された形式に設定されている場合、 sshd_config(5)バックグラウンドマスター接続は指定された時間の間アイドル状態(接続されているクライアントなし)を維持した後に自動的に終了します。

したがって、最初のSSHコマンドは接続用の制御ファイルを設定し、残りの2つのコマンドは制御ファイルを介して接続を再利用します。次のものが必要~/.ssh/configです。

Host host
    User root
    ControlMaster auto
    ControlPath /tmp/ssh-control-%C
    ControlPersist 30   # or some safe timeout

そして、スクリプトに他の変更は必要ありません。

答え2

ヒントから始めましょう。エマルジョンStackOverflowとbashの使用ここのドキュメント:

ssh root@host 'bash -s' << EOF
  command1
  command2
  command3
EOF

答え3

スクリプトを使用できますexpect。 SSH接続を自動化し、リモートシステムでコマンドを実行できます。このコードSSH接続の自動化に触発されなければなりません。

あなたはこのようなものを探しています。次のコードをファイルに保存foo.expect

#login to the remote machine
spawn ssh username@hostname
expect "?assword" { send "yourpassword\r"}

#execute the required commands; following demonstration uses echo command
expect "$ " {send "echo The falcon has landed\r"}
expect "$ " {send "echo The falcons have landed\r"}
expect "$ " {send "echo Will the BFR? land? \r"}

#exit from the remote machine
expect "$ " {send "exit\r"}

次のように実行expect foo.expect

アプリケーションがこのスクリプトを実行すると予想する必要があります。命令でインストール可能apt-get install expect

この本期待スクリプトをナビゲートするのに役立ちます。楽しいスクリプト!

答え4

を使用してすべてのファイルをリンクしcatssh

cat command1 command2 command3 | ssh root@host 'bash -s'

関連情報