上周领导让我短时间修改200多台服务器的密码,我一脸蒙蔽,手动通宵改??不存在的,经过大佬指点,也总结了一些特别好的方法,让我免受了加班之苦。好了,下面让我们一起聊聊服务器之间远程交互的一些有趣的遭遇和处理方式,把好的方法分享给大家。
目录
一、遭遇和机遇
就在上周,周五临近下班,经理突然找我说说:“阿杰,下午领导开会提到了咱们公司安全性的问题,我们发现很多服务器的管理员(root)密码都设的太简单了,都是六个1啥的(其实,密码都是这位经理自己设的),你给统一改一改,服务器列表你找大黄【注释↓↓】要一下,密码就改成那种既复杂、又好记、含义能代表公司、而且高大上一些的就行,改完你就下班吧。
eg:大黄,人名,真名黄鲲鹏,平时管他叫鹏哥,一个憨厚老实的运维工作者,和我有些交情,中午经常蹭他饭卡;鹏哥曾多次因感情问题跳楼未遂,被我拦下,说起来我还算是他的救命恩人。
我吐了!明天不行?
于是我来找鹏哥要服务器的IP列表,寻思花个把小时手动改了呗,等鹏哥发给我一个8KB的txt文件时,我就感觉没那么简单!果然,服务器加各种虚拟机、测试机大概200多台。这TM是不打算让我下班咯??我突然想到了一系列可能的遭遇。
于是我开始忙活起来,半小时过去了。。。才改好不到十分之一。
正好鹏哥准备撤了,看到我一脸黑,过来问我说:“阿杰我看你印堂发黑啊,也遇到感情危机啦?别想不开啊!”
我去。。。我哪有,经理要我远程改200多台服务器root用户的密码。我这得改到明天啊鹏哥,有没有好办法啊?
说着,鹏哥嘴角扬起十余年资深运维大佬的微笑。“没这么麻烦,看我给你写条shell命令解放你。”然后给我啪啪啪敲出一条命令。
命令如下:
# 作用:把192.168.101.91服务器原密码:111111改成Softsec@2020CN
sshpass -p "111111" ssh -o StrictHostKeyChecking=no root@192.168.101.91 "echo 'Softsec@2020CN' |passwd --stdin root"
乍一眼让我看不到有啥特别的,待他执行后,竟然直接生效了。
我挺惊讶的问道:“这就可以了么?这为啥没有提示输密码啥的?”
鹏哥解释道:“是这样,一般ssh远程命令就得输入密码,修改密码时还要输入两次密码,但上面的命令分别属于强制执行了这两部分。”
- 第一部分:sshpass -p "111111" ssh -o StrictHostKeyChecking=no root@192.168.101.91
是通过sshpass这个插件远程连接了服务器192.168.101.91的root用户,sshpass的原理跟expect插件类似,就是模拟了人工输入密码。
但sshpass有个问题,当终端首次连接某个服务器时,都会有个“Are you sure you want to continue connecting (yes/no)? ”的提示,这样就没法连接,但是加上“-o StrictHostKeyChecking=no”参数,即可解决这个问题。
- 第二部分:echo 'Softsec@2020CN' |passwd --stdin root
@这个命令意思是:修改root用户密码,且输入新密码默认填写前面的内容“Softsec@2020CN”。
“这样一来就可以一条命令成功修改任何服务器密码啦,一次性使用的话就弄简单些,直接复制200条这命令,然后批量修改命令中参数放到shell脚本中运行就阔以了。” 鹏哥说完一乐,拍拍屁股准备走人了~
“哎呀我太菜了,多谢鹏哥啊!”他也摆摆手示意不客气,来了句“咱们菜鸡互助”哈哈。
我赶紧复制了200来条命令,用正则批量替换了各IP和密码,一执行,一分钟不到,搞定!!
一看时间还不到8点,为了庆祝挽回的这一次加班,我赶紧测试了一遍,并把使用的一些细节和技术点总结记录下来分享给大家。
二、技术分享1.什么是sshpass
sshpass是一个很棒的免交互SSH登录工具,ssh与sshpass的区别:
- ssh登录需要与用户进行交互,需要用户输入密码,做了免密除外。
- sshpass 允许使用-p参数指定明文密码(相对不安全,用户密码可以通过history查到,或导致被泄露)
在大多数情况下,Linux 系统管理员使用 SSH 登录到程 Linux 服务器时,要么是通过密码,要么是无密码 SSH 登录或基于密钥的 SSH 身份验证。
如果你想自动在 SSH 登录提示符中提供密码和用户名怎么办(想跟命令写到一起)?这时 sshpass 就可以帮到你了。
sshpass 是一个简单、轻量级的命令行工具,通过它我们能够向命令提示符本身提供密码(非交互式密码验证),这样就可以通过 cron 调度器执行自动化的 shell 脚本进行对远程服务器的各种操作。
ssh 直接使用 TTY 访问,以确保密码是用户键盘输入的。 sshpass 在专门的 tty 中运行 ssh,以误导 ssh 相信它是从用户接收到的密码。
重要:使用 sshpass 是最不安全的,因为所有系统上的用户在命令行中通过简单的 “history”、“ps” 等命令就可看到密码。因此,如果必要,比如说在生产环境,我强烈建议使用SSH 免密,老套路吃得香。
当然,也可以使用-f参数从指定文件中读取密码
echo 'password' >mypasswd.txt
sshpass -f mypasswd.txt ssh user@ip
使用-e参数从环境变量中获取ssh密码
export SSHPASS= "password"
sshpass -e ssh user@ip
2.安装 sshpass
A.在基于 RedHat/CentOS 的系统中,首先需要启用 EPEL 仓库并使用 yum 命令安装它。
yum install sshpass
B.在 Debian/Ubuntu 和它的衍生版中,你可以使用 apt-get 命令来安装。
sudo apt-get install sshpass
C.另外,你也可以从最新的源码安装 sshpass,首先下载源码并从 tar 文件中解压出内容:
1、下载:目前1.0.6是最新版本,下载地址:
wget http://sourceforge.net/projects/sshpass/files/latest/download -O sshpass.tar.gz
2、编译安装
tar -xvf sshpass.tar.gz
cd sshpass-1.06
./configure
make && make install
# 查看安装成功与否:
sshpass -V
安装可能出现的问题:
No Package sshpass available
解决方式:
sudo yum install epel-release
安装完之后,再次尝试安装sshpass,问题搞定。
3.sshpass用法(不用做免密):
情景1:远程操作服务器,删除远程服务器/tmp/test下所有文件,注意:这里的""冒号记得加上,如果不加,则会在本地执行该命令而不是远程的服务器
sshpass -p {密码} ssh -o StrictHostKeyChecking=no {用户名}@{主机IP} "rm -rf /tmp/test"
#例:sshpass -p password ssh -o StrictHostKeyChecking=no root@192.168.1.15 "rm -rf /tmp/test"
情景2:将/home/test.txt文件发送到远程服务器的/home/local/目录下
sshpass -p {密码} scp -o StrictHostKeyChecking=no /home/test.txt {用户名}@{主机IP}:/home/local/
#例:sshpass -p {密码} scp -o StrictHostKeyChecking=no /home/test.txt root@192.168.1.15:/home/local/