シェルを使用して複数のサーバーでバッチ操作を実行する方法

シェルを使用して複数のサーバーでバッチ操作を実行する方法

SSHプロトコル

公開鍵ログインについて説明する前に、SSH プロトコルについて説明しましょう。

SSH はネットワーク プロトコルです。SSH という場合、通常はその実装、つまり OpenSSH を指します。シェルでは、ssh コマンドです。

パスワード

Secure Shell (SSH) は、安全でないネットワーク内のネットワーク サービスに安全な伝送環境を提供できる暗号化されたネットワーク伝送プロトコルです。 SSH は、ネットワーク内に安全なトンネルを確立して、SSH クライアントとサーバーを接続します。

SSH の原理は HTTPS の原理に似ており、どちらも TCP と非対称暗号化に基づくアプリケーション層プロトコルです。 HTTPS との違いは、HTTPS では中間者攻撃を防ぐためにデジタル証明書とデジタル証明書認証センターを使用するのに対し、SSH サーバーの公開鍵は公証されず、その ID は公開鍵のフィンガープリントを通じて手動でのみ判別できることです。

下の図に示すように、ssh を使用して初めてサーバーにログインすると、ssh によってサーバーの公開鍵のフィンガープリントを確認するように求められます。

この公開鍵のフィンガープリントがログインしたいサーバーのものであることを確認すると、サーバーの公開鍵が ~/.ssh/known_hosts に追加されます。再度ログインすると、ssh は認証されたサーバーであることを検出した後、公開鍵の検証段階をスキップします。

接続プロセス

通信暗号化の概念については、以前の記事でも紹介しています。「暗号化についてもう一度話しましょう - RSA 非対称暗号化の理解と使用」をご覧ください。 SSH プロトコルの接続プロセスについては、「プロトコルの基礎: Secure Shell プロトコル」を参照してください。

まとめると、主に次の手順が含まれます。

  • TCP 3ウェイハンドシェイク
  • SSHプロトコルバージョンネゴシエーション
  • クライアントとサーバー間の公開鍵交換
  • 暗号化アルゴリズムのネゴシエーション
  • クライアントは対称暗号化キー認証を使用する
  • クライアントとサーバー間の安全な通信

次の図に示すように、tcpdump + wireshark を使用してパケットをキャプチャし、SSH 接続プロセスを確認しました。

tcpdump + wireshark はネットワーク プロトコルを学習するための真のツールであることに改めて感嘆せざるを得ません。

sshツール

ssh

ツールとしての ssh はサーバーとクライアントに分かれており、サーバー側では sshd が使用され、通常はポート 22 を占有します。通常はクライアントを使用します。一般的な使用方法は ssh user@host で、ssh プロンプトに従ってパスワードを入力してサーバーにログインします。

サポートされているパラメータからわかるように、その機能は非常に強力です。

ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b バインドアドレス] [-c 暗号仕様] [-D [バインドアドレス:]ポート] [-E ログファイル] [-e エスケープ文字] [-F 設定ファイル] [-I pkcs11] [-i アイデンティティファイル] [-J [user@]ホスト[:ポート]] [-L アドレス] [-l ログイン名] [-m mac_spec] [-O ctl_cmd] [-o オプション] [-p ポート] [-Q クエリオプション] [-R アドレス] [-S ctl_path] [-W ホスト:ポート] [-w local_tun[:remote_tun]] [user@]ホスト名 [コマンド]

SSH プロトコルと ssh コマンドを紹介した後、最後に公開鍵ログインについて説明します。

公開鍵ログイン

非対称暗号化の原理を理解すれば、公開鍵を使用したログインは非常に簡単になります。公開鍵と秘密鍵は固有のペアであるため、クライアントが自分の秘密鍵のセキュリティを確保している限り、サーバーは公開鍵を通じてクライアントの信頼性を完全に判断できます。したがって、公開鍵ログインを実装するには、まず公開鍵と秘密鍵のペアを生成する必要があります。

ssh-keygen コマンドを使用してキー ペアを生成します。手順をより完全にするために、キー ペアを一時的に作業ディレクトリに保存します。デフォルトでは、キー ペアは ~/.ssh ディレクトリに保存されます。

~ sshキー生成

公開/秘密 RSA キー ペアを生成しています。

キーを保存するファイル (/Users/zbs/.ssh/id_rsa) を入力してください: ./test

パスフレーズを入力してください (パスフレーズがない場合は空白):

同じパスフレーズをもう一度入力してください:

あなたの識別情報は ./test に保存されました。

公開鍵は ./test.pub に保存されました。

キーのフィンガープリントは次のとおりです。

SHA256:xxxxx/B17z/xxxxx [email protected]

キーのランダムアート画像は次のとおりです。

+---[RSA 2048]----+

| o+*..EO* |

| .... |

|oo+ .o++.o|

+----[SHA256]-----+

~ ls ./テスト*

./テスト ./テスト.pub

秘密鍵ファイル ./test の内容をクライアントの ~/.ssh/id_rsa に配置し、パスワードを使用してサーバーにログインし、公開鍵ファイル ./test.pub の内容をサーバーの ~/.ssh/authorized_keys に配置します。

再度ログインすると、ssh は自動的に独自の秘密鍵を認証に使用するため、パスワードを入力する必要がなくなります。

バッチ操作

公開鍵ログインを使用すると、サーバーにログインするたびにパスワードを入力する手間が省けます。また、各ログイン セッションの同期ブロックの問題も解決されるため、ssh の ssh user@host コマンド メソッドを使用して、サーバー上で直接コマンドを実行できます。

