秘钥认证用户自动控制

先上图

再上代码

#!/bin/bash
#author: QingFeng
#qq: 530035210
#blog: http://my.oschina.net/pwd/blog
#自动添加秘钥认证用户
#缺省的配置如下

logdir=/data/log/shell          #日志路径
log=$logdir/shell.log            #日志文件
is_font=1                #终端是否打印日志: 1打印 0不打印
is_log=0                 #是否记录日志: 1记录 0不记录
random_time=$(date +%Y%m%d_%H%M%S)

datef(){
date "+%Y-%m-%d %H:%M:%S"
}

print_log(){
if [[ $is_log -eq 1  ]];then
[[ -d $logdir ]] || mkdir -p $logdir
echo "[ $(datef) ] $1" >> $log
fi
if [[ $is_font -eq 1  ]];then
echo -e "[ $(datef) ] $1"
fi
}

#自动生成key
addautoKey(){

if [[ ! -f /usr/bin/expect ]];then
print_log "$FUNCNAME():不存在expect函数:开始安装."
yum install tcl-devel  tcl expect  -y  -q
print_log "$FUNCNAME():expect函数:安装完成."
fi

mkdir -p /tmp/ssh_$random_time
cd /tmp/ssh_$random_time
expect -c "
                spawn /usr/bin/ssh-keygen -t rsa
                set timeout -1
                expect \"\*id_rsa)\*:\"
                send \"$1\r\"
                expect \"\*no passphrase)\*:\"
                send \"$1\r\"
                expect \"\*again\*:\"
                send \"$1\r\"
                expect eof 

                  "   > /dev/null
num=$(ls  /tmp/ssh_$random_time/$1* -l |wc -l)
if [[ $num  -eq 2   ]];then
print_log  "$FUNCNAME():该用户$1秘钥自动生成完成,路径: /tmp/ssh_$random_time"
else
print_log  "$FUNCNAME():\033[31m该用户$1秘钥自动生成失败,退出\033[0m"
exit
fi
}

#添加用户
addUser(){
if [[  $1 == "" ]];then
print_log "$FUNCNAME():\033[31m用户名不能为空\033[0m"
exit
fi
strlength=$(expr length $1)
if [[ $strlength -lt 5   ]];then
print_log "$FUNCNAME():\033[31m用户名的长度最少大于4,退出\033[0m"
exit
fi
User=$(cat /etc/passwd |grep -v "nologin" |awk -F':' '{if ($3> 500) print $1 }'  |grep "$1")
if [[  -z $User ]];then
print_log "$FUNCNAME():不存在非系统用户:$1,开始添加用户操作."
adduser $1  -g 10
[[ -d /home/$1/.ssh  ]] || mkdir /home/$1/.ssh
addautoKey $1
cp /tmp/ssh_$random_time/$1.pub  /home/$1/.ssh/authorized_keys
chmod 600 /home/$1/.ssh/authorized_keys
chown $1:wheel  /home/$1/  -R
cp /etc/ssh/sshd_config   /etc/ssh/sshd_config_$(date +%Y%m%d_%H%M%S)
sshdUser=$(cat  /etc/ssh/sshd_config |grep "$1")
if [[  -z $sshdUser  ]];then
sed -i "s/AllowUsers/AllowUsers $1/"  /etc/ssh/sshd_config
/etc/init.d/sshd restart
print_log  "$FUNCNAME():更新sshd_config文件并重启sshd完成."
else
print_log  "$FUNCNAME():sshd_config文件中已经存在$1."
fi

else
print_log  "$FUNCNAME():已经存在非系统用户:$1,请确认后在添加."
fi 

}
#查找用户
lookUp(){
loginUser=$(cat /etc/passwd |grep -v "nologin" |awk -F':' '{if ($3> 500) print $1 }')
print_log "$FUNCNAME():如下用户拥有登陆系统权限:\n\033[32m$loginUser\033[0m"
}
#删除用户
deleteUser(){
if [[  $1 == "" ]];then
print_log "$FUNCNAME():\033[31m用户名不能为空\033[0m"
exit
fi
User=$(cat /etc/passwd |grep -v "nologin" |awk -F':' '{if ($3> 500) print $1 }'  |grep "$1")
if [[ ! -z $User   ]];then
print_log "$FUNCNAME():存在非系统用户:$1"
else
print_log "$FUNCNAME():\033[31m不存在非系统用户:$1,退出\033[0m"
exit
fi
userdel -rf $1
if [[ $? -eq 0  ]];then
print_log "$FUNCNAME():删除非系统用户:$1成功."
else
print_log "$FUNCNAME():\033[31m删除非系统用户:$1失败.\033[0m"
fi
cp /etc/ssh/sshd_config   /etc/ssh/sshd_config_$random_time
sed -i "s/$1//g"  /etc/ssh/sshd_config
/etc/init.d/sshd restart
print_log  "$FUNCNAME():更新sshd_config文件并重启sshd完成."

}

