
次のスクリプトがあります。
ssh host command1
scp file1 host:/tmp
ssh host command2
それらをすべて1つの呼び出しにまとめる方法はありますかssh/scp
?私が経験している問題は、ファイルのコピーとコマンドの実行を組み合わせることです。これは時差を置いて行う必要があります。次のようなものを望んでいました。
ssh_sometool host -c command1 -cp file1 /tmp -c command2
これは構文とは何の関係もありませんが(同じ関数を書くことができます)、ssh
同じセッションで発生するすべてのもの
答え1
まず、目的のタスクを実行する直接的または標準的な方法はありません。また、明確に説明します。デフォルトのSSHクライアントには、目的のタスクを実行する方法はありません。。
とても古いフォークがあります。SSH-xfer。このツールの開発者でさえ、自分のソリューションが「ハッキング的」であり、非常に古くなっているので、使用しないでください。このツールで使用するためにパッチされた最新のSSHバージョンはOpenSSH-3.8.1p1
(Arch Linuxの場合は現在のバージョンはOpenSSH_7.6p1
)です。
作業速度を上げ、ホスト間の接続/ハンドシェイクの数を減らすことが重要な場合は、一種の構成/調整ツールを検討することができます。アンシプール多くの追加設定なしでタスクを実行する最も簡単な方法のようです。塩おそらく最速のようです。
それにもかかわらず、AnsibleとSaltはどちらも追加の接続を利用して作業を実行し、ssh / scpコンボの代わりにそれを使用してパフォーマンス上の利点を得ることができるかどうかはわかりません。
更新:多くのファイルをプッシュして解凍する必要があり、転送間にいくつかの追加スクリプトを実行する必要がある場合は、ほとんどすべてのプロビジョニングツール(Chef、Puppet、Salt、Ansible)が通常のssh / scpよりも高速です。
答え2
SSH を使用すると、接続が切断された後も一定期間セッションが維持されるため、次回接続を開始する必要はありません。これを有効にするSSH設定オプションは次のとおりです。
Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 30
ControlMaster
単一のネットワーク接続を介して複数のセッションを共有できます。に設定すると、auto
各新しい試行はその接続が存在することを確認し、それを使用するか新しい接続を作成します。
ControlPath
接続が保存されるパスを指定します。パスが存在することを確認してください!つまり、ディレクトリを作成します(ソケットここにありますが、必要に応じて手動で名前を付けることができます)。
ControlPersist
切断後の接続期間を指定します。時間は秒単位で許可されます。
オプションをさらに指定するには、を使用しますman ssh_config
。
これを追加すると、これら3~/.ssh/config
つのコマンドに対して1つのセッションのみが開きます。
私のコンピュータは5倍の速度向上を提供します。一部の(近隣)ホストへの100個の連続接続は連続セッションなしで30秒以内に機能しますが、そのホストへの接続は5〜6秒しかかかりません。
PS 場合によっては(ネットワークを変更するなど)、接続を含むファイルが存在するため、既存のSSH接続が失われ、新しい接続は確立されません。この場合、~/.ssh/sockets
必要なファイルを手動で削除するだけです。
答え3
SSH stdinを使用すると、すべてのファイルを参加して転送し、リモートセッションで受信できます。つまり、次のようになります。
tar -cf - file1 file2 | ssh host 'TDIR=`mktemp -d`; tar -xf - -C "$TDIR"; cat "$TDIR/file1"; command1; command2 ...'
- この
cat "$TDIR/file1"
コマンドは、受信したファイルにアクセスする方法の一例です。 - 圧縮ファイルを転送するには、ローカルおよびリモート側で -j または -J スイッチで tar を使用します。
- すべてのコマンドを bash スクリプトに入れてアーカイブに含めた後、リモート側で実行できます。
...tar -xf - -C "$TDIR"; bash "$TDIR/script.sh"'
答え4
スクリプトで最初の行が実行されると...
ssh host command1
実行はsshに渡され、2番目のコマンド(scp)はcommand1が完了したときにのみ実行されます。これらのタスクを並列に実行する1つの方法は、次のように各タスクをバックグラウンドで実行することです。
ssh host command1 &
scp file1 host:/tmp &
ssh host command2 &
これで、3つのタスクすべてがバックグラウンドで同時に実行されます。