psshシリーズツール

17415 ワード

一、psshの概要とインストール
まずpsshとは何かを理解してみましょう.それは何に使いますか.psshはpythonが複数のサーバでコマンドを実行できるツールを記述したり、ファイルのコピーを実現したりするツールです.すなわち、複数のサーバを一括管理する小さなツールです.多くのホストで同じコマンドを実行する必要があります.以前はスクリプトを作成し、ループを書いて、実行するコマンドを書く必要がありました.面倒な感じがします.psshというツールがあれば、スクリプトを作成して完成する必要がありません.psshで複数のホストを管理するのは、自分のホストでコマンドを実行するように、スクリプトを作成しないと、複数のホストを管理できます.次にpsshをインストールしましょう
1、psshパッケージ情報の表示
[root@test ~]# yum info pssh
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
Available Packages
Name        : pssh
Arch        : noarch
Version     : 2.3.1
Release     : 5.el6
Size        : 50 k
Repo        : epel
Summary     : Parallel SSH tools
URL         : http://code.google.com/p/parallel-ssh/
License     : BSD
Description : This package provides various parallel tools based on ssh and scp.
            : Parallell version includes:
            :  o ssh : pssh
            :  o scp : pscp
            :  o nuke : pnuke
            :  o rsync : prsync
            :  o slurp : pslurp
[root@test ~]#

説明:psshというパッケージの主な機能は、pssh、pscp、pnuke、prsync、pslurpの5つのツールを含むsshとscpベースのコマンドラインツールを提供することです.このパッケージのソースはepelなので、表示とインストールの前に自分のepelソースを用意してください.
2、psshパッケージのインストール
[root@test ~]# yum install -y pssh

二、psshツールの使用
psshコマンドのオプションは次のとおりです.
--version:バージョン情報の表示
[root@test ~]# pssh --version
2.3.1
[root@test ~]#

-h:ホストファイルリスト、コンテンツフォーマット「[user@]host[:port]」
[root@docker test]#cat > iplist << EOF
> [email protected]
> [email protected]
> [email protected]
> EOF
[root@docker test]#cat iplist 
[email protected]
[email protected]
[email protected]
[root@docker test]#pssh -h iplist 'ls -l'
[1] 22:08:50 [SUCCESS] [email protected]
[2] 22:08:50 [SUCCESS] [email protected]
[3] 22:08:50 [SUCCESS] [email protected]
[root@docker test]#

説明:以上のコマンドは、私のiplistで定義したホスト上でls-lコマンドを実行することを意味します.ここで、psshのデフォルトはkey認証に基づいてリモートホストに接続されているので、私は上記のコマンドを実行してパスワードを入力していません.
-H:ホスト文字列、コンテンツ形式「[user@]host[:port]」.
[root@docker ~]#pssh -H 192.168.0.128 'ls /'  
[1] 22:17:40 [SUCCESS] 192.168.0.128
[root@docker ~]#

説明:-Hはホストを指定するオプションです.もちろん、複数のホストを指定します.-Hで1つずつ指定するか、-Hで複数のホストを指定します.ただし、各ホストはスペースで区切られており、複数のホストは引用符で囲まれています.
-A:手動入力パスワードモード
[root@docker ~]#pssh -H [email protected]:41319 -A 'ls'   
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password: 
[1] 22:40:20 [SUCCESS] [email protected]:41319
[root@docker ~]#

説明:psshのデフォルトはsshのkey検証でコマンドを実行します.SSHkey検証をしていないホストを管理する場合は、手動でパスワードを入力するモードをAで指定できます.sshのkey認証によるログインについては、本人のブログを参照してください.https://www.cnblogs.com/qiuhom-1874/p/11783371.html
-i:各サーバ内部処理情報出力
[root@docker ~]#pssh -h test/iplist -i 'ip addr show'
[1] 22:44:31 [SUCCESS] [email protected]
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth1:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:41:ff:c0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.128/24 brd 192.168.0.255 scope global eth1
    inet6 fe80::20c:29ff:fe41:ffc0/64 scope link 
       valid_lft forever preferred_lft forever