case $1  in 

 add)
  addUser $2;;
 look)
  lookUp;;
 delete)
  deleteUser $2;;
   *)
  echo -e "
秘钥认证用户自动控制\n用法示例: \n1.添加/删除秘钥认证用户:    ./account.class.sh  add/delete  用户名 \n2.查找可以登陆的用户    ./account.class.sh  look";;    

esac

改进版,检测系统是否添加key认证,无则自动添加,批量添加key认证用户

上图:

批量添加用户图:

#!/bin/bash
#author: QingFeng
#qq: 530035210
#blog: http://my.oschina.net/pwd/blog
#自动添加秘钥认证用户
#缺省的配置如下
logdir=/data/log/shell          #日志路径
log=$logdir/shell.log            #日志文件
is_font=1                #终端是否打印日志: 1打印 0不打印
is_log=0                 #是否记录日志: 1记录 0不记录
random_time=$(date +%Y%m%d_%H%M%S)

#定义默认公钥
default_publicKey="ssh-dss CCCCB3NzaC1kc3MAAACBAJRKD+AyqOD2gtLSAPpbbMEy/VrMW8Z8fof1nyKA9OppiUWUWdVL9iJGDdBzvVB3hb9KZYX1bsns77KrD/VB+8jsCe/62rrsUmxJoUwvWyF2B+cvboxwe5cdXyTawt1bAMHNq8jiWrgSDaR7bplFXD3I6lwYk89I+ofxafXxmZE7AAAAFQCay8NRvgNMxkbExxhMLeRZBK2xpwAAAIEAhUpYCf0STqTUcTSTabQDmfizywG7+ZFSvppJCMrWdobG/+rZ61tN2xGWK4zRP13NJOVcIDaXsQwhhuZbGD8d1tEwGqldBAlTsouJWGiWPMJPhUfjKEFTIHn8ug2zDP/vE7yNgiuMalhn+Fglt+AMG78tiOCn1P7kYVjPeGklr8AAAACAWm3qmqYOiTIMtShfmcIJc06XOPPOjxXzwntN+c8rmy+gZbI6wx4vRwYbldaduMtPn7Q29BqJfcCAy/P7ymVyrX/a2ksWehddk7HdyUHnq9WAX1+MxE4BZq7nV4MHD3Fyn8bay+D76BgQdZjTta3dNXwbA5WdmJnZi68Bk5ZXcjM="
#定义whell组可以无密码登陆
default_Wheel="%wheel        ALL=(ALL)       NOPASSWD: ALL"
#定义sshd配置文件
default_user="zhangsan"
default_sshdConfig="
Protocol 2
SyslogFacility AUTHPRIV
StrictModes no
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
PermitEmptyPasswords no
PasswordAuthentication no
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
UsePAM yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL
X11Forwarding yes
UseDNS no
Subsystem       sftp    /usr/libexec/openssh/sftp-server
AllowUsers   $default_user"

datef(){
date "+%Y-%m-%d %H:%M:%S"
}

print_log(){
if [[ $is_log -eq 1  ]];then
[[ -d $logdir ]] || mkdir -p $logdir
echo "[ $(datef) ] $1" >> $log
fi
if [[ $is_font -eq 1  ]];then
echo -e "[ $(datef) ] $1"
fi
}

