単一コマンドで複数のSSHセッション

単一コマンドで複数のSSHセッション

あるサーバーから別のサーバーにデータベースをコピーしようとしています。次のコマンドを試しましたが、SSHパスワード入力に関連しています。あるサーバーのパスワードを入力すると、他のサーバーに対して苦情が表示され、その逆も同様です。

ssh root@server1 mysqldump --databases db | ssh root@server2 mysql

ダンプを自分のコンピュータに一時的に保存して転送を完了しましたが、それを機能させる方法があるかどうか疑問に思いました。

答え1

パスワードプロンプトは面倒です。 SSHをより便利にする方法は、認証にキーを使用し、ssh-agentセッションごとに1回(オプションのタイムアウトを含む)キーを登録できるキーエージェント()を実行することです。その後、直接実行できます。

ssh root@server1 mysqldump --databases db | ssh root@server2 mysql

server1からserver2にログインできる場合は、2つのサーバー間でデータを直接転送する必要があります。

ssh root@server1 'mysqldump --databases db | ssh root@server2 mysql'

(またはserver2からserver1にログインできる場合はその逆)。同様に、認証用のSSHキーがあります。ローカル コンピュータで server1 へのアクセスを提供する SSH 秘密鍵と、server2 へのアクセスを提供する SSH 秘密鍵を登録します。プロキシ転送が有効になっていることを確認してください(AgentForwarding yes~/.ssh/config

パスワードを入力する必要がある場合は、最善の方法は最初に接続を確立してからデータを送信することです。新しいOpenSSHバージョンを使用すると、マスター接続を開いてスレーブ接続をルーティングできます。スレーブ接続には追加認証は必要ありません。あなたの~/.ssh/config

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

両方のサーバーへの基本接続を開始します。

ssh -N -M root@server1 &
ssh -N -M root@server2 &

次に、次をコピーします。

ssh root@server1 mysqldump --databases db | ssh root@server2 mysql

その後、不要になった場合は、基本接続を終了できます。

ssh -O exit root@server1
ssh -O exit root@server2

答え2

最も効率的な方法は、mysqldumpサーバーからパイプすることです。このコマンドのリストに似ています...

ssh root@server1 'mysqldump --databases db | ssh root@server2 mysql'

一部の構成関連の理由でリモートシステムからパイプできない場合は、次のコマンドリストを実行できます。

ssh root@server1 'mysqldump db' | ssh root@server2 'mysql db'

私の場合強制後者を実行するには、ペアを検討しますmysqldump。これは最初の選択肢ではありませんが、これは転送時間を節約すると信じています。

ssh root@server1 'mysqldump db | gzip -f' | ssh root@server2 'gzip -d | mysql db'

最後の例は100%正確ではないかもしれません。ただ働くと仮定しただけです。

答え3

やむを得ない場合到着第二プロキシに似たシステムには魔法の弾丸はありません。コンピュータまたは仲介サーバーとしてプロキシを使用する必要があります。

これは迷惑かもしれませんが、sshは非常に柔軟で透明になります。ncエージェントにプログラムをインストールしたら、エージェントに追加できます~/.ssh/config:

Host B
  ProxyCommand ssh -q my_proxy nc -q0 B 22

その後、次のことができます。、古典的なssh / scpコマンドを有効にする第二所属事務所が全くないようです。

したがって、この構成では、次のことができます。sshfs

sshfs B: /mnt/B_fs

sshfs を使用すると、ダンプコマンドが次のように表示されます。

 mysqldump --databases db ... > /mnt/B_fs/db.dump

残念ながら、プロキシの帯域幅速度は向上しません。 sshでできる最善のことは、アクティブにしてスローすることCompressionですCompressionLevel

バラよりこの投稿SSHマルチホップの詳細なガイドライン。

答え4

コアソリューションが最善の選択だと言った。ただし、何らかの理由でこれを実行できない場合は、コマンドラインを次のように変更できます。

ssh root@server1 mysqldump --databases db | {sleep 5; ssh root@server2 mysql; }

2番目のコマンドを待ちます。5最初のパスワードを入力する速度に合わせて調整してください。

これは単なる代替ソリューションであり、コアソリューションははるかに優れています。

関連情報