bash 功能脚本

发布时间:2024年01月22日

更新时间 2023.07.06-1822 版本0.1 脚本类型 SHELL BASH 实际有效脚本7个

上次更新 : 2023.06.28-1348 版本0.1 实际有效脚本6个

附件下载??有道云笔记

依赖上面包,打包的工具 天翼云盘 珍藏美好生活 家庭云|网盘|文件备份|资源分享 (访问码:kfr2)

# 安装依赖
sudo apt install -y iproute2 net-tools iputils-ping curl wget lsof coreutils zenity wine
#----
DEB安装包使用: 包名称 cn.i8520.toolbox  安装路径  /opt/i8520
sudo dpkg -i cn.i8520.toolbox.deb 或者 sudo apt install ./cn.i8520.toolbox.deb
卸载 sudo apt-get autoremove --purge cn.i8520.toolbox -y
sudo apt install shc 可以使用 shc 制作成加密【二进制文件】shc -r -v -f 脚本路径

添加了/opt/i8520 的环境变量。安装好重启系统就可以执行使用/opt/i8520下的脚本名字

安装包自动配置的系统环境变量 /etc/profile
export ibwel=/opt/i8520
export PATH=$ibwel:$PATH

功能脚本会互相引用

MY-USER-PWD 用户路径

#!/bin/bash
A="$1"
NAME_ID=`getent passwd ${SUDO_UID:-$(id -u)} | cut -d: -f 6`
MY_USER_DIR="${NAME_ID}"
MY_USER_NAME="${MY_USER_DIR##*/}"

MY_USER_DIR_X="1"
if [[ ! X${A} = X${MY_USER_DIR_X} ]];then
   # 输出用户名
   echo "${MY_USER_NAME}"
else
   # 输出用户路径
   echo "${MY_USER_DIR}"  
fi

exit 0

使用方法 2种

MY_USER_DIR=`/opt/i8520/MY-USER-PWD 1`
MY_USER_NAME=`/opt/i8520/MY-USER-PWD`
#显示当前登入用户路径
echo ${MY_USER_DIR}
#显示当前登入用户名
echo ${MY_USER_NAME}

推荐使用

# 如果是把文件复制到用户目录
MY_USER_DIR=`/opt/i8520/MY-USER-PWD 1`
# 普通用户 ${MY_USER_DIR} 实际等于 /home/用户名/.config/autostart
# ROOT ${MY_USER_DIR} 实际等于 /root/.config/autostart
cp -r /opt/data/xxx.desktop ${MY_USER_DIR}/.config/autostart

CCCX 权限

#!/bin/bash
INPUT="$1"
DIR_END_FILE="$2"
NAME_ID=`getent passwd ${SUDO_UID:-$(id -u)} | cut -d: -f 6`
MY_USER_DIR="${NAME_ID}"
MY_USER_NAME="${MY_USER_DIR##*/}"

# 如果输入的第一个参数是数字,就执行 chmod ${INPUT} ${DIR_END_FILE}
# 如果输入的第一个参数不是数字,就进行判断,如果是root就执行 echo "归属 群组 设成 root"
# 如果输入的第一个参数不是数字,也不是果是root就执行 echo "归属 群组 设成 ${MY_USER_NAME}"

if [ "${INPUT}" -gt 0 ] 2>/dev/null ;then 

      echo "附加权限${INPUT}"
      # chmod -R 哪个-R加不加都可
      # 加了-R单独拿来用三种状态都需要加sudo 
      # 还有就是更改root用户和群组需要 sudo
      chmod ${INPUT} ${DIR_END_FILE}

else

     MY_ROOT='root'
     if [[ ! X${INPUT} = X${MY_ROOT} ]];then
       echo "归属 群组 设成 ${MY_USER_NAME}"
       chown ${MY_USER_NAME} ${INPUT}
       chgrp ${MY_USER_NAME} ${INPUT}
     else
       echo "归属 群组 设成 root"
       chown ${MY_ROOT} ${DIR_END_FILE}
       chgrp ${MY_ROOT} ${DIR_END_FILE}
     fi
   
fi

exit 0

使用方法 有3种

