linux关机命令
linux关机命令
知识,本该纯粹真实。 不应为乱象而迷失,因避讳而藏掖。
linux关机命令有五个,分别如下:shutdown。poweroff。init。reboot。halt。
Crontab介绍:Linux crontab是用来crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρ?νο?),原意是时间。通常,crontab储存的指令被守护进程激活, crond常常在后台
Crontab介绍:
Linux crontab是用来crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρ?νο?),原意是时间。通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。当安装完成操作系统之后,默认便会启动此任务调度命令。crond 命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。
注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。
yum install vixie-cron
yum install crontabs
注:vixie-cron软件包是cron的主程序;
crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
cron是linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:
/sbin/service crond start #启动服务
/sbin/service crond stop #关闭服务
/sbin/service crond restart #重启服务
/sbin/service crond reload #重新载入配置
service crond status
ntsysv #查看crontab服务是否已设置为开机启动
chkconfig –level 35 crond on #加入开机自动启动
crontab -e #编辑cron任务模式
i #默认文字编辑器为vim,按i字母键即可添加cron任务
30 3 * * * /usr/local/etc/rc.d/lighttpd restart #将命令代码放入,此命令意义为每天的03:30 重启apache
ESC #按ESC键退出编辑模式
:wq #键入:wq保存
service crond restart #重启crontab服务
crontab -l
#每天的08:30 重启电脑
30 08 * * * /sbin/shutdown -r now
(1)语 法:
crontab [-u <用户名称>][配置文件] 或 crontab { -l | -r | -e }
-u #<用户名称> 是指设定指定<用户名称>的定时任务,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的定时任务。
-l #列出该用户的定时任务设置。
-r #删除该用户的定时任务设置。
-e #编辑该用户的定时任务设置。
(2)命令时间格式 :
* * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
(3)一些Crontab定时任务例子:
30 21 * * * /usr/local/etc/rc.d/lighttpd restart #每晚的21:30 重启apache
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart #每月1、10、22日的4 : 45重启apache
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart #每周六、周日的1 : 10重启apache
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart #每天18 : 00至23 : 00之间每隔30分钟重启apache
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart #每星期六的11 : 00 pm重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart #晚上11点到早上7点之间,每隔一小时重启apache
* */1 * * * /usr/local/etc/rc.d/lighttpd restart #每一小时重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart #每月的4号与每周一到周三的11点重启apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart #一月一号的4点重启apache
*/30 * * * * /usr/sbin/ntpdate cn.pool.ntp.org #每半小时同步一下时间
0 */2 * * * /sbin/service httpd restart #每两个小时重启一次apache
50 7 * * * /sbin/service sshd start #每天7:50开启ssh服务
50 22 * * * /sbin/service sshd stop #每天22:50关闭ssh服务
0 0 1,15 * * fsck /home #每月1号和15号检查/home 磁盘
1 * * * * /home/bruce/backup #每小时的第一分执行 /home/bruce/backup这个文件
00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \; #每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
30 6 */10 * * ls #每月的1、11、21、31日是的6:30执行一次ls命令
history查看历史操作记录,并显示操作时间
在查看历史的操作记录有两种方式
1.在用户的目录下的.bash_history文件中
[root@node1 ~]# vi ~/.bash_history
reboot
vi /etc/sysconfig/network-scripts/ifcfg-eth0
setup
service netwok restart
service network restart
ping 192.168.11.70
vi /etc/hosts
vi /etc/sysconfig/network
df -h
shutdown -h now
exit
su - highgo
service iptables stop
shutdown -h now
2.直接执行history命令
[root@node1 ~]# history
1 ll
2 rm -rf pgpool*
3 ll
4 tar -xvf postgresql-9.4.4.tar.gz
5 mkdir pgsql-9.4
6 mkdir -p pgsql/data
7 cls
8 ls
9 cd postgresql-9.4.4
10 ./configure --prefix=/opt/pgsql-9.4/
11 make
12 make clean
这两种方式虽然能看到执行的命令,但是不能看出执行的时间,我们进行以下操作,让history能显示执行的时间
编辑/etc/bashrc文件,添加以下四行:
HISTFILESIZE=2000
HISTSIZE=2000
HISTTIMEFORMAT='%F %T '
export HISTTIMEFORMAT
[root@node1 ~]# vi /etc/bashrc
[root@node1 ~]# source /etc/bashrc
[root@node1 ~]# history
999 2017-03-23 16:14:29 shutdown -h now
1000 2017-03-23 16:14:34 history
1001 2017-03-23 16:21:56 vi /etc/bashrc
1002 2017-03-23 16:22:29 source /etc/bashrc
1003 2017-03-23 16:22:32 history
注:HISTFILESIZE定义了.bash_history中保存命令的总数,默认是1000,这里改成了2000,HISTSIZE设置了history命令输出最多的记录总数,
HISTTIMEFORMAT定了时间显示格式。
以前的操作记录都会显示更改/etc/bashrc 文件的时间,而不是真正的操作时间,只有更改完/etc/bashrc以后的操作记录会显示正确的时间
1、查看当前登录用户信息
who命令:
who缺省输出包括用户名、终端类型、登陆日期以及远程主机。
who /var/log/wtmp
可以查看自从wtmp文件创建以来的每一次登陆情况
(1)-b:查看系统最近一次启动时间
(2)-H:打印每列的标题
users命令:
打印当前登录的用户,每个显示的用户名对应一个登陆会话。
2、查看命令历史
每个用户都有一份命令历史记录
查看$HOME/.bash_history
或者在终端输入: history
3、last命令
查看用户登录历史
此命令会读取 /var/log/wtmp文件;/var/log/btmp可以显示远程登陆信息。
last默认打印所有用户的登陆信息。
如果想打印某个用户的登陆信息,可以使用
last 用户名
选项:
(1)-x:显示系统开关机以及执行等级信息
(2)-a:将登陆ip显示在最后一行
(3)-f :读取特定文件,可以选择 -f /var/log/btmp文件
(4)-d:将IP地址转换为主机名
(5)-n:设置列出名单的显示列数
(6)-t:查看指定时间的用户登录历史
例如:
last -t 20150226160404
显示这个时间戳之前的登陆历史
4、lastlog命令
查看所有用户最近一次登录历史
命令将读取/var/log/lastlog文件;用户排列顺序按照/etc/passwd中的顺序
选项:
(1) -u:查看某个用户的最后一次登陆历史
例如: lastlog -u test
查看用户test的登陆历史
(2) -t:查看最近几天之内的用户登录历史
例如: lastlog -t 1
查看最近1天之内的登陆历史
(3) -b:查看指定天数之前的用户登录历史
例如: lastlog -b 60
查看60天之前的用户登录历史
5、ac命令
根据/var/log/wtmp文件中的登陆和退出时间报告用户连接的时间(小时),默认输出报告总时间
(1)-p:显示每个用户的连接时间
(2)-d:显示每天的连接时间
(3)-y:显示年份,和-d配合使用
history的历史记录,同一个用户的各个会话,读取到的内容也是不一样的,原因是它读取的是shell会话缓存里的内容。只有当用户退出当前会话的时候,会话里的缓存内容才会写入~/.bash_history里。
猜测:用户登录后,首先把~/.bash_history里的内容读入缓存,然后当前会话的命令执行记录,也写入缓存中,这样相同用户不同会话,读到的history内容是不一样的。
linux默认配置是当打开一个shell终端后,执行的所有命令均不会写入到~/.bash_history文件中,只有当前用户退出后才会写入,这期间发生的所有命令其它终端是感知不到的。
export HISTTIMEFORMAT="`whoami` : | %F | %T: | "
网管还应该在"/etc/skel/.bash_logout" 文件中添加下面这行"rm -f $HOME/.bash_history" 。这样,当用户每次注销时,“.bash_history”文件都会被删除.
$HISTSIZE 设置bash会员期间历史包含的命令数量
$HISTFILESIZE 设置历史文件中实际存储的命令数量
$HISTFILE bash启动的时候会读取~/.bash_history文件并载入到内存中,这个变量就用于设置.bash_history文件,bash退出时也会把内存中的历史回写到.bash_history文件
清空当前会话缓存里历史命令 history -c 要想彻底清空历史命令,需要先将 .bash_history的内容删除,接着使用 history -c, 这样才会彻底清空命令历史。
HISTSIZE:shell进程的缓冲区保留的历史命令的条数;
HISTFILESIZE:命令历史文件可保存的历史命令的条数;
HISTIGNORE="str1:str2:…"忽略string1,string2历史;
history -w 让bash将历史命令立即从内存写到.bash_history文件
history -a 将目前新增的 history 历史命令写入.bash_history文件
history 命令常见用法 ?
语法:
history [n | -c | -rnaw histfile]
参数:
n:数字,列出最近的 n 条历史命令
-c:将当前shell 缓存中的 history 内容全部清除
-a:将当前shell缓存中的history 内容append附加到 histfile 中,如果没有指定 histfile,则默认写入 ~/.bash_histroy;-a:将bash 内存中历史命令追加到 .bash_history 历史命令文件中, 默认只有退出 shell 是才会保存
-r:将 histfile 中的内容读取到当前shell的缓存中;-r:读取历史文件到历史列表(将 .bash_history重新读取一遍,写入到当前bash进程的内存中)
-w:将当前shell缓存的history历史列表写入到指定的文件;-w:保存历史列表到指定的历史文件(history -w /PATH/TO/SOMEFILE 将内存中命令执行的历史列表保存到指定的 /PATH/TO/SOMEFILE中)
-a: 追加本次会话新执行的命令历史列表至历史文件,因为多终端所以如果想看当前都发生了什么操作就可以执行-a进行查看
-n: 读历史文件(本地数据)中未读过的行到历史列表(内存数据)
-r: 读历史文件(本地数据)附加到历史列表(内存数据)
-w: 保存历史列表(内存数据)到指定的历史文件(本地数据)
-s: 展开历史参数成一行,附加在历史列表后。用于伪造命令历史
http://blog.51cto.com/skypegnu1/1941153
利用history命令,可以使每个登录会话只看到自己的命令历史记录,这样即保证安全,又方便使用。即使是同一个用户的不同会话,也要保证同一个用户的各个会话只能看到自己的历史记录。不方便的是,你每次登录进去,都是一个新的会话,就看不到任何的history记录。
HISTCONTROL:如果设置为 ignorespace, 以 space 开头的行将不会插入到历史列表中。如果设置为 ignoredups, 匹配上一次历史记录的行将不会插入。设置为 ignoreboth 会结合这两种选项。如果没有定义,或者设置为其他值,所有解释器读取的行都将存入历史列表,但还要经过 HISTIGNORE 处理。这个变量的作用可以被 HISTIGNORE 替代。多行的组合命令的第二和其余行都不会被检测,不管 HISTCONTROL 是什么,都会加入到历史中。
HISTFILE:保存命令历史的文件名 (参见下面的 HISTORY 历史章节)。默认值是 ~/.bash_history。如果取消定义,在交互式 shell 退出时命令历史将不会保存。
HISTFILESIZE:历史文件中包含的最大行数。当为这个变量赋值时,如果需要的话,历史文件将被截断来容纳不超过这个值的行。默认值是 500。历史文件在交互式 shell 退出时也会被截断到这个值。
HISTIGNORE:一个冒号分隔的模式列表,用来判断那个命令行应当保存在历史列表中。每个模式都定位于行首,必须匹配整行 (没有假定添加 ‘*’)。在 HISTCONTROL 指定的测试结束后,这里的每个模式都要被测试。除了平常的 shell 模式匹配字符, ‘&’ 匹配上一个历史行。‘&’ 可以使用反斜杠来转义;反斜杠在尝试匹配之前将被删除。多行的组合命令的第二行以及后续行都不会被测试,不管 HISTIGNORE 是什么,都将加入到历史中。
HISTSIZE:命令历史中保存的历史数量 (参见下面的 HISTORY 历史章节)。默认值是 500。
实例来自https://blog.csdn.net/m0_38020436/article/details/78730631
设置uid大于等于500的用户的history安全性
需求:
记录统一转移到/var/history目录下;
用户无法删除自己的history文件,无法清空history;
多个终端共享history,实时追加;
限制history文件大小和保存的条数;
举例用户,lionel;uid=523
1)配置全局环境变量文件/etc/profile
# vi /etc/profile //添加以下内容
# add by coolnull
if [ $UID -ge 500 ];then
readonly HISTFILE=/var/history/$USER-$UID.log
readonly HISTFILESIZE=50000
readonly HISTSIZE=10000
readonly HISTTIMEFORMAT='%F %T '
readonly HISTCONTROL=ignoredups
shopt -s histappend # 这条配置,就可以使一个终端的用户监控到另一个终端用户输入的命令内容
readonly PROMPT_COMMAND="history -a"
fi
创建目录结构
# mkdir /var/history
配置目录权限,使得用户有权限创建自己的history文件
# chmod 777 /var/history
# chmod a+t /var/history
2)限制用户删除自己的history文件
# chattr +a /var/history/lionel-522.log
3)限制用户修改自己主目录的环境变量配置文件
# chattr +a /home/lionel/.bash*
# lsattr /home/lionel/.bash*
-----a------- /home/lionel/.bash_logout
-----a------- /home/lionel/.bash_profile
-----a------- /home/lionel/.bashrc
4)禁止普通用户切换到系统中其他shell环境(一般包括csh,tcsh,ksh)
# chmod 750 tcsh(csh是tcsh的软连接,设置tcsh就可以了)
# chmod 750 /bin/ksh
普通帐号测试
[zhangfei@node1 ~]$ tcsh
-bash: /bin/tcsh: Permission denied
[zhangfei@node1 ~]$ ksh
-bash: /bin/ksh: Permission denied
`chmod a+t /var/history` 是一个 Linux 命令,用于更改文件或目录的权限。
在这个命令中,`chmod` 是用于修改权限的命令,`a` 表示所有用户,`+t` 表示设置粘滞位。
粘滞位是一种特殊的权限标志,它只对目录有效。当粘滞位被设置在一个目录上时,只有目录的所有者、文件的所有者和超级用户才能删除或重命名该目录中的文件。其他用户只能在该目录中创建新文件,但不能删除或修改其他用户的文件。
因此,`chmod a+t /var/history` 命令将为 `/var/history` 目录设置粘滞位,以确保只有目录的所有者、文件的所有者和超级用户才能删除或重命名该目录中的文件。其他用户只能在该目录中创建新文件,但不能删除或修改其他用户的文件。
通过chpasswd命令可实现迅速为用户批量设置密码
实例:写一个脚本,实现批量添加20个用户user1-20,密码为用户名和后面跟5个随机字符
#!/bin/sh
# 思路:通过for循环,创建多个用户和用户其对应的随机密码文件,在用chpasswd命令实现批量设置密码
# 创建user1~20用户,并创建其对应的随机密码文件
for ((i=1; i<=20; i++));
do
/usr/sbin/useradd user$i
/bin/echo -e "user$i:user$i`echo user$i|md5sum|cut -c 5-9`">>useradd.txt;
done
# 通过chpasswd命令批量设置密码
/usr/sbin/chpasswd < useradd.txt
[root@svr5 ~]# vim uaddwhile.sh
#!/bin/bash
PREFIX="stu" //定义用户名前缀
i=1
while [ $i -le 20 ]
do
useradd ${PREFIX}$i //添加的用户名为:前缀+编号
echo "123456" | passwd --stdin ${PREFIX}$i &> /dev/null
let i++
done
if [ -z $1 ]
then
echo "Error:userfile is not input!"
elif [ ! -e $1 ]
then
echo "Error:$1 is not exist!"
elif [ -z $2 ]
then
echo "Error:passwdfile is not input!"
elif [ ! -e $2 ]
then
echo "Error:$2 is not exist"
else
Num=`awk 'BEGIN{N=0}{N++}END{print N}' $1`
for i in `seq 1 $Num`
do
USERNAME=`sed -n ${i}p $1`
PASSWD=`sed -n ${i}p $2`
getent passwd $USERNAME &> /dev/null
if [ "$?" = "0" ]
then
echo "$USERNAME is exist"
else
useradd $USERNAME
echo $PASSWD | passwd --stdin $USERNAME &> /dev/null
echo "$USERNAME is created successfully!"
fi
done
fi
#! /bin/bash
read -p "请输入需要创建的用户名:" name
# -z 字符串长度为0
if [ -z $name ]; then
echo "必须输入用户名"
exit 0
fi
useradd "$name" &> /dev/null
# $? 代表程序的退出代码(0代表执行成功,非0代表执行失败)
if [ $? != 0 ]; then
echo -e "\033[31m $name用户已存在 \033[0m"
exit 0
else
echo -e "\033[32m $name用户创建成功 \033[0m"
fi
# 屏蔽回显
stty -echo
read -p "请输入需要设置的用户密码:" passwd
# 显示回显
stty echo
if [ -z $passwd ]; then
echo 123456 | passwd --stdin "$name" &> /dev/null
echo -e "\n\033[32m 默认密码为123456 \033[0m"
else
echo $passwd | passwd --stdin "$name" &> /dev/null
echo -e "\n\033[32m $name密码创建成功 \033[0m"
fi
chmod 755 add_user.sh
./add_user.sh
# 彻底删除用户userdel -r 用户名
#! /bin/bash
# example ./adduser.sh username [password]
[ $# -eq 0 ] && echo "At least one paramter is required!" && exit 1
id $1 >& /dev/null && echo "user '$1' already exists!" && exit 2
useradd $1 && if test $# -eq 1; then echo $1; else echo $2; fi | passwd --stdin $1 &> /dev/null && echo "add user $1 success" && exit 0
echo "something above goes wrong" && exit 3
脚本接受两个参数:username、[password]
username必填,password选填写,未填写password时,用户名和密码都是username
chmod +x adduser.sh
#./adduser.sh username [password]
./adduser.sh djzhao passw0rd!!
./adduser.sh djzhao2
使用[ arg... ]条件表达式判断是否传参,$#表示参数数量,如果参数数量等于0(-eq),则终止脚本,返回错误码1
使用id指令查询需要创建的用户是否存在,如果用户存在,表达式id $1的返回值($?)为0,则终止脚本,返回错误码2
其中表达式>& /dev/null可以隐藏表达式id $1的输出信息(重定向到空设备)
执行用户添加和设置密码,使用表达式if test $# -eq 1; then echo $1; else echo $2; fi判断用户是否设置了第二个参数,如果没有参数二,使用用户名作为密码,最终终止脚本,返回成功代码0
能够执行到最后一行表示在useradd 或者 passwd时出现了异常,很有可能是权限不足所导致!
#!/bin/bash
# 查找用户帐户信息
cat /etc/passwd
# 查找登录详细信息
lastlog
# 记录结果到日志文件
LOG_FILE="/var/log/user_info.log"
{
echo "User Account Information:"
cat /etc/passwd
echo
echo "Login Details:"
lastlog
} >> "$LOG_FILE"
http://www.heminjie.com/system/linux/412.html
https://www.cnblogs.com/augusite/p/10001446.html
https://codeleading.com/article/76724854628/
https://blog.csdn.net/noflag/article/details/91885113
https://www.dbs724.com/146667.html
https://www.cnblogs.com/chentiao/p/17197828.html
https://www.cnblogs.com/shengulong/p/9034821.html
https://blog.csdn.net/weixin_37909391/article/details/129827445
https://www.cnblogs.com/Baronboy/p/6728564.html
https://www.cnblogs.com/augusite/p/15581211.html
https://www.cnblogs.com/augusite/p/15568220.html
https://www.cnblogs.com/augusite/p/14958364.html
https://www.cnblogs.com/augusite/p/14948308.html

开机执行脚本的两种方法:
在/etc/rc.local的exit 0语句之间添加启动脚本。脚本必须具有可执行权限
用update-rc.d命令添加开机执行脚本



Linux下通过shell脚本创建账户
https://www.cnblogs.com/stackflow/p/linux_shell_account.html
https://www.bunian.cn/11661.html
#!/bin/bash
# 定义一个用户列表,每行一个用户名和密码,用户名和密码之间用空格隔开
user_list="user1 password1
user2 password2
user3 password3"
# 读取用户列表
echo "$user_list" | while read user pass; do
# 创建用户,并设置密码
useradd $user
echo $pass | passwd --stdin $user
echo "User $user has been created and the password was set."
done
将上述脚本保存为create_users.sh,并赋予其执行权限chmod +x create_users.sh。
Linux创建登录用户
#/bin/bash
SSHDFILE="/etc/ssh/sshd_config"
NPFILE="/etc/sudoers"
KEY=`cat /tmp/private`
PUB=`cat /tmp/private.pub`
EUSER=`ls /home/`
ENPUSER=`grep "ALL=(ALL)NOPASSWD:ALL" $NPFILE |awk '{print $1}'`
echo "首次使用会下载expect,会比较慢,请耐心等待"
echo -e "当前自建用户有\n$EUSER\n具有免密执行sudo的用户有\n$ENPUSER"
read -p $'若要执行删除任务,键入【yes】进入删除界面,不做任何事无需任何键入\n' DEL
while [ "$DEL" == "yes" ]
do
read -p $'键入【usyes】进入删除用户选项,键入【npyes】进入删除sudo权限选项,不做任何事无需任何键入\n' DELCHOO
while [ "$DELCHOO" == "usyes" ]
do
read -p $'请输入需要删除的账户:\n' DELUS
if [ "$DELUS" == "root" ];then
echo "你吃多了?"
elif [ -z $DELUS ];then
echo "输入了一个空账户"
else
userdel -r $DELUS >/dev/null
if [ $? -eq 0 ];then
echo "自建用户$DELUS已删除"
else
echo "错误的账户输入"
fi
fi
NOWEUSER=`ls /home/`
echo -e "当前自建用户有:\n$NOWEUSER"
read -p $'若要继续执行删除用户任务,键入【usyes】,否则无需任何键入\n' DELCHOO
done
while [ "$DELCHOO" == "npyes" ]
do
read -p $'请输入需要解除权限的sudoler:\n' DELNP
if [ "$DELNP" == "root" ];then
echo "你吃多了?"
elif [ -z $DELNP ];then
echo "输入了一个空账号"
else
chmod +w $NPFILE
sed -i "/$DELNP.*ALL/d" $NPFILE
chmod -w $NPFILE
echo "此处不做判断,建议复制粘贴,若是不存在的账户也不返回报错!!!"
fi
NOWENPUSER=`grep "ALL=(ALL)NOPASSWD:ALL" $NPFILE |awk '{print $1}'`
echo -e "当前有免密执行sudo的用户有:\n$NOWENPUSER"
read -p $'若要继续执行解除sudoler任务,键入【npyes】否则无需任何键入\n' DELCHOO
done
read -p $'若要继续执行删除任务,键入【yes】进入删除界面,否则无需任何键入\n' DEL
done
read -p $'是否需要为用户开启免密sudo权限,键入【yes】进入ADD选项,否则无需任何键入\n' ADDNP
while [ "$ADDNP" == "yes" ]
do
NOWEUSER=`ls /home/`
echo -e "当前自建用户有:\n$NOWEUSER"
NOWENPUSER=`grep "ALL=(ALL)NOPASSWD:ALL" $NPFILE |awk '{print $1}'`
echo -e "当前有免密执行sudo的用户有:\n$NOWENPUSER"
read -p $'键入需要开启免密的用户:\n' ADDUS
TIME=`date +%Y%m%d%H%M`
cp $NPFILE /tmp/sudoers-$TIME
chmod +w $NPFILE
NOPASS="$ADDUS ALL=(ALL)NOPASSWD:ALL"
echo -e "$NOPASS" >> $NPFILE
grep $NOPASS $NPFILE >/dev/null
if [ $? -eq 0 ];then
echo "$USER免密执行sudo已完成。。。$NOPASS"
chmod -w $NPFILE
else
echo "执行异常,请手动检测。。。备份文件/tmp/sudoers-$TIME"
chmod -w $NPFILE
fi
NOWEUSER=`ls /home/`
echo -e "当前自建用户有:\n$NOWEUSER"
NOWENPUSER=`grep "ALL=(ALL)NOPASSWD:ALL" $NPFILE |awk '{print $1}'`
echo -e "当前有免密执行sudo的用户有:\n$NOWENPUSER"
read -p $'是否需要为用户开启免密sudo权限,键入【yes】进入删除界面,否则无需任何键入\n' ADDNP
done
read -p $'是否需要更改ssh_port,键入【yes】进入更改界面,否则无需任何键入\n' SSHPORT
while [ "$SSHPORT" == "yes" ]
do
read -p $'键入需要的端口号:\n' port
if [[ $port =~ ^[0-9]+$ ]];then
if [[ $port > 65535 ]] || [[ $port < 1 ]];then
echo "无效的端口,建议>1000,<65535,且未占用的端口"
else
PORT="Port $port"
TIME=`date +%Y%m%d%H%M`
cp $SSHDFILE /tmp/ssh_config-$TIME
sed -i "/^Port.*/d" $SSHDFILE
echo -e "\n$PORT" >>$SSHDFILE
systemctl restart sshd
if [ $? -eq 0 ];then
echo "重启sshd成功,可验证是否已更改sshd端口号为$port"
else
echo "sshd服务重启失败,请查看是否/etc/ssh/sshd_config文件中有配置多个Port xx"
fi
fi
else
echo "输入的端口非整数"
fi
read -p $'是否需要更改ssh_port,键入【yes】进入更改界面,否则无需任何键入\n' SSHPORT
done
read -p $'请将私钥内容粘贴在\n/tmp/private\n请将公钥内容粘贴在\n/tmp/private.pub中\n准备工作完成后输入【yes/no】以开始结束!!\n' READMAIN
if [ "$READMAIN" == "no" ];then
exit 1
elif [ "$READMAIN" == "yes" ];then
read -p $'创建用户:\n' USER
if [ -z $USER ];then
echo "你输入了一个空账户"
else
USSHDIR="/home/$USER/.ssh/"
yum -y install expect >/dev/null
if id -u $USER >/dev/null >&2;then
echo "$USER exists"
else
useradd $USER
expect <<EOF
set timeout 10
spawn -noecho su - $USER -c ssh-keygen
expect {
"id_rsa):" {send "\n";exp_continue}
"passphrase):" {send "\n";exp_continue}
"again:" {send "\n"}
}
send_user "\n\n$USER创建成功\n"
EOF
echo -e "$KEY" >$USSHDIR/id_rsa
echo -e "$PUB" >$USSHDIR/id_rsa.pub
echo -e "$PUB" >>$USSHDIR/authorized_keys
chmod 600 $USSHDIR/authorized_keys
chown -R $USER:$USER $USSHDIR
echo "$USER密钥对更新完成。。。"
TIME=`date +%Y%m%d%H%M`
cp $SSHDFILE /tmp/ssh_config-$TIME
sed -i '/^#.*PubkeyAuth/s/^#//g' $SSHDFILE
KEYSH=`grep PubkeyAuth $SSHDFILE`
SWITCH=`grep PasswordAuthentication $SSHDFILE |awk '{print $2}'`
if [ "$SWITCH" == "yes" ];then
sed -i "s/PasswordAuthentication yes/PasswordAuthentication no/g" $SSHDFILE
else
:
fi
systemctl restart sshd
if [ $? -eq 0 ];then
SWITCHQ=`grep PasswordAuthentication $SSHDFILE`
echo -e "禁止用户密码登录完成。。。$SWITCHQ\n允许用户使用秘钥登录。。。$KEYSH"
else
echo "sshd服务异常,请检测。。。备份文件/tmp/ssh_config-$TIME"
exit 1
fi
read -p $'允许免密执行sudo命令[yes],不添加直接enter/键入非[yes]\n' CHOONP
if [ "$CHOONP" == "yes" ];then
chmod +w $NPFILE
TIME=`date +%Y%m%d%H%M`
cp $NPFILE /tmp/sudoers-$TIME
NOPASS="$USER ALL=(ALL)NOPASSWD:ALL"
echo -e "$NOPASS" >> $NPFILE
grep $USER $NPFILE >/dev/null
if [ $? -eq 0 ];then
echo "$USER免密执行sudo已完成。。。$NOPASS"
chmod -w $NPFILE
else
echo "执行异常,请手动检测。。。备份文件/tmp/sudoers-$TIME"
chmod -w $NPFILE
fi
else
:
fi
fi
fi
else
echo "请输入yes/no"
fi
xx
参考
https://blog.csdn.net/2004v2004/article/details/131169292
https://blog.csdn.net/haodayizhizhuzhu/article/details/129087125
https://www.cnblogs.com/augusite/p/17127805.html
https://www.cnblogs.com/augusite/p/17127075.html
https://www.cnblogs.com/augusite/p/15581187.html
https://www.cnblogs.com/augusite/p/10955599.html

浙公网安备 33010602011771号