自動化批量管理工具pssh - 運維小結

来源:https://www.cnblogs.com/xysr-tom/archive/2019/04/04/10656458.html
-Advertisement-
Play Games

pssh提供OpenSSH和相關工具的並行版本。包括pssh,pscp,prsync,pnuke和pslurp。該項目包括psshlib,可以在自定義應用程式中使用。pssh是python寫的可以併發在多台機器上批量執行命令的工具,它的用法可以媲美ansible的一些簡單用法,執行起來速度比ansi ...


pssh提供OpenSSH和相關工具的並行版本。包括psshpscpprsyncpnukepslurp。該項目包括psshlib,可以在自定義應用程式中使用。psshpython寫的可以併發在多台機器上批量執行命令的工具,它的用法可以媲美ansible的一些簡單用法,執行起來速度比ansible快它支持文件並行複製,遠程命令執行,殺掉遠程主機上的進程等等。殺手鐧是文件並行複製,,當進行再遠程主機批量上傳下載的時候,最好使用它。pssh用於批量ssh操作大批量機器;pssh是一個可以在多台伺服器上執行命令的工具,同時支持拷貝文件,是同類工具中很出色的;比起for迴圈的做法,更推薦使用pssh使用pssh的前提是:必須在本機與其他客戶機上配置好密鑰認證訪問(即ssh無密碼登錄信任關係)

下麵就說下使用pssh進行批量操作的記錄:

1)安裝pssh
方法一: yum安裝  (推薦這一種)
[root@bastion-IDC ~]# yum install -y pssh

方法二: python方式安裝 (註意需要安裝 python 2.4 或以上版本)
各版本下載地址: https://clsn.io/files/pssh/
百度下載地址:https://pan.baidu.com/s/1co3Hwoc0yI4LAKvXoXPzfg (提取密碼: d2jy

[root@bastion-IDC ~]# wget https://clsn.io/files/pssh/pssh-2.3.1.tar.gz
[root@bastion-IDC ~]# tar zxf pssh-2.3.1.tar.gz
[root@bastion-IDC ~]# cd pssh-2.3.1
[root@bastion-IDC pssh-2.3.1]# python setup.py install

2pssh用法
[root@bastion-IDC ~]# pssh --help
-h      執行命令的遠程主機列表文件 
-H      user@ip:port
文件內容格式[user@]host[:port] 
-l        遠程機器的用戶名 
-p       
一次最大允許多少連接 
-o       
輸出內容重定向到一個文件 
-e       
執行錯誤重定向到一個文件 
-t       
設置命令執行的超時時間 
-A      提示輸入密碼並且把密碼傳遞給ssh(註意這個參數添加後只是提示作用,隨便輸入或者不輸入直接回車都可以) 
-O     
設置ssh參數的具體配置,參照ssh_config配置文件 
-x     
傳遞多個SSH 命令,多個命令用空格分開,用引號括起來 
-X     
-x 但是一次只能傳遞一個命令 
-i      顯示標準輸出和標準錯誤在每台host執行完畢後 
-I     
讀取每個輸入命令,並傳遞給ssh進程 允許命令腳本傳送到標準輸入

3pssh實例說明
[root@bastion-IDC ~]# cat hosts.txt    //
列表文件內的信息格式是ip:,如果本機和遠程機器使用的ssh埠一致,則可以省去埠,直接用ip就行。不過建議還是將埠都帶上為好。
192.168.1.101:22
192.168.1.109:22
192.168.1.118:25791
192.168.1.105:25791
如上四台機器放在一個列表文件hosts.txt內,本機已經和這四台機器做了ssh無密碼登陸的信任關係
註意:列表文件內的機器必須提前和本機做好ssh信任關係,如果沒有做的話,那麼pssh批量執行時,輪到這台沒有做信任關係的機器時就不會執行。

a)批量執行命令
[root@bastion-IDC ~]# 
pssh -h hosts.txt -l root -i 'uptime'
[1] 16:05:48 
[SUCCESS] 192.168.1.105
03:03:25 up 79 days, 13:44, 0 users, load average: 0.04, 0.01, 0.00
[2] 16:05:48 
[SUCCESS] 192.168.1.118
03:03:32 up 75 days, 15:27, 4 users, load average: 0.96, 0.74, 0.45
Stderr: Address 192.168.1.118 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
[3] 16:05:48 
[SUCCESS] 192.168.1.109
03:03:25 up 61 days, 21:56, 2 users, load average: 0.02, 0.06, 0.18
Stderr: Address 192.168.1.102 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
[4] 16:05:48 
[SUCCESS] 192.168.1.101
16:03:17 up 35 days, 23:45, 1 user, load average: 0.03, 0.04, 0.01
Stderr: Address 192.168.1.101 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!

