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

image
开机执行脚本的两种方法:

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

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

posted @ 2023-10-22 13:51  三里清风18  阅读(2795)  评论(0)    收藏  举报