同時に、IP リストがある場合は、for ループを使用して IP リストを走査し、複数のサーバーでコマンドを一括して実行することも可能です。

複数サーバーファイルのマージ

数日前、私は同僚が複数のサーバー上のログを検索するのを手伝いました。統計分析のために、複数のサーバー上で見つかったログを同じマシンに集約する必要がありました。 psshを使用して複数のサーバーにログインします。ログの容量が大きすぎるため、結果をターミナルに出力してからコピーするのは現実的ではありません。リダイレクトを使用すると、結果は各サーバーにリダイレクトされます。

SCP-10000-1

このとき、scp を使用できます。scp と ssh は同じファミリーのコマンドであり、SSH プロトコルに基づいて実装された安全な転送プロトコルでもあります。各サーバーの公開鍵を保持しておけば、ssh コマンドと同様にパスワードなしで操作できます。

scp の一般的な使用法は scp src dst であり、リモート パスは user@host:/path として表現できます。バッチログインの場合は、まずgrepなどのコマンドを使用して結果ファイルをファイルに入力し、次にscpコマンドを使用して同じサーバーにコピーすることができます。

サーバー間のファイル名の競合を回避するには、uuidgen | xargs -I {} scp result.log root@ip:/result/{} を使用して各サーバーの結果を別のファイルにコピーし、cat を使用して結果フォルダー内のファイルを 1 つにマージします。

いいえ

もちろん、ほとんどの場合、サーバーは互いの公開鍵を保存しませんが、nc コマンドを使用するとこの問題を完全に解決できます。

nc の -k オプションを使用すると、ファイル転送が完了した後も nc サーバーは接続を開いたままにすることができます。このように、nc -k -4l port > result.log を使用して nc サーバーを起動し、grep xxx info.log | nc ip port を使用して結果データをマージします。

まとめ

この記事で紹介したさまざまなツールはまだ小規模な開発です。より多くのツールを知ることは常に良いことです。運用および保守作業を行っている場合は、さらに多くの機能を統合し、完全な自動化を実現するために、OPS プラットフォームに依存する必要があります。

上記は、シェルを使用して複数のサーバーでバッチ操作を実行する方法の詳細です。シェルを使用して複数のサーバーでバッチ操作を実行する方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • シェルで一括してコメント化およびコメント解除する方法
  • シェル スクリプトを使用してファイル サイズをカウントし、ユーザーをバッチで作成する例
  • シェルスクリプトのバッチコピーとコマンド実行の詳細な例
  • シェルスクリプトを使用して Docker サービスを一括で開始および停止する
  • シェルスクリプトは ssh-copy-id を実装し、公開鍵をリモートホストにバッチで自動的に送信します。
  • シェル スクリプトを使用して ES インデックスを一括削除する方法
  • シェルバッチcurlインターフェーススクリプトの簡単な実装方法
  • 画像ファイル名のシェルコマンドラインバッチ処理の詳細な説明

<<:  vue3+vite プロジェクトで svg を使用する方法の詳細なグラフィック説明

>>:  画像を使用してハイパーリンクのパーソナライズされた下線を実現します

推薦する

Ubuntu16.04はphp5.6ウェブサーバー環境を構築します

Ubuntu 16.04 はデフォルトで PHP7.0 環境をインストールしますが、PHP7 は一部...

HTMLで細い線のテーブルを作成する簡単な例

この細線の表を作成する方法については、Baidu で検索すると、表に対して border="...

HTML コード作成ガイド

共通コンベンションタグ自己終了タグ。閉じる必要はありません (例: img input br hr ...

MySQL がデフォルトの分離レベルとして繰り返し読み取りを選択する理由

目次Oracle 分離​​レベルMySQL 分離レベル要約する多くの読者は、MySQL のトランザク...

フォント宝庫 50 種類の素晴らしい無料英語フォントリソース パート 1

デザイナーは独自のフォント ライブラリを持っているため、プロジェクトの設計時にすぐに使用できます。今...

phpmyadmin を使用して MySQL 権限を設定する方法

目次ステップ 1: root ユーザーとしてログインします。ステップ 2: 新しいデータ テーブルを...

React における同期および非同期 setState の問題のコード分析

React は Facebook の社内プロジェクトとして始まりました。 React の出現は革命的...

Win10にMySQL8圧縮パッケージ版をインストールするチュートリアル

1 公式サイトからMySQL8をダウンロードしてインストールするMySQL8 ダウンロードアドレスこ...

SpringBoot と Docker の統合の詳細なプロセス

目次1. デモプロジェクト1.1 インターフェースの準備1.2 構成の準備2. Dockerがリモー...

MySQL の悲観的ロックと楽観的ロックの使用例

悲観的ロック悲観的ロックは、データを悲観的であるとみなします。データをクエリするときに、ロックを追加...

Vue.js の watch メソッドと computed メソッドの違いの詳細な例

目次序文導入1. 作用機序2. 自然から3. 時計と計算の比較4. メソッドはデータロジックの関係を...

iframe パラメータの説明と例

<iframe src=”test.jsp” width=”100″ height=”50″ ...

Nginx ドメイン転送の使用シナリオ コード例

シナリオ 1: サーバーの制限により、外部に開かれているポートは 1 つだけですが、別の外部ネットワ...

ウェブサイトのユーザビリティを向上させる10のヒント

企業の Web サイト、個人のブログ、ショッピング Web サイト、ゲーム Web サイトなど、どの...

Vue は無限ロードウォーターフォールフローを実装します

この記事では、参考までに、無限ロードウォーターフォールフローを実現するためのVueの具体的なコードを...