PSSHを使用してLinuxサーバーを一括管理する

PSSHを使用してLinuxサーバーを一括管理する

pssh は、多数のマシンでのバッチ ssh 操作に使用される、Python で実装されたオープン ソース ソフトウェアです。pssh は、複数のサーバーでコマンドを実行できるツールであり、ファイルのコピーもサポートしているため、この種のツールとしては優れています。for ループ アプローチよりも pssh を使用することをお勧めします。 pssh を使用する前提は、ローカル マシンと他のサーバー上でキー認証アクセス (つまり、ssh 信頼関係) を構成する必要があることです。

以下は pssh を使用したバッチ操作の記録です。

1) psshをインストールする
yum 経由で直接インストールできます:

[root@bastion-IDC ~]# yum install -y pssh

2) psshの使用

[root@bastion-IDC ~]# pssh --help

-h コマンドを実行するためのリモートホストリストファイル
-H user@ip:port ファイル内容フォーマット [user@]host[:port]
-l リモートマシンのユーザー名
-p 一度に許可される接続の最大数
-o 出力をファイルにリダイレクトする
-e 実行エラーをファイルにリダイレクトする
-tはコマンド実行のタイムアウトを設定します
-A はパスワードの入力を促し、それを ssh に渡します (このパラメータは追加後のプロンプトのみであり、適当に入力するか、入力せずに Enter キーを押すことができます)
-O sshパラメータの特定の設定を設定します。ssh_config設定ファイルを参照してください。
-x は複数の SSH コマンドを渡します。複数のコマンドはスペースで区切られ、引用符で囲まれます。
-X -xと同じですが、一度に渡せるコマンドは1つだけです
-i 各ホストの実行後に標準出力と標準エラーを表示する
-I 各入力コマンドを読み取り、sshプロセスに渡して、コマンドスクリプトを標準入力にパイプできるようにします。

3) psshインスタンスの説明

[root@bastion-IDC ~]# cat hosts.txt // リスト ファイル内の情報形式は「ip:port」です。ローカル マシンとリモート マシンで使用される ssh ポートが同じ場合は、ポートを省略して IP を直接使用できます。ただし、すべてのポートを持参することをお勧めします。
192.168.1.101:22
192.168.1.109:22
192.168.1.118:25791
192.168.1.105:25791
上記のように、4 台のマシンはリスト ファイル hosts.txt に配置されています。ローカル マシンは、ssh パスワードなしログインのために、これらの 4 台のマシンと信頼関係を確立しています。注意: リスト ファイル内のマシンは、事前にローカル マシンと ssh 信頼関係を確立している必要があります。そうしないと、pssh をバッチで実行したときに、信頼関係を確立していないマシンの順番になっても実行されません。

a) コマンドのバッチ実行

[root@bastion-IDC ~]# pssh -h hosts.txt -l root -i 'uptime'
[1] 16:05:48 [成功] 192.168.1.105
03:03:25 79 日間稼働、13:44、ユーザー 0 人、負荷平均: 0.04、0.01、0.00
[2] 16:05:48 [成功] 192.168.1.118
03:03:32 75 日間稼働、15:27、ユーザー 4 人、負荷平均: 0.96、0.74、0.45
Stderr: アドレス 192.168.1.118 は localhost にマップされますが、これはアドレスにマップされません - 侵入の試みの可能性があります。
[3] 16:05:48 [成功] 192.168.1.109
03:03:25 61 日間稼働、21:56、ユーザー 2 人、負荷平均: 0.02、0.06、0.18
Stderr: アドレス 192.168.1.102 は localhost にマップされますが、これはアドレスにマップされません - 侵入の試みの可能性があります。
[4] 16:05:48 [成功] 192.168.1.101
16:03:17 35 日間稼働、23:45、ユーザー 1 人、負荷平均: 0.03、0.04、0.01
Stderr: アドレス 192.168.1.101 は localhost にマップされますが、これはアドレスにマップされません - 侵入の試みの可能性があります。

-A パラメータを追加すると、事前に ssh 信頼関係を設定している場合でも、パスワードの入力を求められます。