#自动生成key
addautoKey(){

if [[ ! -f /usr/bin/expect ]];then
print_log "$FUNCNAME():不存在expect函数:开始安装."
yum install tcl-devel  tcl expect  -y  -q
print_log "$FUNCNAME():expect函数:安装完成."
fi

mkdir -p /tmp/ssh_$random_time
cd /tmp/ssh_$random_time
expect -c "
                spawn /usr/bin/ssh-keygen -t rsa
                set timeout -1
                expect \"\*id_rsa)\*:\"
                send \"$1\r\"
                expect \"\*no passphrase)\*:\"
                send \"$1\r\"
                expect \"\*again\*:\"
                send \"$1\r\"
                expect eof 

                  "   > /dev/null
num=$(ls  /tmp/ssh_$random_time/$1* -l |wc -l)
if [[ $num  -eq 2   ]];then
print_log  "$FUNCNAME():该用户$1秘钥自动生成完成,路径: /tmp/ssh_$random_time"
else
print_log  "$FUNCNAME():\033[31m该用户$1秘钥自动生成失败,退出\033[0m"
exit
fi
}

#添加用户
addUser(){
if [[  $1 == "" ]];then
print_log "$FUNCNAME():\033[31m用户名不能为空\033[0m"
exit
fi
strlength=$(expr length $1)
if [[ $strlength -lt 5   ]];then
print_log "$FUNCNAME():\033[31m用户名的长度最少大于4,退出\033[0m"
exit
fi
User=$(cat /etc/passwd |grep -v "nologin" |awk -F':' '{if ($3> 500) print $1 }'  |grep "$1")
if [[  -z $User ]];then
print_log "$FUNCNAME():不存在非系统用户:$1,开始添加用户操作."
adduser $1  -g 10
addautoKey $1
[[ -d /home/$1/.ssh  ]] || mkdir -p /home/$1/.ssh
cp /tmp/ssh_$random_time/$1.pub  /home/$1/.ssh/authorized_keys
chmod 600 /home/$1/.ssh/authorized_keys
chown $1:wheel  /home/$1/  -R
cp /etc/ssh/sshd_config   /etc/ssh/sshd_config_$(date +%Y%m%d_%H%M%S)
sshdUser=$(cat  /etc/ssh/sshd_config |egrep -v "^$|^#" |grep "$1")
if [[  -z $sshdUser  ]];then
sed -i "s/AllowUsers/AllowUsers $1/"  /etc/ssh/sshd_config
/etc/init.d/sshd restart
print_log  "$FUNCNAME():更新sshd_config文件并重启sshd完成."
else
print_log  "$FUNCNAME():sshd_config文件中已经存在$1."
fi

else
print_log  "$FUNCNAME():已经存在非系统用户:$1,请确认后在添加."
fi 

}
#查找用户
lookUp(){
loginUser=$(cat /etc/passwd |grep -v "nologin" |awk -F':' '{if ($3> 500) print $1 }')
print_log "$FUNCNAME():如下用户拥有登陆系统权限:\n\033[32m$loginUser\033[0m"
}
#删除用户
deleteUser(){
if [[  $1 == "" ]];then
print_log "$FUNCNAME():\033[31m用户名不能为空\033[0m"
exit
fi
User=$(cat /etc/passwd |grep -v "nologin" |awk -F':' '{if ($3> 500) print $1 }'  |grep "$1")
if [[ ! -z $User   ]];then
print_log "$FUNCNAME():存在非系统用户:$1"
else
print_log "$FUNCNAME():\033[31m不存在非系统用户:$1,退出\033[0m"
exit
fi
userdel -rf $1
if [[ $? -eq 0  ]];then
print_log "$FUNCNAME():删除非系统用户:$1成功."
else
print_log "$FUNCNAME():\033[31m删除非系统用户:$1失败.\033[0m"
fi
cp /etc/ssh/sshd_config   /etc/ssh/sshd_config_$random_time
sed -i "s/$1//g"  /etc/ssh/sshd_config
/etc/init.d/sshd restart
print_log  "$FUNCNAME():更新sshd_config文件并重启sshd完成."

}
#检查key认证
checkUser(){
if [[  $default_user == "" ]];then
print_log "$FUNCNAME():\033[31m用户名不能为空\033[0m"
exit
fi
strlength=$(expr length $default_user)
if [[ $strlength -lt 5   ]];then
print_log "$FUNCNAME():\033[31m用户名的长度最少大于4,退出\033[0m"
exit
fi
User=$(cat /etc/passwd |grep -v "nologin" |awk -F':' '{if ($3> 500) print $1 }'  |grep "$default_user")
if [[  -z $User ]];then
print_log "$FUNCNAME():不存在非系统用户:$default_user,开始添加用户操作."
adduser $default_user  -g 10
[[ -d /home/$default_user/.ssh  ]] || mkdir /home/$default_user/.ssh
echo $default_publicKey >   /home/$default_user/.ssh/authorized_keys
chmod 600 /home/$default_user/.ssh/authorized_keys
chown $default_user:wheel  /home/$default_user/  -R
cp /etc/ssh/sshd_config   /etc/ssh/sshd_config_$(date +%Y%m%d_%H%M%S)
sshdUser=$(cat  /etc/ssh/sshd_config |egrep -v "^$|^#"|grep "$default_user")
if [[  -z $sshdUser  ]];then
echo -e "$default_sshdConfig" > /etc/ssh/sshd_config
sed -i "s/^$//g" /etc/ssh/sshd_config
check_suders=$(cat  /etc/sudoers |egrep -v  "^#|^$"|grep "%wheel")
if [[  -z  $check_suders  ]];then
echo  -e  "$default_Wheel" >>  /etc/sudoers
fi
/etc/init.d/sshd restart
print_log  "$FUNCNAME():添加key认证,更新sshd_config文件并重启sshd完成."
else
print_log  "$FUNCNAME():sshd_config文件中已经存在$default_user."
fi

else
check_sshdnum=1
check_sudersnum=1
check_sshd=$(cat /etc/ssh/sshd_config |egrep  -v "^#|^$" |grep "$default_user")
if [[  -z $check_sshd ]];then
check_sshdnum=0
print_log "已经添加$default_user用户,但是没有配置sshd_config"
fi

check_suders=$(cat /etc/sudoers |egrep  -v "^#|^$" |grep "wheel" |grep "NOPASSWD")
if [[  -z $check_suders  ]];then
check_sudersnum=0
print_log "已经添加$default_user用户,但是没有配置sudoers"
fi 

if [[ $check_sshdnum -ne 0 && $check_sudersnum -ne 0 ]];then
print_log "该服务器已经配置秘钥认证."
fi

fi

}