[2] 22:44:31 [FAILURE] [email protected] Exited with error code 127
Stderr: bash: ip: command not found
[3] 22:44:31 [SUCCESS] [email protected]
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:98:0a:46 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.217/24 brd 192.168.0.255 scope global dynamic ens33
       valid_lft 4184sec preferred_lft 4184sec
    inet6 fe80::f565:ff52:6ab3:b9da/64 scope link 
       valid_lft forever preferred_lft forever
3: virbr0:  mtu 1500 qdisc noqueue state DOWN qlen 1000
    link/ether 52:54:00:f8:82:a0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic:  mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
    link/ether 52:54:00:f8:82:a0 brd ff:ff:ff:ff:ff:ff
[root@docker ~]#

説明:オプション-iを指定しない場合、psshはデフォルトでは実行コマンドの成功と失敗状態のみを出力し、実行結果情報は印刷されません.-iを使用すると、各ホストでコマンドを実行した結果と、コマンドの実行に成功したかどうかを一括して表示できます.上にcentos 6のホストにiprouteパッケージがインストールされていないため、デフォルトではipというコマンドがないため、コマンドは成功しませんでした.
-lログインで使用するユーザー名
[root@docker ~]#pssh -H 192.168.0.218 -l qiuhom -i 'whoami'
[1] 22:49:46 [SUCCESS] 192.168.0.218
qiuhom
[root@docker ~]#pssh -H 192.168.0.218 -l root -i -A 'whoami'   
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password: 
[1] 22:50:03 [SUCCESS] 192.168.0.218
root
[root@docker ~]#

説明:-lオプションは、リモートホスト上のユーザーであるそのユーザーがコマンドを実行することを指定します.通常-l(小文字L)と-Aを組み合わせて使用します.
-o:出力されたファイルディレクトリ
[root@docker ~]#pssh -o /root/dr1/ -h test/iplist 'ls /'
[1] 23:02:44 [SUCCESS] [email protected]
[2] 23:02:44 [SUCCESS] [email protected]
[3] 23:02:44 [SUCCESS] [email protected]
[root@docker ~]#tree /root/dr1/
/root/dr1/
├── [email protected]
├── [email protected]
└── [email protected]

0 directories, 3 files
[root@docker ~]#cat /root/dr1/[email protected] 
bin
boot
dev
etc
home
lib
lib64
lost+found
media
misc
mnt
net
opt
proc
root
sbin
selinux
srv
sys
tmp
usr
var
[root@docker ~]#

説明:-oは、コマンド実行の結果をホスト名のファイル格納場所に出力することを指定します.つまり、コマンド実行後の結果はホスト名のファイルに保存され、-oはディレクトリを指定してファイルを保存します.
-t:TIMEOUTタイムアウト時間設定、0無限
[root@docker ~]#pssh -t 3 -h test/iplist -i 'ping 8.8.8.8'
[1] 23:09:39 [FAILURE] [email protected] Timed out, Killed by signal 9
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=52 time=53.5 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=52 time=53.6 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=52 time=53.5 ms
[2] 23:09:39 [FAILURE] [email protected] Timed out, Killed by signal 9
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=52 time=54.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=52 time=53.8 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=52 time=53.4 ms
[3] 23:09:39 [FAILURE] [email protected] Timed out, Killed by signal 9
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=52 time=53.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=52 time=53.9 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=52 time=53.6 ms
[root@docker ~]#

以上がpsshツールの一般的なオプションの説明と使い方です.
三、pscp.psshコマンドオプションの説明と使用
pscp.pssh機能は、ローカルファイルをリモートホストに一括コピーすることです.
コマンドの使用方法:
pscp.pssh [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] local remote