如果添加-A參數,那麼即使提前做了ssh信任關係,還是會提示輸入密碼!
[root@bastion-IDC ~]# 
pssh -h hosts.txt -l root -i -A 'uptime'
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:                          //註意這個參數添加後只是提示作用,可以在此隨便輸入或者不輸入直接回車都可以
[1] 16:08:25 [SUCCESS] 192.168.1.105
03:06:03 up 79 days, 13:46, 0 users, load average: 0.00, 0.00, 0.00
[2] 16:08:25 [SUCCESS] 192.168.1.109
03:06:03 up 61 days, 21:59, 2 users, load average: 0.00, 0.04, 0.15
Stderr: Address 192.168.1.102 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
[3] 16:08:25 [SUCCESS] 192.168.1.101
16:05:54 up 35 days, 23:47, 1 user, load average: 0.00, 0.02, 0.00
Stderr: Address 192.168.1.101 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
[4] 16:08:25 [SUCCESS] 192.168.1.118
03:06:10 up 75 days, 15:29, 4 users, load average: 0.85, 0.78, 0.51
Stderr: Address 192.168.1.118 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!

[root@bastion-IDC ~]# pssh -h hosts.txt -l root -i -t 10 -o /root/pssh.log 'uptime && date'
[1] 17:01:02 [SUCCESS] 192.168.1.109
03:58:33 up 79 days, 5:58, 1 user, load average: 0.00, 0.00, 0.00
Wed Feb 8 03:58:33 EST 2017
[2] 17:01:02 [SUCCESS] 192.168.1.105
03:58:40 up 79 days, 14:39, 1 user, load average: 0.00, 0.00, 0.00
Wed Feb 8 03:58:40 EST 2017
[3] 17:01:02 [SUCCESS] 192.168.1.101
16:58:31 up 36 days, 40 min, 1 user, load average: 0.10, 0.03, 0.01
Wed Feb 8 16:58:31 CST 2017
Stderr: Address 192.168.1.101 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
[4] 17:01:02 [SUCCESS] 192.168.1.118
03:58:47 up 75 days, 16:22, 3 users, load average: 0.20, 0.21, 0.31
Wed Feb 8 03:58:47 EST 2017
Stderr: Address 192.168.1.118 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
[root@bastion-IDC ~]# 
ll /root/pssh.log/
total 16
-rw-r--r--. 1 root root 100 Feb 8 17:01 192.168.1.101
-rw-r--r--. 1 root root 99 Feb 8 17:01 192.168.1.105
-rw-r--r--. 1 root root 99 Feb 8 17:01 192.168.1.109
-rw-r--r--. 1 root root 100 Feb 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 [SUCCESS] 192.168.1.105
[2] 16:18:05 [SUCCESS] 192.168.1.109
[3] 16:18:05 [SUCCESS] 192.168.1.101
[4] 16:18:05 [SUCCESS] 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 [SUCCESS] 192.168.1.109
[2] 16:22:50 [SUCCESS] 192.168.1.105
[3] 16:22:50 [SUCCESS] 192.168.1.118
[4] 16:22:50 [SUCCESS] 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 [SUCCESS] 192.168.1.109
[2] 16:23:44 [SUCCESS] 192.168.1.105
[3] 16:23:44 [SUCCESS] 192.168.1.101
[4] 16:23:44 [SUCCESS] 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 [SUCCESS] 192.168.1.109
[2] 16:19:36 [SUCCESS] 192.168.1.105
[3] 16:19:36 [SUCCESS] 192.168.1.101
[4] 16:19:36 [SUCCESS] 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 [SUCCESS] 192.168.1.105
[2] 16:21:02 [SUCCESS] 192.168.1.109
[3] 16:21:02 [SUCCESS] 192.168.1.101
[4] 16:21:02 [SUCCESS] 192.168.1.118
或者:
[root@bastion-IDC ~]# pscp.pssh -l root -h hosts.txt -r /mnt/{zhong,aa,vv} /tmp/
[1] 16:22:00 [SUCCESS] 192.168.1.109
[2] 16:22:00 [SUCCESS] 192.168.1.105
[3] 16:22:00 [SUCCESS] 192.168.1.101
[4] 16:22:00 [SUCCESS] 192.168.1.118

