当前位置: 首页 > 科技观察

批量操作

时间:2023-03-16 16:10:55 科技观察

要求在多台服务器上使用Shell在日常工作中,我们经常需要在多台服务器上同时执行同一条命令,比如比较日志,检查服务等,这就需要我们具备以下能力服务器进行批量操作。两年前写过一篇文章,shell实现SSH自动登录,使用shell的expect命令进行ssh登录。这种方式确实很灵活,但是实现起来比较麻烦,而且单进程阻塞的特性也是它的硬伤,如果用于批量操作,需要启动多个expect进程,涉及到每个进程与主进程的双向通信,处理起来非常麻烦。但是,我们可以利用ssh公钥登录的功能,方便的在多台服务器上批量执行命令。在SSH协议讲公钥登录之前,我们先说说SSH协议。SSH是一种网络协议。我们常说的ssh,一般是指它的实现,即OpenSSH,在shell中,就是ssh命令。SSHSecureShell(SecureShellProtocol,简称SSH)是一种加密的网络传输协议,可以在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中建立安全隧道来实现SSH客户端与服务器的连接。SSH的原理与HTTPS类似,都是基于TCP和非对称加密的应用层协议。与HTTPS不同的是,HTTPS通过数字证书和数字证书认证机构来防止中间人攻击,而ssh服务器的公钥是不经过公证的,只能通过其公钥指纹手动确定其身份.如下图所示,当我们第一次使用ssh登录服务器时,ssh会提示我们验证服务器的公钥指纹。当我们验证公钥指纹是我们要登录的服务器时,会将服务器的公钥添加到~/.ssh/known_hosts,再次登录时,ssh检测到后会跳过公钥验证是经过身份验证的服务器阶段。我在上一篇文章中也介绍了连接建立过程中通信加密的概念。SSH协议的连接建立过程可以参考:协议基础:SecureShellProtocol。总结一下,主要包括以下步骤:TCP三次握手SSH协议版本协商客户端与服务器公钥交换加密算法协商客户端使用对称加密密钥验证客户端与服务器安全通信我使用tcpdump+wireshark抓包查看看一下它的SSH连接建立过程,如下图所示:不得不再次感叹tcpdump+wireshark真是学习网络协议的神器。sshtoolssh作为一个工具,ssh分为server和client,在server上,就是sshd,一般占用22端口。我们平时用它的client,一般用法是sshuser@host,然后根据提示ssh,我们输入密码,登录服务器。它的功能很强大,看看它的配套参数就知道了。ssh[-1246AaCfGgKkMNnqsTtVvXxYy][-bbind_address][-ccipher_spec][-D[bind_address:]port][-Elog_file][-eescape_char][-Fconfigfile][-Ipkcs11][-iidentity_file][-J[user@]host[:port]][-Laddress][-llogin_name][-mmac_spec][-Octl_cmd][-option][-pport][-Qquery_option][-Raddress][-Sctl_path][-Whost:port][-wlocal_tun[:remote_tun]][user@]hostname[command]介绍完SSH协议和ssh命令,最后说一下公钥登录。公钥登录了解了非对称加密的原理后,公钥登录就会很简单了。由于公私钥是唯一的一对,当客户端保证自己私钥的安全时,服务端可以通过公钥完全确认客户端的真实性。因此,要实现公钥登录,首先要生成公私钥。密钥对。通过ssh-keygen命令生成密钥对。为了让步骤更完整,我暂时保存到工作目录下,默认保存到~/.ssh目录下。~ssh-keygenGeneratingpublic/privatersakeypair.Enterfileinwhichtosavethekey(/Users/zbs/.ssh/id_rsa):./testEnterpassphrase(emptyfornopassphrase):Entersamepassphraseagain:Youridentificationhasbeensavedin./test.Yourpublickeyhasbeensavedin./test.pub.Thekeyfingerprintis:SHA256:xxxxxbs/B17@zbs.localThekey的随机图像是:+---[RSA2048]----+|o+*..EO*||....||oo+.o++.o|+----[SHA256]-----+~ls./test*./test./test.pub将私钥文件./test的内容放入客户端的~/.ssh/id_rsa中,然后使用密码尝试登录到服务器,并将公钥Contents./test.pub中的内容放在服务器的~/.ssh/authorized_keys中。再次登录时,ssh会自动使用自己的私钥进行认证,避免了输出密码。公钥登录的批量操作帮助我们避免了每次登录服务器都要输出密码的麻烦,也解决了每次登录会话都会同步阻塞的问题,这样我们就可以使用sshuser@host命令ssh的方法直接登录在服务器上执行命令。同时,当我们有了一个ip列表后,可以通过for循环遍历ip列表,在多台服务器上批量执行命令。关于批量执行,已经有很多开源工具了,比如python写的pssh,C++写的hss(给同事打广告)等。前几天多服务器文件合并,帮同事找了多个log服务器,需要将多台服务器上的日志聚合到同一台机器上进行统计分析。我使用pssh登录到多个服务器。由于日志量大,将结果输出到终端再复制是不现实的。使用重定向,结果将被重定向到它们各自的服务器。scp这时候就可以使用scp了,scp和ssh是同族命令,也是基于SSH协议的安全传输协议。只要在各个服务器之间保存彼此的公钥,就可以像ssh命令一样实现免密操作。scp的一个常见用法是scpsrcdst,其中远程路径可以表示为user@host:/path。在批量登录的情况下,可以先使用grep等命令将结果文件输入到一个文件中,然后使用scp命令复制到同一台服务器上。为了避免各个服务器的文件名冲突,可以使用uuidgen|xargs-I{}scpresult.logroot@ip:/result/{}将每个服务器的结果复制到不同的文件中,然后使用cat将复制结果文件夹中的文件合并为一个。nc当然,在大多数情况下,我们的服务器之间是不保存公钥的,但是nc命令可以完美的解决这个问题。nc的-k选项允许nc服务器在文件传输结束后保持连接打开。这样我们使用nc-k-4lport>result.log启动一个ncserver,然后使用grepxxxinfo.log|ncip端口合并结果数据。小结本文介绍的各种工具还只是开发的一小部分。了解更多工具总是好的。如果做运维工作,还是需要依托OPS平台,集成更多的功能,实现完全自动化。