自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用 Shell 在多服務(wù)器上批量操作

運(yùn)維 系統(tǒng)運(yùn)維 新聞
日常工作中,我們常需要同時(shí)在多臺(tái)服務(wù)器上執(zhí)行同樣的命令,如對(duì)比日志、檢查服務(wù)等。這就需要我們有服務(wù)器批量操作的能力。

 [[271236]]

需求

日常工作中,我們常需要同時(shí)在多臺(tái)服務(wù)器上執(zhí)行同樣的命令,如對(duì)比日志、檢查服務(wù)等。這就需要我們有服務(wù)器批量操作的能力。

兩年前寫過一篇文章,shell實(shí)現(xiàn)SSH自動(dòng)登陸 使用 shell 的 expect 命令進(jìn)行 ssh 登陸,這種方式的靈活性確實(shí)非常高,但實(shí)現(xiàn)起來(lái)比較麻煩,而且單進(jìn)程阻塞的特性也是它的硬傷,如果使用它進(jìn)行批量操作,就需要啟動(dòng)多個(gè) expect 進(jìn)程,涉及到各個(gè)進(jìn)程和主進(jìn)程的雙向通信,處理起來(lái)非常麻煩。

不過我們可以借用 ssh 公鑰登陸 的能力,方便地實(shí)現(xiàn)在多個(gè)服務(wù)器上批量執(zhí)行命令。

SSH 協(xié)議

說公鑰登陸之前,先來(lái)說一下 SSH 協(xié)議。

SSH 是一種網(wǎng)絡(luò)協(xié)議,我們常說的 ssh 一般指其實(shí)現(xiàn),即 OpenSSH,在 shell 中,也就是 ssh 命令。

SSH

Secure Shell(安全外殼協(xié)議,簡(jiǎn)稱SSH)是一種加密的網(wǎng)絡(luò)傳輸協(xié)議,可在不安全的網(wǎng)絡(luò)中為網(wǎng)絡(luò)服務(wù)提供安全的傳輸環(huán)境。SSH通過在網(wǎng)絡(luò)中建立安全隧道來(lái)實(shí)現(xiàn)SSH客戶端與服務(wù)器之間的連接。

SSH 的原理跟 HTTPS 差不多,都是基于 TCP 和 非對(duì)稱加密進(jìn)行的應(yīng)用層協(xié)議。它跟 HTTPS 的不同之處在于 HTTPS 通過 數(shù)字證書 和 數(shù)字證書認(rèn)證中心 來(lái)防止中間人攻擊,而 ssh 服務(wù)器的公鑰沒有人公證,只能通過其公鑰指紋來(lái)人工確定其身份。

如下圖所示,我們第一次使用 ssh 登陸某臺(tái)服務(wù)器時(shí), ssh 會(huì)提示我們驗(yàn)證服務(wù)器的公鑰指紋。

使用 shell 在多服務(wù)器上批量操作

當(dāng)我們驗(yàn)證此公鑰指紋是我們要登陸的服務(wù)器后,服務(wù)器的公鑰會(huì)被添加到 ~/.ssh/known_hosts 里,再登陸時(shí),ssh 檢測(cè)到是已認(rèn)證服務(wù)器后就會(huì)跳過公鑰驗(yàn)證階段。

建連過程

關(guān)于通信加密的概念,我在之前的文章也有所介紹,參見:再談加密-RSA非對(duì)稱加密的理解和使用。至于 SSH 協(xié)議的建連過程,則可以參閱:Protocol Basics: Secure Shell Protocol 。

總結(jié)起來(lái)主要包括以下步驟:

  • TCP 三次握手

  • SSH 協(xié)議版本協(xié)商

  • 客戶端與服務(wù)端的公鑰交換

  • 加密算法協(xié)商

  • 客戶端使用對(duì)稱加密的密鑰認(rèn)證

  • 客戶端與服務(wù)端安全通信

我使用 tcpdump + wireshark 抓包并查看了一下其 SSH 的建連過程,如下圖所示:

使用 shell 在多服務(wù)器上批量操作

不得不再次感嘆 tcpdump + wireshark 是學(xué)習(xí)網(wǎng)絡(luò)協(xié)議的真神器。

ssh 工具

ssh

作為工具, ssh 分為服務(wù)端和客戶端,在服務(wù)端,它是 sshd,一般占用 22 端口。我們平常使用的是其客戶端,一般用法為 ssh user@host,然后根據(jù) ssh 的提示,我們輸入密碼后登陸到服務(wù)器。

它的功能非常強(qiáng)大,看其支持參數(shù)就知道了。

  1. ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] [user@]hostname [command] 

介紹完了 SSH 協(xié)議和 ssh 命令,終于說到公鑰登陸了。

公鑰登陸

理解了非對(duì)稱加密的原理后,再公鑰登陸會(huì)非常簡(jiǎn)單。由于公私鑰是唯一的一對(duì),在客戶端保障自己私鑰安全的情況下,服務(wù)端通過公鑰就可以完全確定客戶端的真實(shí)性,所以要實(shí)現(xiàn)公鑰登陸,我們就要先生成一個(gè)公私密鑰對(duì)。

通過 ssh-keygen 命令來(lái)生成密鑰對(duì),為了讓步驟更完整,我把它們暫時(shí)保存到工作目錄,默認(rèn)會(huì)保存到 ~/.ssh 目錄。

