文章目录
- 创建用户
- 创建用户密码
- 免密脚本
- 当前主机用户不是root
- 当前主机用户是root,远程主机多个用户uid为0
- 利用shell脚本实现远程主机uid为0的用户只有root一个
前言:
由于客户的机器都是suse的,并且uid为0的用户有 root、sysop、appadmin 三个用户,导致有的时候远程连接,即使是以 root 用户的身份登录,也会出现当前用户不是 root 的情况,以至于部署和免密脚本会失败
以下是通过注释
/etc/passwd
文件的方式,来暂时注销 sysop 和 appadmin 这两个用户,以此来达到当前uid为0的用户只有 root登陆 Linux 系统时,虽然输入的是自己的用户名和密码,但其实 Linux 并不认识你的用户名称,它只认识用户名对应的 ID 号(也就是一串数字)
Linux 系统将所有用户的名称与 ID 的对应关系都存储在
/etc/passwd
文件中
- ip:
- 192.168.72.12
- 192.168.72.13
- 192.168.72.14
- user:
- root
- appadmin
- sysop
创建用户
-m
创建用户的家目录(suse默认不会创建)
-U
创建用户的基本组(suse默认不会创建)
-o
允许创建重复的用户
-u
指定用户uid
useradd -mUo appadmin -u 0
useradd -mUo sysop -u 0
创建用户密码
创建用户密码,由于
suse
的passwd
命令没有--stdin
参数,没法使用echo '<user password>' | passwd --stdin <user name>
这个方式创建用户密码但是可以通过
echo '<user name>:<user password>' | chpasswd
的方式来创建用户密码这两种方式,是为了免交互为用户创建密码,直接使用
passwd
或者chpasswd
命令,是需要输入两次密码,对于写脚本不友好
echo 'appadmin:123.com' | chpasswd
echo 'sysop:123.com' | chpasswd
快速注释,方便快速回到root用户
for i in $(awk -F : '{if($3==0){print$1}}' /etc/passwd | grep -v root);do sed -i "/$i/s/^/#/g" /etc/passwd;done
快速取消注释
for i in $(awk -F : '{if($3==0){print$1}}' /etc/passwd);do sed -i "/$i/s/^#//g" /etc/passwd;done
免密脚本
我的用户密码全部设置为123.com了,需要使用下面的脚本,记得修改密码为自己的用户密码
#!/usr/bin/env bash
ips='
192.168.72.12
192.168.72.13
192.168.72.14
'
# 将上面的ip变量格式化成数组的形式
ip_arry=($(printf "%q\n" ${ips}))
# 备份root用户的.ssh目录
[[ -d "/root/.ssh" ]] && mv /root/.ssh{,-$(date +"%F_%T")}
# 生成新的公钥和私钥
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa -q
for (( i=0; i<${#ip_arry[@]}; i++ ))
do
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@${ip_arry[i]} -o \"StrictHostKeyChecking no\"
expect {
\"*assword*\" {send \"123.com\r\"; exp_continue}
\"*assword*\" {send \"123.com\r\";}
}"
done
当前主机用户不是root
通过
whoami
命令,确保当前的用户不是root
,可以使用ssh sysop@ip
来切换用户此时,执行上面的脚本会报错,如果
-f
指定的目录不是用户的家目录,ssh-keygen
无法自动创建,需要手动创建
/usr/bin/ssh-copy-id: ERROR: failed to open ID file '/root/.ssh/id_rsa.pub': No such file or directory
当前主机用户是root,远程主机多个用户uid为0
执行上面的脚本没有问题,可以实现root用户免密
但是连接远程主机,查看当前用户,显示为非root用户
ssh root@192.168.72.13 "whoami"
利用shell脚本实现远程主机uid为0的用户只有root一个
#!/usr/bin/env bash
ips='
192.168.72.12
192.168.72.13
192.168.72.14
'
ip_arry=($(printf "%q\n" ${ips}))
user_name=$(awk -F : '{if($3==0){print$1}}' /etc/passwd | grep -v root)
for (( i=0; i<${#ip_arry[@]}; i++ ))
do
for name in ${user_name}
do
j=($(printf "%q\n" ${name}))
ssh root@${ip_arry[i]} "sed -i \"/${name[j]}/s/^/#/g\" /etc/passwd"
done
done
当然,服务器是人家的,所以,自己的服务搞定以后,要取消sysop和appadmin的注释,不能影响客户的使用,使用一下脚本实现了取消注释
#!/usr/bin/env bash
ips='
192.168.72.12
192.168.72.13
192.168.72.14
'
ip_arry=($(printf "%q\n" ${ips}))
user_name=$(awk -F : '{if($3==0){print$1}}' /etc/passwd | sed 's/#//')
for (( i=0; i<${#ip_arry[@]}; i++ ))
do
for name in ${user_name}
do
j=($(printf "%q\n" ${name}))
ssh root@${ip_arry[i]} "sed -i \"/${name[j]}/s/^#//g\" /etc/passwd"
done
done
仅以此篇来记录自己的学习和成长的过程,虽然并不适用与大家的场景,不过用来练习shell脚本,还是可以的