次のようなスクリプトがあります。
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転送このツールの開発者でさえ、このソリューションは「ハックっぽい」ものであり、非常に古いため、使用すべきではないと強調していることに注意してください。このツールで使用できるようにパッチが適用された最後の 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
。
これらを に追加すると~/.ssh/config
、これら 3 つのコマンドに対して 1 つのセッションのみが開かれます。
私のコンピューターでは、5 倍のスピードアップが得られます。近くのホストへの 100 回の連続接続は、永続的なセッションなしでは 30 秒で完了し、永続的なセッションがある場合は 5 ~ 6 秒しかかかりません。
PS 場合によっては (たとえば、ネットワークを変更した場合)、接続のファイルが存在するため、既存の SSH 接続が切断され、新しい接続が確立されないことがあります。この場合は、~/.ssh/sockets
必要なファイルを手動で削除してください。
答え3
すべてのファイルを SSH 標準入力経由で参加および渡し、リモート セッションで受信できます。つまり、次のようになります。
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) はコマンド 1 が終了したときにのみ実行されます。これらを並行して実行する 1 つの方法は、次のように各タスクをバックグラウンドで実行することです...
ssh host command1 &
scp file1 host:/tmp &
ssh host command2 &
これで、3 つのタスクすべてがバックグラウンドで同時に実行されるようになりました。