# /home/i8520/桌面/MHZXx 可以是文件路径或文件夹路径
# /home/i8520/桌面/MHZXx 必须是绝对路径
#-------------------------------------------------------
# 第一种
#把权限设置成 755 这个可以随意设置
/opt/i8520/CCCX 755 /home/i8520/桌面/MHZXx


#-------------------------------------------------------
# 第二种
#把归属群组设置成 当前用户
/opt/i8520/CCCX /home/i8520/桌面/MHZXx
#-------------------------------------------------------
# 第三种
#把归属群组设置成 root,
/opt/i8520/CCCX root /home/i8520/桌面/MHZXx
#-------------------------------------------------------
配合使用
MY_USER_NAME=`/opt/i8520/MY-USER-PWD`
MY_USER_DIR=`/opt/i8520/MY-USER-PWD 1`
# 不推荐使用这种 /home/${MY_USER_NAME}/桌面/MHZXx
/opt/i8520/CCCX 666 ${MY_USER_DI}/桌面/MHZXx
/opt/i8520/CCCX ${MY_USER_DI}/桌面/MHZXx
/opt/i8520/CCCX root ${MY_USER_DI}/桌面/MHZXx

注意事项

提示不允许操作,在命令前面加 sudo
sudo /opt/i8520/CCCX root /home/i8520/桌面/MHZXx

MY-Desktop 桌面路径

#!/bin/bash
#---------------------------------
# 判断桌面文件夹名称是中文还是英文
# 用于复制文件到桌面
#---------------------------------
NAME_ID=`getent passwd ${SUDO_UID:-$(id -u)} | cut -d: -f 6`
MY_USER_DIR="${NAME_ID}"
MY_USER_U_NED_R(){
A="${MY_USER_DIR}/桌面"
B="${MY_USER_DIR}/Desktop"
cd ${A} 2>/dev/null
if [ $? -ne 0 ]; then
   cd ${B} 2>/dev/null
     if [ $? -ne 0 ]; then
       echo "/root/Desktop"
       #echo "ERR"
     else
       MY_USER=$(echo `pwd`)
       echo ${MY_USER}
     fi
else
   MY_USER=$(echo `pwd`)
   echo ${MY_USER}
fi
}
MY_USER_U_NED_R 

使用方法

#/opt/data/xxx.deskto 复制到桌面
MY_Desktop=`/opt/i8520/MY-Desktop`
cp -r /opt/data/xxx.desktop ${MY_Desktop}

Replacement 查替字符

使用时候需要注意不是什么字符都可以替换

权限对照表?有道云笔记

#!/bin/bash
#-----------------------
# 修改时间 2023.01.30-1230
# 优化脚本执行 更快 更准确
# 添加手动可能需要修改的文件,因为某些文本文件在字符编码上的问题在查找时会显示二进制文件
#-----------------------
#替换的文件夹目录 会自动查询子目录
MY_Desktop=`/opt/i8520/MY-Desktop`
name_dir="$1"
#替换前
B="$2"
#替换后
A="$3"
abcdfe="========================================="
finddir="/tmp/i8520-98w7e9wqe_find-0806"
rm -rf $finddir
mkdir -p $finddir
/opt/i8520/CCCX $finddir
/opt/i8520/CCCX 777 $finddir
#-----------------------
# 获得需要替换的列表文件
#-----------------------
#获得当前目录以及子目录的文件数量
find_p=`find $name_dir -type f -name "*" | awk '{print "\""$0}' | awk '{print $0"\""}' | wc -l`
#查找到要替换的文件,如果有就输出带路径在哪一行并且保存到$finddir/1.txt,所以可能会出现多行一样的情.
grep -rEn "${B}" "${name_dir}" | grep -v "Binary file" > $finddir/1.txt
#去除 :以及相邻空格后的字符以及再次过滤掉空格后面的字符 
cat $finddir/1.txt | sed 's@:[^ ]*@@g' | sed "s/ .*$//" > $finddir/2.txt
#去除重复的行
sort -k2n $finddir/2.txt | awk '{if ($0!=line) print;line=$0}' > $finddir/finddirA.txt
#把预设转换代码加到 文件路径前面 并保存 到 finddirA.sh 脚本 。简单说finddirA.txt转换成具体功能脚本finddirA.sh
awk '{print "sed -i -r \"s|$A|$B|g\" "$0}'  $finddir/finddirA.txt >$finddir/finddirA.sh
chmod -R 750 $finddir/finddirA.sh
#替换字符得到完美的执行脚本 这里不要改
sed -i "s|\$A|$B|g" $finddir/finddirA.sh
sleep 0.5
sed -i "s|\$B|$A|g" $finddir/finddirA.sh
sleep 0.5
#-----------------------
# 是否执行替换脚本
#-----------------------
BUG_ABC_1="0"
# $BUG_ABC_2 等于0 不执行 finddirA.sh 应为是空文件
BUG_ABC_2=$(cat $finddir/finddirA.txt | wc -l)
if [[ ! x${BUG_ABC_1} = x${BUG_ABC_2} ]];then
   echo -e "${abcdfe}\n执行脚本已创建......"
   rm -rf ${MY_Desktop}/finddirA.sh

   bash $finddir/finddirA.sh
   #mv $finddir/finddirA.sh ${MY_Desktop}/finddirA.sh
   #/opt/i8520/CCCX ${MY_Desktop}/finddirA.sh
   echo -e "一共查询 ${find_p} 个文件。匹配到 ${BUG_ABC_2} 个文件\n${abcdfe}" 
   echo "修改文件的脚本保存在桌面 finddirA.sh"