[root@bastion-IDC ~]# pssh -h hosts.txt -l root -i -A 'uptime'
警告: 他のユーザーがスーパーユーザーである場合はパスワードを入力しないでください
アカウントへの権限またはアクセス権。
パスワード: // このパラメータは追加後のリマインダーとしてのみ使用されることに注意してください。ここに何かを入力することも、何も入力せずに Enter キーを押すこともできます。
[1] 16:08:25 [成功] 192.168.1.105
03:06:03 79 日間稼働、13:46、ユーザー 0 人、負荷平均: 0.00、0.00、0.00
[2] 16:08:25 [成功] 192.168.1.109
03:06:03 61 日間稼働、21:59、ユーザー 2 人、負荷平均: 0.00、0.04、0.15
Stderr: アドレス 192.168.1.102 は localhost にマップされますが、これはアドレスにマップされません - 侵入の試みの可能性があります。
[3] 16:08:25 [成功] 192.168.1.101
16:05:54 35 日間稼働、23:47、ユーザー 1 人、負荷平均: 0.00、0.02、0.00
Stderr: アドレス 192.168.1.101 は localhost にマップされますが、これはアドレスにマップされません - 侵入の試みの可能性があります。
[4] 16:08:25 [成功] 192.168.1.118
03:06:10 75 日間稼働、15:29、ユーザー 4 人、負荷平均: 0.85、0.78、0.51
Stderr: アドレス 192.168.1.118 は localhost にマップされますが、これはアドレスにマップされません - 侵入の試みの可能性があります。
[root@bastion-IDC ~]# pssh -h hosts.txt -l root -i -t 10 -o /root/pssh.log '稼働時間 && 日付'
[1] 17:01:02 [成功] 192.168.1.109
03:58:33 79 日間稼働、5:58、ユーザー 1 人、負荷平均: 0.00、0.00、0.00
2017年2月8日水曜日 03:58:33 EST
[2] 17:01:02 [成功] 192.168.1.105
03:58:40 79 日間稼働、14:39、ユーザー 1 人、負荷平均: 0.00、0.00、0.00
2017年2月8日水曜日 03:58:40 EST
[3] 17:01:02 [成功] 192.168.1.101
16:58:31 36 日、40 分、1 ユーザー、負荷平均: 0.10、0.03、0.01
2017年2月8日水曜日 16:58:31 CST
Stderr: アドレス 192.168.1.101 は localhost にマップされますが、これはアドレスにマップされません - 侵入の試みの可能性があります。
[4] 17:01:02 [成功] 192.168.1.118
03:58:47 75 日間稼働、16:22、ユーザー 3 人、負荷平均: 0.20、0.21、0.31
2017年2月8日水曜日 03:58:47 EST
Stderr: アドレス 192.168.1.118 は localhost にマップされますが、これはアドレスにマップされません - 侵入の試みの可能性があります。
[root@bastion-IDC ~]# ll /root/pssh.log/
合計 16
-rw-r--r--. 1 ルート ルート 100 2月8日 17:01 192.168.1.101
-rw-r--r--。1 ルート ルート 99 2月 8日 17:01 192.168.1.105
-rw-r--r--。1 ルート ルート 99 2月 8日 17:01 192.168.1.109
-rw-r--r--。1 ルート ルート 100 2月8日 17:01 192.168.1.118

b) ファイルまたはディレクトリを一括アップロードする (pscp.pssh コマンド)
ローカル ファイル /mnt/test.file をリモート サーバーの /tmp ディレクトリに一括アップロードします。

[root@bastion-IDC ~]# pscp.pssh -l root -h hosts.txt /mnt/test.file /tmp/
[1] 16:18:05 [成功] 192.168.1.105
[2] 16:18:05 [成功] 192.168.1.109
[3] 16:18:05 [成功] 192.168.1.101
[4] 16:18:05 [成功] 192.168.1.118

ローカル ファイル /mnt/test.file、/mnt/aa.file、/mnt/bb.file をリモート サーバーの /tmp ディレクトリに一括アップロードします。

[root@bastion-IDC ~]# pscp.pssh -l root -h hosts.txt /mnt/test.file /mnt/aa.file /mnt/bb.file /tmp/
[1] 16:22:50 [成功] 192.168.1.109
[2] 16:22:50 [成功] 192.168.1.105
[3] 16:22:50 [成功] 192.168.1.118
[4] 16:22:50 [成功] 192.168.1.101

または:

[root@bastion-IDC ~]# pscp.pssh -l root -h hosts.txt /mnt/{test.file,aa.file,bb.file} /tmp/
[1] 16:23:44 [成功] 192.168.1.109
[2] 16:23:44 [成功] 192.168.1.105
[3] 16:23:44 [成功] 192.168.1.101
[4] 16:23:44 [成功] 192.168.1.118