case $1  in 

 add)
  addUser $2;;
 look)
  lookUp;;
 delete)
  deleteUser $2;;
 check)
  checkUser ;;
   *)
  echo -e "
秘钥认证用户自动控制\n用法示例: \n1.添加/删除秘钥认证用户:    ./account.class.sh  add/delete  用户名 \n2.查找可以登陆的用户    ./account.class.sh  look\n3.检测系统是否是key认证,不是则添加key认证   ./account.class.sh  check\n(默认增加一个[$default_user]的认证用户)";;    

esac

文章转载自 开源中国社区 [http://www.oschina.net]

时间: 2024-09-21 09:22:35

秘钥认证用户自动控制的相关文章

LINUX用户建立秘钥认证实现SHELL脚本管理、分发和部署

环境: ssh server: 192.168.100.29  server.example.com ssh client: 192.168.100.30  client.example.com 通过root用户建立秘钥认证实现SHELL脚本管理,分发,部署 首先client端创建秘钥对,并将公钥分发给需要登录的SSH服务端 注:公钥相当于锁,私钥相当于钥匙,我们这里相当于在客户端创建一对钥匙和锁,想要做到SSH免密码登录,就相当于我们将锁分发到服务端并装锁,然后客户端就可以利用钥匙开锁. 一.

Linux下实现SSH免密码登录和实现秘钥的管理、分发、部署SHELL脚本分享_linux shell

环境: ssh server: 192.168.100.29  server.example.com ssh client: 192.168.100.30  client.example.com 通过root用户建立秘钥认证实现SHELL脚本管理,分发,部署 首先client端创建秘钥对,并将公钥分发给需要登录的SSH服务端 注:公钥相当于锁,私钥相当于钥匙,我们这里相当于在客户端创建一对钥匙和锁,想要做到SSH免密码登录,就相当于我们将锁分发到服务端并装锁,然后客户端就可以利用钥匙开锁. 一.

为什么XShell登录的用户不用事先生成秘钥

问题描述 为什么XShell登录的用户不用事先生成秘钥 看ssh的原理上说的,在一个用户可以进行ssh登录之前,他需要先在客户端生成自己的密钥对,然后通过安全的方式将秘钥对里的公钥放到服务器上~/.ssh/keyras_pub下面,但是实际用XShell登录的时候确不需要生成,直接登录就可以了,这是什么原理呢?求指点. 解决方案 如果是用密码方式就不需要私钥

用命令查找Windows 8预装电脑中内置的产品秘钥

从 Windows 8 开始,微软在 OEM 预装电脑中采用了新的 OA 3.0(OEM 激活技术 3.0),包含更严密的激活特性.但是有许多用户在手动重装 Windows RT.Windows 8/8.1 时,可能会需要手动输入主机预装的产品秘钥.本文将为大家介绍查看 Windows 8 预装计算机中内置产品秘钥最简便,适应性最广的方法,完全不需要用到第三方软件. OA 3.0 技术与之前的 OEM 激活机制主要的改进在于: 1每台主机采用唯一的产品秘钥: 2密钥不再印刷在机身或电源适配器上,

多个git账户生成多份rsa秘钥实现多个账户同时使用配置

使用过git的童鞋应该对id_rsa秘钥不陌生,总得用github吧,生成id_rsa很容易: ssh-keygen -t rsa -C "$your_email" 默认情况下,这个秘钥是在你账户的.ssh目录生成id_rsa文件,对应一个id_rsa.pub公钥文件, $ ssh-keygen -t rsa -C "test@test.com" Generating public/private rsa key pair. Enter file in which

百度地图入门一:获取秘钥和基本地图功能实现

首先下载对应资源的包 百度一下:百度地图 sdk->百度地图api->Android 开发->SDK下载,然后选择我们需要的开发资源,这里我选择了 定位,基础地图,检索功能,Lbs云检索,计算功能,选择这5个之后点击开发包下载,这样你就会获得一个压缩文件,里面有个libs文件夹,将其中的内容全部复制的你的libs里面去即可. 然后就要申请秘钥:sha1+你的包名(这里容易弄错),包名是你清单文件中package名称 点击首页->申请秘钥: sha1获得:eclipse->pr

勒索软件撕逼大战:Chimera软件秘钥遭同行泄露

近日,Petya 和Mischa勒索软件家族的开发者在网络上公布了其竞争对手--Chimera勒索软件的秘钥. Malwarebytes公司的安全研究人员目前正针对网上公布的秘钥研发"解密器",以帮助被Chimera勒索软件影响的用户实现自动解密的过程. Chimera是一种勒索软件变种,出现于2015年11月,这种勒索软件是通过邮件的形式发给受害人的,邮件内中包含了前往Dropbox页面的链接.用户打开的这个链接页面就感染了Chimera勒索软件.一旦中招,就会被要求支付2.45比特

新浪微博认证用户有何特权?

个人认证用户有下面特权: 1. 新浪认证标识易于被识别:粉丝将第一时间识别您的身份,及时关注到您的最新动态. 2. 搜索优先特权:您的相关搜索结果将优先出现,给您的粉丝最易找到您的机会. 3. 未登录状态下可被查看发言:认证用户的发言,其他用户未登录状态下可直接查看. 4. 名人堂:只有微博认证用户才可以进入名人堂.

新浪微博其他类型的认证用户是否可以使用企业版?

  企业版仅适用于企业认证用户,若您急需申请使用企业版,只能重新认证为企业版用户,此种情况需要您先撤掉原有的认证再申请企业版.网站官方认证都用户可直接申请转为企业认证用户,届时即可使用企业版.认证企业用户成功后即可重新恢复认证. 各种认证都有相应的专业版使用,所以撤销原有认证再申请企业版需谨慎.