else
   echo -e "${abcdfe}\n替换失败!一共查询 ${find_p} 个文件 替换前${B}不存在\n${abcdfe}"
   #echo "ERR"
fi
#-----------------------
# 需要手工检查的文件
#-----------------------
Journal=`sed -n '/匹配到二进制文件/p' $finddir/1.txt|wc -l`
MY_DB_NAME="0"
if [ ! x${MY_DB_NAME} = x${Journal} ];then
   echo "需要手工检查的文件,请在桌面查看,检测到二进制文件.txt"
   sed -n '/匹配到二进制文件/p' $finddir/1.txt > ${MY_Desktop}/检测到二进制文件.txt    
else
  #echo "ERR"
   echo ""
fi

使用方法

#/opt/i8520/Replacement 文件夹路径 替换前 替换后
/opt/i8520/Replacement /www/xxx 192.168.5.1 192.168.5.22

使用技巧

#bash $finddir/finddirA.sh                        48行
mv $finddir/finddirA.sh ${MY_Desktop}/finddirA.sh 49行
/opt/i8520/CCCX ${MY_Desktop}/finddirA.sh         50行
#--------------------------------------------------
上面第1行可以注释掉,第2-3行把注释去掉这样就不会执行替换脚本可以起到查找的作用
直接看桌面上的脚本 finddirA.sh

MY_TERMINAL 终端与网络

核心命令 ls /bin | grep 'terminal' | sed -n 1p