ローカル ディレクトリ /mnt/zhong をリモート サーバーの /tmp ディレクトリに一括アップロードします (ディレクトリをアップロードするときに -r パラメータを追加する必要があります)。

[root@bastion-IDC ~]# pscp.pssh -l root -h hosts.txt -r /mnt/zhong /tmp/
[1] 16:19:36 [成功] 192.168.1.109
[2] 16:19:36 [成功] 192.168.1.105
[3] 16:19:36 [成功] 192.168.1.101
[4] 16:19:36 [成功] 192.168.1.118

ローカルディレクトリ /mnt/zhong、/mnt/aa、/mnt/vv をリモートサーバーの /tmp ディレクトリに一括アップロードします。

[root@bastion-IDC ~]# pscp.pssh -l root -h hosts.txt -r /mnt/zhong /mnt/aa /mnt/vv /tmp/
[1] 16:21:02 [成功] 192.168.1.105
[2] 16:21:02 [成功] 192.168.1.109
[3] 16:21:02 [成功] 192.168.1.101
[4] 16:21:02 [成功] 192.168.1.118

または:

[root@bastion-IDC ~]# pscp.pssh -l root -h hosts.txt -r /mnt/{zhong,aa,vv} /tmp/
[1] 16:22:00 [成功] 192.168.1.109
[2] 16:22:00 [成功] 192.168.1.105
[3] 16:22:00 [成功] 192.168.1.101
[4] 16:22:00 [成功] 192.168.1.118

c) ファイルまたはディレクトリを一括ダウンロードする (pslurp コマンド)
サーバーからローカル コンピューターに特定のファイルを一括ダウンロードします。pssh はダウンロードしたファイルを保存するために、ファイル リスト内の IP アドレスにちなんで名付けられたディレクトリを作成するため、名前の重複を心配する必要はありません。

[root@bastion-IDC ~]# pslurp -l root -h hosts.txt /etc/hosts 。
[1] 16:32:01 [成功] 192.168.1.109
[2] 16:32:01 [成功] 192.168.1.105
[3] 16:32:01 [成功] 192.168.1.101
[4] 16:32:01 [成功] 192.168.1.118
[root@bastion-IDC ~]# ll
合計 123
drwxr-xr-x. 2 ルート ルート 4096 2月8日 16:32 192.168.1.101
drwxr-xr-x. 2 ルート ルート 4096 2月8日 16:32 192.168.1.105
drwxr-xr-x. 2 ルート ルート 4096 2月8日 16:32 192.168.1.109
drwxr-xr-x. 2 ルート ルート 4096 2月8日 16:32 192.168.1.118
[root@bastion-IDC ~]# ll 192.168.1.101
合計 4
-rw-r--r--。1 ルート ルート 224 2月 8 16:32 ホスト
[root@bastion-IDC ~]# ll 192.168.1.109
合計 4
-rw-r--r--。1 ルート ルート 252 2月 8 16:32 ホスト
[root@bastion-IDC ~]# ll 192.168.1.105
合計 4
-rw-r--r--。1 ルート ルート 252 2月 8 16:32 ホスト
[root@bastion-IDC ~]# ll 192.168.1.118
合計 4
-rw-r--r--。1 ルート ルート 212 2月 8 16:32 ホスト

以下の点にも特に注意してください:
上記のバッチ ダウンロード操作は、ローカルの現在のディレクトリにのみダウンロードでき、コマンドで指定されたパスを続けることはできません。

[root@bastion-IDC ~]# pslurp -l root -h hosts.txt /etc/hosts /mnt/
[1] 16:34:14 [失敗] 192.168.1.109 エラーコード1で終了しました
[2] 16:34:14 [失敗] 192.168.1.105 エラーコード1で終了しました
[3] 16:34:14 [失敗] 192.168.1.101 エラーコード1で終了しました
[4] 16:34:14 [失敗] 192.168.1.118 エラーコード1で終了しました

ローカルの /mnt ディレクトリにダウンロードする場合、正しい方法は、まず /mnt ディレクトリに切り替えてから、ダウンロード コマンドを実行することです (リスト ファイルはフル パスに従う必要があります)。