説明:pscp.pssh以上の多くの選択肢はpsshの使い方と同じです.例えば-A-H-h-lなどです.
-v:レプリケーション・プロシージャの表示
-r:ディレクトリを再帰的にコピー
[root@docker ~]#pscp.pssh -r -h test/iplist scripts/ /home/
[1] 23:27:57 [SUCCESS] [email protected]
[2] 23:27:57 [FAILURE] [email protected] Exited with error code 1
[3] 23:27:57 [SUCCESS] [email protected]
[root@docker ~]#pssh -h test/iplist -i 'ls /home/'
[1] 23:28:30 [SUCCESS] [email protected]
abc
admin
scripts
tom
[2] 23:28:30 [SUCCESS] [email protected]
qiuhom
testuser1
[3] 23:28:31 [SUCCESS] [email protected]
roo
scripts
tom
[root@docker ~]#

説明:指定したディレクトリをターゲットホストに再帰的にコピーしたのを見ることができます.上にホストが失敗しました.そのホスト上には普通のユーザーが作ったSSH key認証があるからです.私たちはqiuhomという普通のユーザーの身分を使ってリモートホストで管理しています.qiuhomという普通のユーザーは/home/ディレクトリに書く権限がないので、実行に失敗しました.
例:
ローカルの単一ファイルをリモートホストにコピー
[root@docker ~]#pssh -H [email protected] -i 'ls -l /home/qiuhom/'
[1] 23:39:53 [SUCCESS] [email protected]
    0
[root@docker ~]#pscp.pssh  -H [email protected] /etc/fstab /home/qiuhom/
[1] 23:40:26 [SUCCESS] [email protected]
[root@docker ~]#pssh -H [email protected] -i 'ls -l /home/qiuhom/'  
[1] 23:40:29 [SUCCESS] [email protected]
    4
-rw-r--r--. 1 qiuhom qiuhom 552 11   8 23:40 fstab
[root@docker ~]#

ローカルの複数のファイルをリモートホストにコピー
[root@docker ~]#pssh -H [email protected] -i 'ls -l /home/qiuhom/'  
[1] 23:40:29 [SUCCESS] [email protected]
    4
-rw-r--r--. 1 qiuhom qiuhom 552 11   8 23:40 fstab
[root@docker ~]#pscp.pssh -H [email protected] /root/f1 /etc/inittab /var/log/messages /home/qiuhom/
[1] 23:42:01 [SUCCESS] [email protected]
[root@docker ~]#pssh -H [email protected] -i 'ls -l /home/qiuhom/'                              
[1] 23:42:06 [SUCCESS] [email protected]
    248
-rw-r--r--. 1 qiuhom qiuhom     18 11   8 23:41 f1
-rw-r--r--. 1 qiuhom qiuhom    552 11   8 23:40 fstab
-rw-r--r--. 1 qiuhom qiuhom    511 11   8 23:41 inittab
-rw-------. 1 qiuhom qiuhom 239787 11   8 23:41 messages
[root@docker ~]#

ローカルディレクトリをリモートホストに一括コピー
[root@docker ~]#pssh -H 192.168.0.128 -i 'ls -l /home/'
[1] 23:51:31 [SUCCESS] 192.168.0.128
    0
[root@docker ~]#pscp.pssh -H 192.168.0.128 -r /etc/sysconfig/network-scripts/ /home/
[1] 23:52:32 [SUCCESS] 192.168.0.128
[root@docker ~]#pssh -H 192.168.0.128 -i 'ls -l /home/'
[1] 23:52:53 [SUCCESS] 192.168.0.128
    4
drwxr-xr-x 2 root root 4096 10  25 03:36 network-scripts
[root@docker ~]#

四、pslurpコマンドの使用
pslurpコマンドの機能は、リモートホストのファイルをローカルに一括コピーすることです.
コマンドの使用方法:
pslurp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par][-o outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] [-L localdir] remote local(   )

説明:このツールの使い方とpscp.psshの使い方は似ていますが、ファイルの操作です.pscp.psshはリモートホストにプッシュされ、pslurpはリモートホストからファイルをローカルにプルします.
-L:リモートホストからローカルにダウンロードしたストレージのディレクトリを指定します.localはローカルにダウンロードした名前です.
-r:ディレクトリを再帰的にコピー
例:
ターゲットサーバのpasswdファイルを/rootに一括ダウンロードし、userと名前を付けます.
[root@docker ~]#ll
    4