c)批量下載文件或目錄(pslurp命令)
批量下載伺服器上的某文件到本地,不用擔心重名問題,因為pssh已經建立了以文件列表內的ip為名稱的目錄來存放下載的文件
[root@bastion-IDC ~]# pslurp -l root -h hosts.txt /etc/hosts 
.
[1] 16:32:01 [SUCCESS] 192.168.1.109
[2] 16:32:01 [SUCCESS] 192.168.1.105
[3] 16:32:01 [SUCCESS] 192.168.1.101
[4] 16:32:01 [SUCCESS] 192.168.1.118
[root@bastion-IDC ~]# ll
total 123
drwxr-xr-x. 2 root root 4096 Feb 8 16:32 192.168.1.101
drwxr-xr-x. 2 root root 4096 Feb 8 16:32 192.168.1.105
drwxr-xr-x. 2 root root 4096 Feb 8 16:32 192.168.1.109
drwxr-xr-x. 2 root root 4096 Feb 8 16:32 192.168.1.118
[root@bastion-IDC ~]# ll 192.168.1.101
total 4
-rw-r--r--. 1 root root 224 Feb 8 16:32 hosts
[root@bastion-IDC ~]# ll 192.168.1.109
total 4
-rw-r--r--. 1 root root 252 Feb 8 16:32 hosts
[root@bastion-IDC ~]# ll 192.168.1.105
total 4
-rw-r--r--. 1 root root 252 Feb 8 16:32 hosts
[root@bastion-IDC ~]# ll 192.168.1.118
total 4
-rw-r--r--. 1 root root 212 Feb 8 16:32 hosts

另外特別註意:
上面的批量下載操作,只能下載到本地的當前目錄下,不能在命令中跟指定的路徑:
[root@bastion-IDC ~]# pslurp -l root -h hosts.txt /etc/hosts /mnt/
[1] 16:34:14 [FAILURE] 192.168.1.109 Exited with error code 1
[2] 16:34:14 [FAILURE] 192.168.1.105 Exited with error code 1
[3] 16:34:14 [FAILURE] 192.168.1.101 Exited with error code 1
[4] 16:34:14 [FAILURE] 192.168.1.118 Exited with error code 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 [SUCCESS] 192.168.1.109
[2] 16:34:34 [SUCCESS] 192.168.1.105
[3] 16:34:34 [SUCCESS] 192.168.1.118
[4] 16:34:34 [SUCCESS] 192.168.1.101
[root@bastion-IDC mnt]# ll
total 16
drwxr-xr-x. 2 root root 4096 Feb 8 16:34 192.168.1.101
drwxr-xr-x. 2 root root 4096 Feb 8 16:34 192.168.1.105
drwxr-xr-x. 2 root root 4096 Feb 8 16:34 192.168.1.109
drwxr-xr-x. 2 root root 4096 Feb 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 [SUCCESS] 192.168.1.109
[2] 16:39:05 [SUCCESS] 192.168.1.105
[3] 16:39:05 [SUCCESS] 192.168.1.101
[4] 16:39:05 [SUCCESS] 192.168.1.118

[root@bastion-IDC mnt]# ll 192.168.1.101
total 8
drwxr-xr-x. 6 root root 4096 Feb 8 16:39 home
-rw-r--r--. 1 root root 224 Feb 8 16:38 hosts
[root@bastion-IDC mnt]# ll 192.168.1.*
192.168.1.101:
total 8
drwxr-xr-x. 6 root root 4096 Feb 8 16:39 home
-rw-r--r--. 1 root root 224 Feb 8 16:38 hosts

192.168.1.105:
total 8
drwxr-xr-x. 4 root root 4096 Feb 8 16:39 home
-rw-r--r--. 1 root root 252 Feb 8 16:38 hosts

192.168.1.109:
total 8
drwxr-xr-x. 4 root root 4096 Feb 8 16:39 home
-rw-r--r--. 1 root root 252 Feb 8 16:38 hosts

192.168.1.118:
total 8
drwxr-xr-x. 3 root root 4096 Feb 8 16:39 home
-rw-r--r--. 1 root root 212 Feb 8 16:38 hosts

d)批量同步prsync命令)
同步本機/mnt/test目錄下的文件或目錄到遠程機器的/mnt/test路徑下
[root@bastion-IDC ~]# prsync -l root -h hosts.txt -r /mnt/test/ /mnt/test/
[1] 16:46:41 [SUCCESS] 192.168.1.109
[2] 16:46:41 [SUCCESS] 192.168.1.105
[3] 16:46:41 [SUCCESS] 192.168.1.118
[4] 16:46:41 [SUCCESS] 192.168.1.101