#!/bin/bash
#---------------------------------
# ./MY_TERMINAL TERMINAL 输出终端程序名称
# ./MY_TERMINAL 1 输出外网IP
# ./MY_TERMINAL 输出内网IP
#---------------------------------
A="$1"
MY_IP_A=$(curl -s http://www.net.cn/static/customercare/yourip.asp | grep -P -o "[0-9.]+(?=</h2>)")
MY_IP_B=`ip addr|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|sed -n 1p`
# 下面命令 在 deepin mint 优麒麟 下有效 其他自行测试
MY_TERMINAL=`ls /bin | grep 'terminal' | sed -n 1p`

INPUT='TERMINAL'
if [[ ! X${INPUT} = X${A} ]];then
   INPUT_A='1'
   if [[ ! X${INPUT_A} = X${A} ]];then
     echo "${MY_IP_B%%/*}"
   else
     echo "$MY_IP_A"
   fi
else
   echo "$MY_TERMINAL"
fi
exit 0

使用方法 3种

#!/bin/bash
CMD_MY_TERMINAL=`/opt/i8520/MY_TERMINAL TERMINAL`
CMD_MY_INTERNET_W=`/opt/i8520/MY_TERMINAL 1`
CMD_MY_INTERNET_N=`/opt/i8520/MY_TERMINAL`
# 第一种---------------------------------------------------
# 使用终端打开脚本并执行 显示一个命令行窗口
# /opt/i8520/Replacement-1/bin/cz.sh 需要展示执行过程的脚本
${CMD_MY_TERMINAL} --geometry 122x29 \
--title "查找替换字符"  -e "bash -c /opt/i8520/Replacement-1/bin/cz.sh;bash"
# 第二种---------------------------------------------------
# 输出外网IP
echo "${CMD_MY_INTERNET_W}"
# 第三种---------------------------------------------------
# 输出内网IP
echo "${CMD_MY_INTERNET_N}"

MY_NETWORK_CARD 查看网卡

#!/bin/bash
# 这个脚本可能不是很管用
# ./MY_NETWORK_CARD|sed -n 9p
# 或者 ./MY_NETWORK_CARD > /opt/i8520/lock/wk.txt
# cat /opt/i8520/lock/wk.txt|sed -n 9p
#----------------------------
# 引入功能脚本
#----------------------------
MY_USER_DIR=`/opt/i8520/MY-USER-PWD 1`
MY_USER_NAME=`/opt/i8520/MY-USER-PWD`
MY_Desktop=`/opt/i8520/MY-Desktop`
CMD_MY_TERMINAL=`/opt/i8520/MY_TERMINAL TERMINAL`
CMD_MY_INTERNET_W=`/opt/i8520/MY_TERMINAL 1`
CMD_MY_INTERNET_N=`/opt/i8520/MY_TERMINAL`
#/opt/i8520/CCCX
MY_TMP='/opt/i8520/lock'
Network_card_device_name(){
#-----------------------------
# 获取网卡设备名称 cat /proc/net/dev
# ens 一般是在虚拟机中
# enp 一般是在物理机中
# wl  一般是无线网卡
#-----------------------------

A=`cat /proc/net/dev | grep 'enp'    | sed 's/^[ ]*//g' | sed 's@:[^ ]*@@g' | sed "s/ .*$//"`
B=`cat /proc/net/dev | grep 'ens'    | sed 's/^[ ]*//g' | sed 's@:[^ ]*@@g' | sed "s/ .*$//"`
C=`cat /proc/net/dev | grep 'wl'     | sed 's/^[ ]*//g' | sed 's@:[^ ]*@@g' | sed "s/ .*$//"`
E=`cat /proc/net/dev | grep 'docker' | sed 's/^[ ]*//g' | sed 's@:[^ ]*@@g' | sed "s/ .*$//"`
echo "当前网卡设备名称"
echo "处于虚拟机-->有线网卡:${B}"
echo "处于物理机-->无线网卡:${C}"
echo "处于物理机-->有线网卡:${A}"
echo "docker容器虚拟网卡:${E}"
echo "========================================"
echo "当前IP-->${CMD_MY_INTERNET_N}"
echo "正在读取已联网,网卡设备名称..."

#-----------------------------
# 判断无线网卡部分 
#-----------------------------
Network_WL(){
         Network_NAME_B=`cat /proc/net/dev | grep 'wl' | sed 's/^[ ]*//g' | sed 's@:[^ ]*@@g' | sed "s/ .*$//"`
         Network_I_A_WL=`cat /proc/net/dev | grep 'wl' | awk '{print $2}'`
         sleep 3
         Network_I_B_WL=`cat /proc/net/dev | grep 'wl'|awk '{print $2}'`
         if [[ ! X${Network_I_A_WL} = X${Network_I_B_WL} ]];then
             #echo -e "无线-->网卡设备名称${Network_NAME_B}\n正在验证数据流..."
             #echo ${Network_I_A_WL}
             #echo ${Network_I_B_WL}
             echo ${Network_NAME_B}
         else
             echo "ERR-请检查是否已联网"
         fi
}
#-----------------------------
# 通过获取 /proc/net/dev 
# 读取数据流的变化 来判断这个网卡是否在使用
#-----------------------------
Network_F="0"
Network_A=`cat /proc/net/dev | grep 'ens' | wc -l`
if [[ ! X${Network_F} = X${Network_A} ]];then
     Network_NAME_A=`cat /proc/net/dev | grep 'ens' | sed 's/^[ ]*//g' | sed 's@:[^ ]*@@g' | sed "s/ .*$//"`
     Network_I_A_A=`cat /proc/net/dev | grep 'ens'|awk '{print $2}'`
     #下面不要动 sleep 3 用来判断 两次数据流是否一样
     sleep 3
     Network_I_A_B=`cat /proc/net/dev | grep 'ens'|awk '{print $2}'`
     if [[ ! X${Network_I_A_A} = X${Network_I_A_B} ]];then
         #echo -e "有线-->网卡设备名称${Network_NAME_A}\n正在验证数据流..."
         #echo ${Network_I_A_A}
         #echo ${Network_I_A_B}
         echo ${Network_NAME_A}
     else
         #判断是否使用无线网卡
         #有线或无线都没有网络,默认输出有线晚卡名字
         ERR_AA=`Network_WL`
         ERR_BB="ERR-请检查是否已联网"
           if [[ ! X${ERR_BB} = X${ERR_AA} ]];then
              Network_WL
           else
              echo "${Network_NAME_A}"
           fi
     fi
else
    Network_NAME_C=`cat /proc/net/dev | grep 'enp' | sed 's/^[ ]*//g' | sed 's@:[^ ]*@@g' | sed "s/ .*$//"`
    Network_I_B_A=`cat /proc/net/dev | grep 'enp'|awk '{print $2}'`
    #下面不要动 sleep 3 用来判断 两次数据流是否一样
    sleep 3
    Network_I_B_B=`cat /proc/net/dev | grep 'enp'|awk '{print $2}'`
      if [[ ! X${Network_I_B_A} = X${Network_I_B_B} ]];then
        #echo -e "有线-->网卡设备名称${Network_NAME_C}\n正在验证数据流..."
        #echo ${Network_I_B_A}
        #echo ${Network_I_B_B}
        echo ${Network_NAME_C}
      else
         #判断是否使用无线网卡
         #有线或无线都没有网络,默认输出有线晚卡名字
         ERR_AA_A=`Network_WL`
         ERR_BB_B="ERR-请检查是否已联网"
           if [[ ! X${ERR_BB_B} = X${ERR_AA_A} ]];then
              Network_WL
           else
              echo "${Network_NAME_C}"
           fi
     fi
fi

}

# Network_card_device_name >${MY_TMP}/wk.txt
Network_card_device_name
exit 0

使用方法

这个脚本可能不是很管用
./MY_NETWORK_CARD|sed -n 9p
 或者 ./MY_NETWORK_CARD > /opt/i8520/lock/wk.txt
cat /opt/i8520/lock/wk.txt
cat /opt/i8520/lock/wk.txt|sed -n 9p

lsofPORT 杀死占用端口的程序

#!/bin/bash
PORT="$1"
MYqassword="$2"
#---------------------------
#./lsofPORT 端口 密码
#普通用户下   ./lsofPORT 12345 abc123
#ROOT用户下  ./lsofPORT 12345
#---------------------------

NAME_ID=`getent passwd ${SUDO_UID:-$(id -u)} | cut -d: -f 6`
MY_USER_DIR="${NAME_ID}"
NAME='root'
if [[ ! X${NAME} = X${MY_USER_DIR} ]];then
   # 普通用户
   mkdir -p /tmp/lsofPORT
   shijian=`date +%Y年%m月%d日%H:%M:%S`
   echo "${MYqassword}" | sudo -S $shijian > /dev/null 2>&1
   sudo lsof -i :${PORT}|grep "${PORT}"|awk '{print $1}' > ${MY_USER_DIR}/占用端口的程序.txt
   sudo lsof -i :${PORT}|grep "${PORT}"|awk '{print $2}' > /tmp/lsofPORT/lsofPORT.log
   kill_X=`cat /tmp/lsofPORT/lsofPORT.log`
   sudo kill -9 ${kill_X}
   sudo rm -rf /tmp/lsofPORT
else
   # root
   lsof -i :${PORT}|grep "${PORT}"|awk '{print $1}' > ${MY_USER_DIR}/占用端口的程序.txt
   kill_X=`lsof -i :${PORT}|grep "${PORT}"|awk '{print $2}'`
   kill -9 ${kill_X}
fi


exit 0

使用方法

./lsofPORT 端口 密码
普通用户下   ./lsofPORT 12345 abc123
ROOT用户下  ./lsofPORT 12345

注意事项

注意事项:请勿使用 sudo ./lsofPORT 
应为在普通用户下密码已经作为第二个参数传递到了脚本内部

文章来源:https://blog.csdn.net/lcs910102814/article/details/135752865
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。