drwxr-xr-x 2 root root  24 8   31 18:04 ansible
drwxr-xr-x 7 root root  95 7   11 11:21 docker-training
drwxr-xr-x 2 root root  86 11   8 23:02 dr1
-rw-r--r-- 1 root root  18 11   8 23:20 f1
drwxr-xr-x 2 root root  42 10  24 21:51 scripts
drwxr-xr-x 2 root root  47 7   22 10:11 temp
drwxr-xr-x 2 root root 100 11   8 23:20 test
[root@docker ~]#pslurp -h test/iplist  -L /root/ /etc/passwd user
[1] 00:03:00 [SUCCESS] [email protected]
[2] 00:03:00 [SUCCESS] [email protected]
[3] 00:03:04 [SUCCESS] [email protected]
[root@docker ~]#ls
192.168.0.128  192.168.0.217  192.168.0.218  ansible  docker-training  dr1  f1  scripts  temp  test
[root@docker ~]#ll 192.168.0.128/
    4
-rw-r--r-- 1 root root 1262 11   9 00:03 user
[root@docker ~]#cat 192.168.0.128/user 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
abc:x:500:500::/home/abc:/bin/bash
admin:x:501:501::/home/admin:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
apache:x:48:48:Apache:/var/www:/sbin/nologin
tom:x:502:502::/home/tom:/bin/bash
[root@docker ~]#

説明:-Lはリモートホストからダウンロードしたファイルを格納する場所を指定し、各ホストのファイルは指定したローカルディレクトリの下にリモートホストipという名前のディレクトリ名の下に置かれ、ファイル名は私たちが指定したファイル名です.
リモートホスト192.168.0.128の/etc/profile.d/ディレクトリをローカルホストにダウンロード
[root@docker test]#ll
    4
-rw-r--r-- 1 root root 59 11   8 22:04 iplist
[root@docker test]#pslurp -r -H 192.168.0.128 /etc/profile.d/ .
[1] 00:30:09 [SUCCESS] 192.168.0.128
[root@docker test]#tree
.
├── 192.168.0.128
│   └── profile.d
│       ├── colorls.csh
│       ├── colorls.sh
│       ├── cvs.csh
│       ├── cvs.sh
│       ├── glib2.csh
│       ├── glib2.sh
│       ├── lang.csh
│       ├── lang.sh
│       ├── less.csh
│       ├── less.sh
│       ├── modules.csh
│       ├── modules.sh
│       ├── vim.csh
│       ├── vim.sh
│       └── which2.sh
└── iplist

2 directories, 16 files

説明:ファイルをローカルに保存する名前を指定しない場合は、デフォルトでは、現在のディレクトリの下にあるリモートホストipという名前のディレクトリの下に保存されます.ファイル名は、リモートホスト上のファイル名をダウンロードします.
五、pnukeコマンドの使用
pnukeコマンドの機能は、複数のホスト上でプロセスを並列に殺すプログラムです.
コマンドの使用方法:
pnuke  [-vA]  [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] pattern

説明:以上のオプションはpsshオプションと一致しています.
例:
リモートホストhttpdプロセスを殺す
[root@docker test]#pssh -h iplist -i 'ss -ntl |grep 80' 
[1] 01:17:48 [SUCCESS] [email protected]
LISTEN     0      128                      :::80                      :::*     
[2] 01:17:48 [SUCCESS] [email protected]
LISTEN     0      128                      :::80                      :::*     
[3] 01:17:48 [SUCCESS] [email protected]
LISTEN     0      128         :::80                      :::*                  
[root@docker test]#pnuke -h iplist httpd
[1] 01:18:18 [SUCCESS] [email protected]
[2] 01:18:19 [SUCCESS] [email protected]
[3] 01:18:19 [SUCCESS] [email protected]
[root@docker test]#pssh -h iplist -i 'ss -ntl |grep 80'
[1] 01:18:23 [FAILURE] [email protected] Exited with error code 1
[2] 01:18:23 [FAILURE] [email protected] Exited with error code 1
[3] 01:18:23 [FAILURE] [email protected] Exited with error code 1
[root@docker test]#

