拿来就用的Shell脚本实现
前言
日常运维中经常出现一些关于系统功能维护,例如获得Linux系统用户列表,文本内容行diff,检查IP是否能ping通,在系统中创建新用户等。如下的几个常见脚本能帮助大家快速实现类似功能。
1. 获得Linux系统用户列表
该脚本用于读取Linux系统/etc/passwd
文件中的所有/bin/bash
作为登录默认Shell
的用户列表,并提取每个用户的用户名。
对于这些用户名进行检查,是否不等于root
和tidb
。如果用户名不等于root
和tidb
,则使用usermod
命令对该用户的默认Shell
修改为:/sbin/nologin
,它通常用于禁止用户远程登录系统。
#!/bin/bash
for user in $(cat /etc/passwd | grep /bin/bash | cut -d ":" -f 1)
do
if [ $user != "root" ] && [ $user != "tidb" ]; then
usermod -s /sbin/nologin $user
fi
done
2. 文本内容行diff
该脚本首先自定义了md5_list
和md5_no_hash.txt
两个文件,然后循环读取md5_list
文件中每一行的哈希值,判断是否在md5_no_hash.txt
文件中存在。
如果检查出哈希值在md5_no_hash.txt
中存在,则打印信息:MD5值 xxx 在 md5_no_hash.txt
中存在。
#!/bin/bash
# 指定md5_list文件和md5_no_hash.txt文件的路径
md5_list_file="md5_list"
md5_no_hash_file="md5_no_hash.txt"
# 循环读取md5_list文件中的每一行
while IFS= read -r md5; do
# 检查md5是否在md5_no_hash.txt中
if grep -q "$md5" "$md5_no_hash_file"; then
echo "MD5值 $md5 在 $md5_no_hash_file 中存在"
else
echo "MD5值 $md5 在 $md5_no_hash_file 中不存在"
fi
done < "$md5_list_file"
3. 检查IP是否能ping通
该脚本的主要功能是:遍历读取一个包含IP
地址的文件,如该文件名为:mmyd
,然后对该文件里的每行IP
地址执行ping
操作,并检查丢包率。如果ping
的丢包率为:100%
,则输出该IP
不可达的日志;如果ping
不存在丢包率,则输出该IP
可达的日志。
#!/bin/bash
# author:JackTian
# 获取当前系统时间
current_time=$(date +"%Y-%m-%d-%H:%M:%S")
# 获取开始时间戳
start_time=$(date +%s)
for i in `cat mmyd` # 这个是逐个读取该文件里的全部所列出的 IP 地址
do
ping=`ping -c 10 $i | grep loss | awk '{print $6}' | awk -F "%" '{print $1}'`
# 上面一行是对读出来的ip ping一次,看是否ping通。并取出loss的百分比的值 也就是丢包的值,看是否丢包
Packet_Loss_Rate=`ping -c 10 $i | grep loss | awk '{print $6}'`
if [ $ping -eq 100 ];then
# 比较一下,看丢包的值是不是100,如果是100就是全部丢包,那就是没ping通,那就显示 IP ping 失败了,如果不等于100的话,就ping通了,就显示 IP ping 成功了。
echo "$current_time 某某移动-活跃 IP 地址:$i ping 失败了,丢包率为:$Packet_Loss_Rate" >>/opt/jacktian/mmyd_ping.log
else
echo "$current_time 某某移动-活跃 IP 地址:$i ping 成功了!" >>/opt/jacktian/mmyd_ping.log
fi
done
# 获取结束时间戳
end_time=$(date +%s)
# 计算执行时间(秒)
execution_time_seconds=$((end_time - start_time))
# 将执行时间转换为分钟和秒
minutes=$((execution_time_seconds / 60))
seconds=$((execution_time_seconds % 60))
echo "执行完毕!该脚本执行时间共: $minutes 分钟 $seconds 秒"
4. 系统中创建新用户
该脚本用于在Linux系统中创建新用户,并为该用户设置密码、省份代码、目录权限以及vsftpd
服务的配置。
#!/bin/sh
read -p "user:" user
read -p "passd:" pass
read -p "province:" province
useradd $user -d /bigdata/sftp/province/$province/
#passwd $user
echo $pass | passwd --stdin $user
chown $user /bigdata/sftp/province/$province/ -R
chmod 750 /bigdata/sftp/province/$province/ -R
echo $user>>/etc/vsftpd/chroot_list
echo $user>>/etc/vsftpd/user_list
systemctl restart vsftpd.service
-
read -p "user:" user
:提示用户输入一个用户名,并将输入的值存储在变量user
中 -
read -p "passd:" pass
:提示用户输入一个密码,并将输入的值存储在变量pass
中。注意:在输入密码时,不会显示任何字符。 -
read -p "province:" province
:提示用户输入一个省份代码,并将输入的值存储在变量province
中 -
useradd $user -d /bigdata/sftp/province/$province/
:该命令将创建一个新用户,其用户名为之前输入的user
,其家目录为:/bigdata/sftp/province/$province/
-
echo $pass | passwd --stdin $user
:该命令会将之前输入的密码通过标准输入传给passwd
命令,为新创建的用户设置密码 -
chown $user /bigdata/sftp/province/$province/ -R
:该命令将更改新创建用户成为/bigdata/sftp/province/$province/目录及其子目录的所有者 -
chmod 750 /bigdata/sftp/province/$province/ -R
:该命令会设置/bigdata/sftp/province/$province/
目录及其子目录的权限为:750
,也就是指:用户有读、写、执行的权限,而用户组只有读和执行的权限 -
echo $user>>/etc/vsftpd/chroot_list
:该命令会将新创建的用户添加到vsftpd
服务的chroot
列表中。这表示当vsftpd
服务在运行时,该用户会被限制在其自己的目录中,不能访问系统的其他目录 -
echo $user>>/etc/vsftpd/user_list
:该命令会将新创建的用户添加到vsftpd
服务的用户列表中。这表示当vsftpd服务在运行时,这个用户可以登录并访问系统。 -
systemctl restart vsftpd.service
:重启vsftpd服务,使之前的所有配置生效