[root@bastion-IDC ~]# cd /mnt/
[root@bastion-IDC mnt]# pslurp -l root -h /root/hosts.txt /etc/hosts ./
[1] 16:34:34 [成功] 192.168.1.109
[2] 16:34:34 [成功] 192.168.1.105
[3] 16:34:34 [成功] 192.168.1.118
[4] 16:34:34 [成功] 192.168.1.101
[root@bastion-IDC mnt]# ll
合計 16
drwxr-xr-x. 2 ルート ルート 4096 2月8日 16:34 192.168.1.101
drwxr-xr-x. 2 ルート ルート 4096 2月8日 16:34 192.168.1.105
drwxr-xr-x. 2 ルート ルート 4096 2月8日 16:34 192.168.1.109
drwxr-xr-x. 2 ルート ルート 4096 2月8日 16:34 192.168.1.118

上記はファイルのバッチダウンロード用です。ディレクトリをバッチダウンロードしたい場合は、-r パラメータを追加するだけです。

[root@bastion-IDC mnt]# pslurp -l root -h /root/hosts.txt -r /home/ ./
[1] 16:39:05 [成功] 192.168.1.109
[2] 16:39:05 [成功] 192.168.1.105
[3] 16:39:05 [成功] 192.168.1.101
[4] 16:39:05 [成功] 192.168.1.118
[root@bastion-IDC mnt]# ll 192.168.1.101
合計 8
drwxr-xr-x. 6 ルート ルート 4096 2月8日 16:39 ホーム
-rw-r--r--。1 ルート ルート 224 2月 8 16:38 ホスト
[root@bastion-IDC mnt]# ll 192.168.1.*
192.168.1.101:
合計 8
drwxr-xr-x. 6 ルート ルート 4096 2月8日 16:39 ホーム
-rw-r--r--。1 ルート ルート 224 2月 8 16:38 ホスト
192.168.1.105:
合計 8
drwxr-xr-x. 4 ルート ルート 4096 2月8日 16:39 ホーム
-rw-r--r--。1 ルート ルート 252 2月 8 16:38 ホスト
192.168.1.109:
合計 8
drwxr-xr-x. 4 ルート ルート 4096 2月8日 16:39 ホーム
-rw-r--r--。1 ルート ルート 252 2月 8 16:38 ホスト
192.168.1.118:
合計 8
drwxr-xr-x. 3 ルート ルート 4096 2月8日 16:39 ホーム
-rw-r--r--。1 ルート ルート 212 2月 8 16:38 ホスト

d) バッチ同期(prsyncコマンド)
ローカルの /mnt/test ディレクトリ内のファイルまたはディレクトリをリモート マシンの /mnt/test パスに同期します。

[root@bastion-IDC ~]# prsync -l root -h hosts.txt -r /mnt/test/ /mnt/test/
[1] 16:46:41 [成功] 192.168.1.109
[2] 16:46:41 [成功] 192.168.1.105
[3] 16:46:41 [成功] 192.168.1.118
[4] 16:46:41 [成功] 192.168.1.101

ローカルの /mnt/test ディレクトリ内のファイルまたはディレクトリをリモート マシンの /mnt パスに同期します。

[root@bastion-IDC ~]# prsync -l root -h hosts.txt -r /mnt/test/ /mnt/
[1] 16:47:40 [成功] 192.168.1.109
[2] 16:47:40 [成功] 192.168.1.105
[3] 16:47:45 [成功] 192.168.1.101
[4] 16:47:46 [成功] 192.168.1.118

知らせ:
上記のバッチ同期ディレクトリ操作は、ローカルマシンの対応するディレクトリデータをリモートマシンに同期することです。リモートマシンのディレクトリ内の冗長ファイルも保持されます(冗長ファイルは削除されません)。

同様に、バッチ同期ファイル操作の場合は、-r パラメータを削除します。
注意: ファイルを同期すると、実際には完全な上書きが行われ、リモート マシン上の対応するファイル内のすべてのファイルが置き換えられます。
次のように:
ローカルの /mnt/test/file ファイルの内容をリモート サーバーの /mnt/test/file ファイルに同期します。