説明:httpdリスニングの80ポートコマンドの実行ステータスのフィルタリングに失敗したことがわかります.これは、リモートホストで80ポートでプロセスがリスニングされていないことを示します.
六、prsyncコマンドの使用
prsyncコマンドの機能は、ファイルを複数のホストに並列にコピーすることです.
コマンドの使用方法:
prsync  [-vAraz] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir] [-t time‐out] [-O options] [-x args] [-X arg] [-S args] local remote

説明:以上のオプションはpsshコマンドオプションと似ています.
例:
サーバへのファイルのコピー
[root@docker test]#pssh -h iplist -i 'ls -l /root/'
[1] 01:35:19 [SUCCESS] [email protected]
    4
-rw-r--r-- 1 root root 552 10  25 05:19 fs
[2] 01:35:19 [SUCCESS] [email protected]
    4
-rw-r--r--. 1 root root 552 11   9 01:34 fs
[3] 01:35:19 [SUCCESS] [email protected]
    4
-rw-r--r--. 1 root root 552 11   9 01:35 fs
[root@docker test]#prsync -h iplist /etc/inittab /root/init/
[1] 01:35:52 [SUCCESS] [email protected]
[2] 01:35:52 [SUCCESS] [email protected]
[3] 01:35:52 [SUCCESS] [email protected]
[root@docker test]#pssh -h iplist -i 'ls -l /root/'
[1] 01:36:01 [SUCCESS] [email protected]
    8
-rw-r--r-- 1 root root  552 10  25 05:19 fs
drwxr-xr-x 2 root root 4096 10  25 05:19 init
[2] 01:36:01 [SUCCESS] [email protected]
    8
-rw-r--r--. 1 root root  552 11   9 01:34 fs
drwxr-xr-x. 2 root root 4096 11   9 01:35 init
[3] 01:36:01 [SUCCESS] [email protected]
    4
-rw-r--r--. 1 root root 552 11   9 01:35 fs
drwxr-xr-x. 2 root root  21 11   9 01:35 init
[root@docker test]#

説明:prsyncの使い方とpscp.psshの使い方は似ていますが、その違いはpscpです.psshはディレクトリの作成をサポートしません(リモートサーバでディレクトリが指定されていない場合は作成します).prsyncはサポートします.pscp.psshは、ローカルの異なる複数のファイルをリモート・サービス・エンドに同時にコピーすることをサポートしますが、prsyncはサポートしていません.
サーバへのディレクトリのコピー
[root@docker test]#pssh -h iplist -i 'rm -rf /root/*' 
[1] 01:45:21 [SUCCESS] [email protected]
[2] 01:45:21 [SUCCESS] [email protected]
[3] 01:45:21 [SUCCESS] [email protected]
[root@docker test]#pssh -h iplist -i 'ls -l /root/'        
[1] 01:45:38 [SUCCESS] [email protected]
    0
[2] 01:45:38 [SUCCESS] [email protected]
    0
[3] 01:45:38 [SUCCESS] [email protected]
    0
[root@docker test]#prsync  -r -h iplist /root/scripts/ /root/aaa/
[1] 01:46:20 [SUCCESS] [email protected]
[2] 01:46:21 [SUCCESS] [email protected]
[3] 01:46:21 [SUCCESS] [email protected]
[root@docker test]#pssh -h iplist -i 'ls -l /root/'
[1] 01:46:42 [SUCCESS] [email protected]
    4
drwxr-xr-x 2 root root 4096 10  25 05:30 aaa
[2] 01:46:42 [SUCCESS] [email protected]
    4
drwxr-xr-x. 2 root root 4096 11   9 01:46 aaa
[3] 01:46:42 [SUCCESS] [email protected]
    0
drwxr-xr-x. 2 root root 42 11   9 01:46 aaa
[root@docker test]#

説明:ディレクトリとpscp.psshの使い方と同様に、-rオプションを追加する必要があります.