如何使用shell在多服务器上批量操作

 更新时间:2021年05月27日 10:51:48   作者:枕边书  
日常工作中,我们常需要同时在多台服务器上执行同样的命令,如对比日志、检查服务等。这就需要我们有服务器批量操作的能力,我们可以借用 ssh公钥登陆的能力,方便地实现在多个服务器上批量执行命令。

SSH 协议

说公钥登陆之前,先来说一下 SSH 协议。

SSH 是一种网络协议,我们常说的 ssh 一般指其实现,即 OpenSSH,在 shell 中,也就是 ssh 命令。

SSH

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。 SSH通过在网络中建立安全隧道来实现SSH客户端与服务器之间的连接。

SSH 的原理跟 HTTPS 差不多,都是基于 TCP 和 非对称加密进行的应用层协议。它跟 HTTPS 的不同之处在于 HTTPS 通过数字证书和数字证书认证中心来防止中间人攻击,而 ssh 服务器的公钥没有人公证,只能通过其公钥指纹来人工确定其身份。

如下图所示,我们第一次使用 ssh 登陆某台服务器时, ssh 会提示我们验证服务器的公钥指纹。

当我们验证此公钥指纹是我们要登陆的服务器后,服务器的公钥会被添加到~/.ssh/known_hosts里,再登陆时,ssh 检测到是已认证服务器后就会跳过公钥验证阶段。

建连过程

关于通信加密的概念,我在之前的文章也有所介绍,参见:再谈加密-RSA非对称加密的理解和使用。至于 SSH 协议的建连过程,则可以参阅:Protocol Basics: Secure Shell Protocol。

总结起来主要包括以下步骤:

  • TCP 三次握手
  • SSH 协议版本协商
  • 客户端与服务端的公钥交换
  • 加密算法协商
  • 客户端使用对称加密的密钥认证
  • 客户端与服务端安全通信

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

不得不再次感叹 tcpdump + wireshark 是学习网络协议的真神器。

ssh 工具

ssh

作为工具, ssh 分为服务端和客户端,在服务端,它是sshd,一般占用 22 端口。我们平常使用的是其客户端,一般用法为ssh user@host,然后根据 ssh 的提示,我们输入密码后登陆到服务器。

它的功能非常强大,看其支持参数就知道了。

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 协议和 ssh 命令,终于说到公钥登陆了。

公钥登陆

理解了非对称加密的原理后,再公钥登陆会非常简单。由于公私钥是唯一的一对,在客户端保障自己私钥安全的情况下,服务端通过公钥就可以完全确定客户端的真实性,所以要实现公钥登陆,我们就要先生成一个公私密钥对。

通过ssh-keygen命令来生成密钥对,为了让步骤更完整,我把它们暂时保存到工作目录,默认会保存到~/.ssh目录。

~ ssh-keygen

Generating public/private rsa key pair.

Enter file in which to save the key (/Users/zbs/.ssh/id_rsa): ./test

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in ./test.

Your public key has been saved in ./test.pub.

The key fingerprint is:

SHA256:xxxxx/B17z/xxxxxx zbs@zbs.local

The key's randomart image is:

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

|    o+*.. EO*    |

|   ....          |

|    oo+    .o++.o|

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

~ ls ./test*

./test     ./test.pub

把私钥文件 ./test 的内容放到客户端的 ~/.ssh/id_rsa,再使用密码试登陆到服务器后,将公钥内容./test.pub里的内容放到服务器的 ~/.ssh/authorized_keys。

再次登陆时,ssh 会自动使用自己的私钥来认证,也就避免了输出密码。

批量操作

公钥登陆帮我们避免了每次登陆服务器要输出密码的麻烦,它同时也解决了每个登陆会话都会同步阻塞的问题,这样我们就可以利用 ssh 的ssh user@host command方式来直接在服务器上执行命令。

同时,在我们拥有一个 ip 列表的情况下,使用 for 循环遍历 ip 列表,在多个服务器上批量执行命令也就成为了可能。

多服务器文件合并

前几天,帮同事在多个服务器上查找日志,需要把在多个服务器上查到的日志都汇总到同一台机器上进行统计分析。我是用 pssh 登陆的多个服务器,由于日志量太大,查出来的结果输出到终端上再复制有些不现实,而使用重定向,结果又会重定向到各自的服务器。