~ ssh-keygen 

  1. Generating public/private rsa key pair. 
  2. Enter file in which to save the key (/Users/zbs/.ssh/id_rsa): ./test 
  3. Enter passphrase (empty for no passphrase): 
  4. Enter same passphrase again: 
  5. Your identification has been saved in ./test. 
  6. Your public key has been saved in ./test.pub. 
  7. The key fingerprint is: 
  8. SHA256:xxxxx/B17z/xxxxxx zbs@zbs.local 
  9. The key's randomart image is: 
  10. +---[RSA 2048]----+ 
  11. |    o+*.. EO*    | 
  12. |   ....          | 
  13. |    oo+    .o++.o| 
  14. +----[SHA256]-----+ 
  15. ~ ls ./test* 
  16. ./test     ./test.pub 

把私鑰文件 ./test 的內(nèi)容放到 客戶端的 ~/.ssh/id_rsa,再使用密碼試登陸到服務(wù)器后,將公鑰內(nèi)容 ./test.pub 里的內(nèi)容放到 服務(wù)器的 ~/.ssh/authorized_keys。

再次登陸時(shí),ssh 會(huì)自動(dòng)使用自己的私鑰來(lái)認(rèn)證,也就避免了輸出密碼。

批量操作

公鑰登陸幫我們避免了每次登陸服務(wù)器要輸出密碼的麻煩,它同時(shí)也解決了每個(gè)登陸會(huì)話都會(huì)同步阻塞的問題,這樣我們就可以利用 ssh 的 ssh user@host command 方式來(lái)直接在服務(wù)器上執(zhí)行命令。

同時(shí),在我們擁有一個(gè) ip 列表的情況下,使用 for 循環(huán)遍歷 ip 列表,在多個(gè)服務(wù)器上批量執(zhí)行命令也就成為了可能。

關(guān)于批量執(zhí)行,已經(jīng)有很多開源工具了,如使用 python 編寫的 pssh,C++ 編寫的 hss(幫同事做個(gè)廣告)等。

多服務(wù)器文件合并

前幾天,幫同事在多個(gè)服務(wù)器上查找日志,需要把在多個(gè)服務(wù)器上查到的日志都匯總到同一臺(tái)機(jī)器上進(jìn)行統(tǒng)計(jì)分析。我是用 pssh 登陸的多個(gè)服務(wù)器,由于日志量太大,查出來(lái)的結(jié)果輸出到終端上再?gòu)?fù)制有些不現(xiàn)實(shí),而使用重定向,結(jié)果又會(huì)重定向到各自的服務(wù)器。

scp

這時(shí)候可以使用 scp,scp 跟 ssh 是同一家族的命令,也是基于 SSH 協(xié)議實(shí)現(xiàn)的安全傳輸協(xié)議。只要在各個(gè)服務(wù)器之間互相保存著對(duì)方的公鑰,就可以跟 ssh 命令一樣,實(shí)現(xiàn)免密操作。

scp 的常見用法是 scp src dst,其中遠(yuǎn)程路徑可以表示為 user@host:/path。在批量登陸的情況下,可以使用 grep 等命令先把結(jié)果文件輸入到一個(gè)文件中,再使用 scp 命令將其復(fù)制到同一臺(tái)服務(wù)器。

為了避免各個(gè)服務(wù)器的文件名沖突,可以使用 uuidgen | xargs -I {} scp result.log root@ip:/result/{} 將各個(gè)服務(wù)器的結(jié)果復(fù)制到不同的文件中,再使用 cat 將 result 文件夾中的文件合并到一塊。

nc

當(dāng)然,大多數(shù)情況下,我們的服務(wù)器之間并不會(huì)互相保存公鑰,不過 nc 命令可以完美解決這個(gè)問題。

nc 的 -k 選項(xiàng),可以讓 nc 服務(wù)端在文件傳輸結(jié)束后保持連接不關(guān)閉。這樣,我們使用 nc -k -4l port > result.log 啟動(dòng)一個(gè) nc 服務(wù)端,再使用 grep xxx info.log | nc ip port 即可實(shí)現(xiàn)結(jié)果數(shù)據(jù)的合并。

小結(jié)

本文介紹的各個(gè)工具還是屬于開發(fā)的小打小鬧,了解多一些工具總是好的。如果做運(yùn)維工作的話,還是需要依賴 OPS 平臺(tái)集成更多功能,實(shí)現(xiàn)完整的自動(dòng)化。

責(zé)任編輯:張燕妮 來(lái)源: 高效運(yùn)維
相關(guān)推薦

2021-07-26 17:15:05

LinuxConverseen開源

2021-08-05 17:40:05

XpanesLinux服務(wù)器

2018-08-15 08:45:38

2017-06-26 19:00:46

LinuxShell命令

2012-07-05 09:43:33

服務(wù)器虛擬化

2012-09-05 09:35:35

服務(wù)器虛擬化

2012-06-08 09:44:09

虛擬化

2012-10-15 13:40:15

IBMdw

2012-07-03 10:37:44

服務(wù)器虛擬化

2018-10-08 08:45:12

Nginx服務(wù)器容器

2024-01-10 17:24:00

2021-03-22 16:45:58

服務(wù)器命令

2014-05-04 11:02:58

jenkins服務(wù)器批量

2010-08-29 20:53:03

DHCP服務(wù)器

2011-03-15 09:42:25

dsh批量管理Linux

2024-08-14 17:02:22

Docker容器

2015-11-09 15:42:40

數(shù)據(jù)中心多操作系統(tǒng)

2010-05-19 10:31:07

IIS服務(wù)器

2011-10-09 09:26:04

ubuntursync服務(wù)器

2010-07-01 09:47:18

DNS服務(wù)器BIND
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)