如果你质疑自己,不确定命令是否正确或者不确定脚本是否能正常执行, 你可以先测试,测试方法就是 在命令行输入 需要执行的命令,返回结果为理想状态就把命令放进脚本,并批量添加即可!
如:执行查询账号的其中一条
ssh 0.0.0.2 cat /etc/passwd|grep jtcj
正常以后在放进脚本并批量添加。
当然 有些有风险的操作还是建议先 测试一下,再放进脚本 对自己有自信固然是好事 但不要盲目自信。
可以忽略该步。
代码(部分):
cat /etc/passwd | grep jtcj
ssh 0.0.0.2 cat /etc/passwd|grep jtcj
ssh 0.0.0.3 cat /etc/passwd|grep jtcj
ssh 0.0.0.4 cat /etc/passwd|grep jtcj
ssh 0.0.0.5 cat /etc/passwd|grep jtcj
全局替换而已: \ 转义的意思。
也可以新建一个脚本,保留刚才查看的那个脚本。
全局替换:%s/cat \/etc\/passwd|grep jtcj/useradd jtcjxz/g
代码(部分):
cat /etc/passwd | grep jtcj
ssh 0.0.0..2 useradd jtcjxz
ssh 0.0.0.3 useradd jtcjxz
ssh 0.0.0.4 useradd jtcjxz
ssh 0.0.0.5 useradd jtcjxz
没密码的就是创建,有密码的就是修改。
脚本中不能用普通方法 passwd 直接更改,需要用echo 的方法,命令格式: echo newpasswd | passwd --stdin useradd
(如果提示 --stdin unkown option,用方法二)
全局替换,也可以保留上一个脚本!
很明显,我是方法一 不能用才有了方法二! 平常自己用方法一就好! 但如果不是有很多服务器,还是老老实实用 passwd 修改密码把 毕竟密码不可见 更安全,也或者,echo修改后 history –c
清除一下也可,但这清除的并非文件中,-c清除了文件中也可以找到,用批量改密码然后去删干净记录,也没必要这么折腾对吧,反正,知道echo 密码 可能容易被别人看到的风险就好。不过如果不是root密码 好像也没那么所谓对吧。
[root@controller01 ~]# echo Xz1@#Ty7 | passwd -–stdin jtxzcj
passwd: bad argument -–stdin: unknown option
提示我 --stdin 未知参数 ,what f!
见 方法二!!!
用chpasswd 修改,语法:echo user:newpasswd | chpasswd
亲测 可以!如果再不行,而且不想一台台passwd 修改,就得用 expect 脚本完成了,方式1和2都不行的或者想玩下实验的,可以见我博客中 expect命令详解来玩玩。
[root@controller01 ~]# echo jtcjxz:Xz1@#Ty7 |chpasswd
[root@controller01 ~]#
[root@controller01 ~]# su - jtcjxz
Last login: Mon Apr 6 08:36:57 CST 2020 from 10.237.99.83 on pts/0
[jtcjxz@controller01 ~]$ su - jtcjxz
Password:
Last login: Wed Apr 8 03:03:50 CST 2020 on pts/1
[jtcjxz@controller01 ~]$ logout
[jtcjxz@controller01 ~]$ logout
虽然本地实现可以,但当我ssh 修改其他服务器的时候,发现 不支持 gssapiauth…
这个是ssh版本问题吧 也或许是 开启了sapiauthentication 。
[root@controller01 ~]# ssh 0.0.0.2 echo jtcjxz:Xz1@#Ty7 |chpasswd
/etc/ssh/ssh_config line 57: Unsupported option "gssapiauthentication"
Authorized users only. All activity may be monitored and reported
解决方法就是
vi /etc/ssh/sshd_config
找到 下面两行并注释掉 ,然后重启ssh服务:systemctl restart sshd
(7.0及以上版本)
但如果我要这样搞 我就得一台一台上去操作2次(注释和取消注释)。我疯了才会这样做吧! pass了方法二,于是就有了方法三!
对了,强行解释一波,常理下 该方法是可行的,看我测试机上:
[root@compute1 ~]# ssh 10.233.3.226 echo ccx:ccxplus | chpasswd
The authenticity of host '10.233.3.226 (10.233.3.226)' can't be established.
ECDSA key fingerprint is SHA256:DBump8wHadJ1tDhz2KUePkCN7xtZmmdkjQ6Ooi7j1j8.
ECDSA key fingerprint is MD5:5a:83:52:87:96:08:3a:34:06:38:eb:53:48:f7:58:ff.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.233.3.226' (ECDSA) to the list of known hosts.
[email protected]'s password:
[root@compute1 ~]#
[root@compute1 ~]# ssh [email protected]
[email protected]'s password:
Last login: Tue Apr 7 19:05:37 2020
[ccx@compute1 ~]$ logout
Connection to 10.233.3.226 closed.
[root@compute1 ~]#
方式二中才说 我并不想用expect 来搞,本来不想麻烦的,但我不服输啊!
所以 真香警告! 搞嘛
注: 期间我 放了一些 理论上可行,但实际不行的实例。 请看到最后,不想了解过程的请直接跳到最后看可行方法。
说下先行条件:你的服务器上得有 expect 命令,没有的去装吧,不能yum的,一样,去我博客shell分类中找安装方法把,我现在有点烦躁 并不想去打开我的博客去复制链接放这。
怕服务器有啥不可抗拒因素误导我,所以我先用测试机做的实验!!!!
打开脚本,嘴角带着一丝邪笑,快速敲下最简单并且能达到我要求的命令:spwan ssh 10.233.3.226 echo ccx:ccx |chpasswd
当初研究这个没少被折磨,现在已经搞清楚运行模式,所以现在 熟练的让人心疼??
[root@control ~]$vi zh.sh
#spawn ssh 10.233.3.226 echo ccx:ccx | chpasswd
expect 执行脚本,没报错,完美!
然后登陆,密码错误?我输错了? 再来 错误? 老密码,登上了!! ???没生效??? 咦? 是不是不支持chpasswd
[root@control ~]$expect zh.sh
spawn ssh 10.233.3.226 echo ccx:ccx | chpasswd
[root@control ~]$
[root@control ~]$
[root@control ~]$ssh [email protected]
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
Last failed login: Tue Apr 7 19:37:34 CST 2020 from controller on ssh:notty
There were 3 failed login attempts since the last successful login.
Last login: Tue Apr 7 19:35:10 2020 from controller
[ccx@compute1 ~]$ 登出
Connection to 10.233.3.226 closed.
既然怀疑是不支持 chpasswd 那就试–stdin吧。这时心里已经发憷了,不支持chpasswd? 没理由啊,而且要是不支持chpasswd ,只能用 --stdin, 服务器不支持–stding啊!!凉凉。
[root@control ~]$vi zh.sh
#spawn ssh 10.233.3.226 echo ccx:ccx | chpasswd
spawn ssh 10.233.3.226 echo ccx | passwd --stdin ccx
expect 执行脚本,没报错,完美!
然后登陆,密码错误?我输错了? 再来 错误? 老密码,登上了!! ???没生效??? 咦? 是不是不支持 --stdin ???
[root@control ~]$expect zh.sh
spawn ssh 10.233.3.226 echo ccx | passwd --stdin ccx
[root@control ~]$
[root@control ~]$
[root@control ~]$ssh [email protected]
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
Last failed login: Tue Apr 7 19:38:24 CST 2020 from controller on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Tue Apr 7 19:37:37 2020 from controller
[ccx@compute1 ~]$ 登出
Connection to 10.233.3.226 closed.
what fuck??????????? 哪个环节出问题了? 明明运行都正常着的啊 为啥 凭啥 不给我修改密码,不支持echo模式修改密码???? 不可能啊!! !凭啥啊! 不可能 我不信 。
那么就来一套完整的 试试,我就要用echo修改密码!
[root@control ~]$cat zh.sh
#spawn ssh 10.233.3.226 echo ccx | passwd --stdin ccx
#spawn ssh 10.233.3.226 echo ccx:ccx | chpasswd
spawn ssh 10.233.3.226
expect {
"*assword" { send "root\r";}
"yes/no" {send "yes\r"exp_continue}
}
expect "*]#" {send "echo ccx:ccx|chpasswd\r"}
send "exit\r"
expect eof
执行脚本 并登陆尝试;
成功了 ?成功了!!!!!!! 切 小小改密码而已 能难倒如此优秀的崔崇鑫?! 能难倒 崔崇鑫hero???
测试机 没问题,那么就去服务器上 测试一台吧!!! 祈祷:服务器上别给我有啥限制啊。。。。
开玩笑的了 expect 不可能有啥限制,就是这么自信,开搞;
果然不出所料,一切如预期中 开展进行! 完美! 简简单单 有这么难吗!
注: 我打码了所有ip,别意外! 代码 下面会有说明
既然没问题了,就开始批量搞把
代码(部分):
spawn ssh 0.0.0.3
expect {
"*assword" { send "cloud\r";}
"yes/no" {send "yes\r"exp_continue}
}
expect "*]#" {send "echo jtcjxz:Xz1@#Ty7|chpasswd\r"}
send "exit\r"
expect eof
spawn ssh 0.0.0.4
expect {
"*assword" { send "cloud\r";}
"yes/no" {send "yes\r"exp_continue}
}
expect "*]#" {send "echo jtcjxz:Xz1@#Ty7|chpasswd\r"}
send "exit\r"
expect eof
spawn ssh 0.0.0.5
expect {
"*assword" { send "cloud\r";}
"yes/no" {send "yes\r"exp_continue}
}
expect "*]#" {send "echo jtcjxz:Xz1@#Ty7|chpasswd\r"}
send "exit\r"
expect eof
spawn ssh 0.0.0.6
expect {
"*assword" { send "cloud\r";}
"yes/no" {send "yes\r"exp_continue}
}
expect "*]#" {send "echo jtcjxz:Xz1@#Ty7|chpasswd\r"}
send "exit\r"
expect eof
spawn ssh 0.0.0.7
expect {
"*assword" { send "cloud\r";}
"yes/no" {send "yes\r"exp_continue}
}
expect "*]#" {send "echo jtcjxz:Xz1@#Ty7|chpasswd\r"}
send "exit\r"
expect eof
执行:expect 脚本名
效果如下,注意,期间不要动,安安静静看着就可以了。(懒使人进步)
expect脚本中代码有不懂的,可以直接去我博客shell分类中查看expect详解和实例。