同步本機/mnt/test目錄下的文件或目錄到遠程機器的/mnt路徑下
[root@bastion-IDC ~]# prsync -l root -h hosts.txt -r /mnt/test/ /mnt/
[1] 16:47:40 [SUCCESS] 192.168.1.109
[2] 16:47:40 [SUCCESS] 192.168.1.105
[3] 16:47:45 [SUCCESS] 192.168.1.101
[4] 16:47:46 [SUCCESS] 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 [SUCCESS] 192.168.1.109
[2] 16:53:54 [SUCCESS] 192.168.1.105
[3] 16:53:54 [SUCCESS] 192.168.1.101
[4] 16:53:54 [SUCCESS] 192.168.1.118
[root@bastion-IDC ~]# prsync -l root -h hosts.txt /mnt/test/file /mnt/aaa
[1] 16:54:03 [SUCCESS] 192.168.1.109
[2] 16:54:03 [SUCCESS] 192.168.1.105
[3] 16:54:03 [SUCCESS] 192.168.1.101
[4] 16:54:04 [SUCCESS] 192.168.1.118

e)批量kill遠程機器上的進程pnuke命令)
比如批量kill掉遠程機器上的nginx進程
[root@bastion-IDC ~]# 
pnuke -h hosts.txt -l root nginx
[1] 17:09:14 [SUCCESS] 192.168.1.109 
[2] 17:09:14 [SUCCESS] 192.168.1.105 
[3] 17:09:15 [SUCCESS] 192.168.1.118 
[4] 17:09:15 [SUCCESS] 192.168.1.101

***************當你發現自己的才華撐不起野心時,就請安靜下來學習吧***************

 

 摘自https://www.cnblogs.com/kevingrace/p/6378719.html

如有侵權,請聯繫本人刪除~~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 每個系統都有日誌,當系統出現問題時,需要通過日誌解決問題 當系統機器比較少時,登陸到伺服器上查看即可滿足 當系統機器規模巨大,登陸到機器上查看幾乎不現實 當然即使是機器規模不大,一個系統通常也會涉及到多種語言的開發,那麼問題來了,每次系統出問題了,如何能夠迅速查問題? 好一點的情況可能是python ...
  • 我變了,你變不變? 記憶體相關的小知識 1. 列表(list)/字典(dict)/集合(set) 情況一: 修改記憶體中的元素,所有指向那個記憶體的值都會改變 情況二: 重新賦值不修改記憶體中的元素,只改變值的指向 2. 字元串(str)/元組(tuple) 只有情況二,只能重新賦值,不能修改 3. 總結 ...
  • 對於學習python的人都有這樣的困惑 def foo(a=[]): a.append(5) return a Python新手希望這個函數總是返回一個只包含一個元素的列表:[5]。結果卻非常不同,而且非常驚人(對於新手來說): >>> foo() [5] >>> foo() [5, 5] >>> ...
  • 昨日內容補充: 1.字元串:'中國' 'Hello' 字元:中是一個字元,e是一個字元 位元組:中是3個位元組,e是1個位元組 位:01010101是8位,其中0或1分別是1位 unicode用於記憶體計算 utf-8用於網路傳輸、數據存儲 2.if的嵌套 如10086客服電話的例子: 3.pycharm ...
  • TCP連接 TCP是電腦網路中運輸層協議,是應用層協議http協議的支撐協議。兩台遠程主機之間可以通過TCP/UDP協議進行通信並交換信息,前提是,相互通信的兩台主機之間必須知道彼此的IP地址和埠號。 NodeMCU作為TCP客戶端實現區域網內點亮Led燈(通過路由器中轉) NodeMCU可以被 ...
  • 文章來源:centos7 Docker私有倉庫搭建及刪除鏡像 如果不想用私有鏡像庫,你可以用docker的庫 https://hub.docker.com 環境準備 環境:兩個裝有Docker 17.09.0-ce 的centos7虛擬機 虛擬機一:192.168.0.154 用戶開發機 虛擬機二: ...
  • 1. 第二個start.S 從 開始,在 中有包含 在config.h中: 在 中: 在 中,看到了 的巨集 查看u boot.map在這裡又來到了上一層的start.S中來,所以可以知道這兩個是由兩個文件組成的,一個是u boot.bin和reg_info.bin,就是說兩個不同的start.S的流 ...
  • 樹莓派中QT實現I2C 在QT中實現 I2C 使用的驅動為 wiringPi 庫的引入 代碼實現 widget.h 中 記得引入"wiringPiI2C.h"等 此處,我使用的是讀取感測器adxl345加速度計 widget.cpp 中 首先應該使用在命令行中 來獲取i2c設備文件的地址,比如 ​ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...