[root@bastion-IDC ~]# prsync -l root -h hosts.txt /mnt/test/file /mnt/test/file
[1] 16:53:54 [成功] 192.168.1.109
[2] 16:53:54 [成功] 192.168.1.105
[3] 16:53:54 [成功] 192.168.1.101
[4] 16:53:54 [成功] 192.168.1.118
[root@bastion-IDC ~]# prsync -l root -h hosts.txt /mnt/test/file /mnt/aaa
[1] 16:54:03 [成功] 192.168.1.109
[2] 16:54:03 [成功] 192.168.1.105
[3] 16:54:03 [成功] 192.168.1.101
[4] 16:54:04 [成功] 192.168.1.118

e) リモートマシン上のプロセスを一括で強制終了する (pnuke コマンド)
たとえば、リモートマシン上のnginxプロセスをバッチで強制終了する

[root@bastion-IDC ~]# pnuke -h hosts.txt -l root nginx
[1] 17:09:14 [成功] 192.168.1.109
[2] 17:09:14 [成功] 192.168.1.105
[3] 17:09:15 [成功] 192.168.1.118
[4] 17:09:15 [成功] 192.168.1.101

以下もご興味があるかもしれません:
  • リモートサーバーにアクセスするためのSSHエイリアス設定
  • Windows で winscp とバッチ処理を使用して、SSH ポート経由で Linux サーバーにファイルをアップロードする
  • Python の Paramiko モジュールは、Linux サーバーにログインするための SSH 接続を実装します。
  • SSH経由でLinuxサーバーにファイルやフォルダをアップロードする方法
  • WindowsにOpenSSHをインストールし、SSHキーを生成してLinuxサーバーにログインします。
  • Linux サーバーで安全な SSH アクセスを構成するための 4 つのヒント
  • Linux VPS とサーバーのより安全な設定 Putty SSH でキーログインを使用する
  • LinuxサーバのSSHクラッキング防止方法(推奨)
  • Linux で SSH サーバー エイリアスを作成する 2 つの方法

<<:  Linux (Ubuntu) での MySQL 5.7.17 のインストールと設定のチュートリアル

>>:  Vueはシンプルな計算機能を実装します

推薦する

Nginx を使用して DoNetCore を Alibaba Cloud にデプロイする方法

基本的な環境設定まずはご自身でドメイン名とサーバーを購入してくださいクラウドサーバーECSに基づいて...

表のセル間の境界線/区切り線を非表示にする方法

上の境界線のみを表示する <table frame=above>下の境界線のみを表示する...

Axios の二次カプセル化の例 プロジェクトのデモ

1. なぜパッケージングを行うのですか?全体的なコード呼び出し、リクエストの公開処理、パーソナライズ...

アニメーションの再生と一時停止を制御するための CSS のヒント (非常に実用的)

今日は、CSS を使用してアニメーションの再生と一時停止を制御する非常に簡単なトリックを紹介します。...

js を使用してファイルが UTF-8 でエンコードされているかどうかを判断する方法

従来の解決策FileReader を使用して UTF-8 形式のファイルを読み取り、ファイルの内容に...

Linuxシステムにmsfをインストールするプロセスの詳細な説明

または、インストールプロセスを自分で書き留めてください。私のサーバーシステムはAliyun Linu...

Vue h関数の使い方の詳しい説明

目次1. 理解2. 使用1. h() パラメータ2. 使い方が簡単3. カウンターケースを実装する4...

IMG での UserMap の使用例

usemap は <img> タグの属性であり、使用するイメージ マップの名前を指定する...

MySQL 8.0.23のルートパスワードをリセットするための最適なソリューション

この方法は2021年2月7日に編集されました。私が使用しているバージョンは8.0.23です。事件の原...

CSSは座席選択効果を実現するためにautoflow属性を使用する

1. 自動フロー属性、要素コンテンツの長さと幅が要素自体の長さと幅を超える場合、スクロールバーが表示...

最新の MySQL 5.7.23 のインストールと設定のグラフィックチュートリアル

2018 年の最新 MySQL 5.7 の詳細なインストールと設定は 4 つのステップに分かれており...

Docker で Java 8 Spring Boot アプリケーションを開発する方法

この記事では、ローカル マシンに Java 8 をインストールせずに、Java 8 を使用して簡単な...

display:olck/none を使用してメニューバーを作成する方法

display:bolck/none によるメニューバーの完成の効果 図 1:まず、完成したエフェク...

複数の HTML ページで HTML コードをまとめて呼び出す方法

方法 1: スクリプト方式を使用する:共通ヘッダー ファイル head.js または共通フッター フ...