scp

这时候可以使用scp,scp 跟 ssh 是同一家族的命令,也是基于 SSH 协议实现的安全传输协议。只要在各个服务器之间互相保存着对方的公钥,就可以跟 ssh 命令一样,实现免密操作。

scp 的常见用法是scp src dst,其中远程路径可以表示为user@host:/path。在批量登陆的情况下,可以使用 grep 等命令先把结果文件输入到一个文件中,再使用 scp 命令将其复制到同一台服务器。

为了避免各个服务器的文件名冲突,可以使用uuidgen | xargs -I {} scp result.log root@ip:/result/{}将各个服务器的结果复制到不同的文件中,再使用 cat 将 result 文件夹中的文件合并到一块。

nc

当然,大多数情况下,我们的服务器之间并不会互相保存公钥,不过nc命令可以完美解决这个问题。

nc 的-k选项,可以让 nc 服务端在文件传输结束后保持连接不关闭。这样,我们使用nc -k -4l port > result.log启动一个 nc 服务端,再使用grep xxx info.log | nc ip port即可实现结果数据的合并。

小结

本文介绍的各个工具还是属于开发的小打小闹,了解多一些工具总是好的。如果做运维工作的话,还是需要依赖 OPS 平台集成更多功能,实现完整的自动化。

以上就是如何使用shell在多服务器上批量操作的详细内容,更多关于使用shell在多服务器上批量操作的资料请关注脚本之家其它相关文章!

相关文章

  • 101个脚本之建立linux回收站的脚本

    101个脚本之建立linux回收站的脚本

    众所周知,linux是没有回收站的,一些人很害怕删错东西(有经验的linux管理员极少范这错误),个人不建议回收站,而应该是培养个人的安全意识。有点小跑题
    2016-08-08
  • linux中叹号命令(!)的使用小结

    linux中叹号命令(!)的使用小结

    这篇文章主要给大家介绍了关于linux中叹号命令(!)的使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Linux下安装PHP curl扩展的方法详解

    Linux下安装PHP curl扩展的方法详解

    这篇文章主要介绍了Linux下安装PHP curl扩展的方法,简单分析了Linux环境安装php的curl扩展具体步骤、相关命令与注意事项,需要的朋友可以参考下
    2019-07-07
  • Linux中如何通过端口号查找进程号

    Linux中如何通过端口号查找进程号

    这篇文章主要介绍了Linux中如何通过端口号查找进程号问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • ubuntu定时执行python脚本实例代码

    ubuntu定时执行python脚本实例代码

    这篇文章主要给大家介绍了关于ubuntu定时执行python脚本的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ubuntu具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • 在Linux服务器上部署War项目教程

    在Linux服务器上部署War项目教程

    文章讲述了如何将War包上传到Linux服务器上的步骤,包括使用FTP或SFTP上传,确认并安装Java运行环境和Web服务器(如ApacheTomcat或Nginx),将War包复制到相应的目录,并重启服务以确保部署成功,最后,通过浏览器访问部署的应用
    2025-02-02
  • linux操作系统下配置ssh/sftp和权限设置方法

    linux操作系统下配置ssh/sftp和权限设置方法

    这篇文章主要介绍了linux操作系统下配置ssh/sftp和权限设置方法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • Windows和Linux实现远程桌面连接

    Windows和Linux实现远程桌面连接

    这篇文章主要介绍了Windows和Linux实现远程桌面连接,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Linux服务器被黑以后的详细处理步骤

    Linux服务器被黑以后的详细处理步骤

    作为一个Linux运维工程师,能够清晰地鉴别异常机器是否已经被入侵了显得至关重要,个人结合自己的工作经历,整理了几种常见的机器被黑情况供参考
    2018-01-01
  • linux尝试登录失败后锁定用户账户的两种方法

    linux尝试登录失败后锁定用户账户的两种方法

    这篇文章主要给大家分享了linux尝试登录失败后锁定用户账户的两种方法,分别是利用pam_tally2模块和pam_faillock 模块实现,文中通过详细的示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-06-06

最新评论