スクリプトでこれを実行しようとしています。リモートホストでいくつかのコマンドを実行する必要があります。現在私はこれをしています:
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
を使用してすべてのファイルをリンクしcat
、ssh
。
cat command1 command2 command3 | ssh root@host 'bash -s'