使用 shell 在多服务器上批量操作
需求日常工作中,我们常需要同时在多台服务器上执行同样的命令,如对比日志、检查服务等。这就需要我们有服务器批量操作的能力。 两年前写过一篇文章,shell实现SSH自动登陆?使用 shell 的? 不过我们可以借用 ssh? 转载随意,文章会持续修订,请注明来源地址:https://zhenbianshu.github.io?。 SSH 协议说公钥登陆之前,先来说一下 SSH 协议。 SSH 是一种网络协议,我们常说的 ssh 一般指其实现,即 OpenSSH,在 shell 中,也就是 ssh 命令。 SSH
SSH 的原理跟 HTTPS 差不多,都是基于 TCP 和 非对称加密进行的应用层协议。它跟 HTTPS 的不同之处在于 HTTPS 通过? 如下图所示,我们第一次使用 ssh 登陆某台服务器时, ssh 会提示我们验证服务器的公钥指纹。 当我们验证此公钥指纹是我们要登陆的服务器后,服务器的公钥会被添加到? 建连过程关于通信加密的概念,我在之前的文章也有所介绍,参见:再谈加密-RSA非对称加密的理解和使用。至于 SSH 协议的建连过程,则可以参阅:Protocol Basics: Secure Shell Protocol?。 总结起来主要包括以下步骤:
我使用 tcpdump + wireshark 抓包并查看了一下其 SSH 的建连过程,如下图所示: 不得不再次感叹 tcpdump + wireshark 是学习网络协议的真神器。 ssh 工具ssh作为工具, 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 [[email?protected]]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]] [[email?protected]]hostname [command]
介绍完了 SSH 协议和 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 [email?protected] The key‘s randomart image is: +---[RSA 2048]----+ | o+*.. EO* | | .... | | oo+ .o++.o| +----[SHA256]-----+ ~ ls ./test* ./test ./test.pub
把私钥文件 ./test 的内容放到? 再次登陆时,ssh 会自动使用自己的私钥来认证,也就避免了输出密码。 批量操作公钥登陆帮我们避免了每次登陆服务器要输出密码的麻烦,它同时也解决了每个登陆会话都会同步阻塞的问题,这样我们就可以利用 ssh 的? 同时,在我们拥有一个 ip 列表的情况下,使用 for 循环遍历 ip 列表,在多个服务器上批量执行命令也就成为了可能。 关于批量执行,已经有很多开源工具了,如使用 python 编写的?pssh,C++ 编写的?hss(帮同事做个广告)等。 多服务器文件合并前几天,帮同事在多个服务器上查找日志,需要把在多个服务器上查到的日志都汇总到同一台机器上进行统计分析。我是用 pssh 登陆的多个服务器,由于日志量太大,查出来的结果输出到终端上再复制有些不现实,而使用重定向,结果又会重定向到各自的服务器。 scp这时候可以使用? scp 的常见用法是? 为了避免各个服务器的文件名冲突,可以使用? nc当然,大多数情况下,我们的服务器之间并不会互相保存公钥,不过? nc 的? 小结本文介绍的各个工具还是属于开发的小打小闹,了解多一些工具总是好的。如果做运维工作的话,还是需要依赖 OPS 平台集成更多功能,实现完整的自动化。 关于本文有什么疑问可以在下面留言交流,如果您觉得本文对您有帮助,欢迎关注我的?微博?或?GitHub?。您也可以在我的?博客REPO?右上角点击? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |