shell汇总(自用、持续更新...)

  • 常用shell
    • 判断当前是什么操作系统
  • shell学习
    • printf的使用
  • 实用程序
    • 备份crontab中的.sh文件

常用shell

简短高频

# curl上传文件到ftp服务器
curl -u user:'password' -T xxx.tar.gz ftp://192.168.1.10/itwild/

# 查看进程user、pid、cpu、mem占用、启动时间、启动命令
ps -ewwo user,pid,ppid,%cpu,%mem,lstart,cmd

# scp命令指定端口(注意是大写的P)
scp -P 12345 filename [email protected]:/tmp

查看不同系统的路由表

#!/bin/sh
os=$(uname -s)
if [ "Linux" == "${os}" ];then
  route | grep -Ev '^$' | sed '1,2d'
elif [ "AIX" == "${os}" ] || [ "Darwin" == "${os}" ];then
  netstat -nr -f inet | grep -Ev '^$' | sed '1,3d' | awk '{print $1" "$2" - "$3" - "$4" "$5" "$6}'
fi

shell学习

printf的使用

#!/bin/sh
println() {
    param_count=$#
    if [ $param_count -lt 2 ] ; then
        return
    fi

    key=$1
    value=$2
    tag="" # $3
    desc="" # $4
    extend="" # $5

    if [ $param_count -ge 3 ]; then
        tag=$3
    fi
    if [ $param_count -ge 4 ]; then
        desc=$4
    fi
    if [ $param_count -ge 5 ]; then
        extend=$5
    fi

    printf '{"key":"%s","value":"%s","tag":"%s","desc":"%s","extend":"%s"}\n' "$key" "$value" "$tag" "$desc" "$extend"
}

tag=tcp_timeout
k1=net.netfilter.nf_conntrack_tcp_timeout_close_wait
v1=$(sysctl -a | grep $k1 | awk -F " = " '{print $NF}')

println "$k1" "$v1" "$tag"

实用程序

备份crontab中的.sh文件

  • 线上环境有一些定时脚本(用crontab -l可查看当前用户的),有时我们可能会改这些定时任务的脚本内容。为避免改错无后悔药,需用shell实现一个程序,定时备份crontab中的.sh脚本文件。
  • 所有用户的crontab放在/var/spool/cron/目录,各个用户放在各自目录下。只要把这些用户的crontab读取出来,提取出其中的.sh文件,然后按照用户备份到相应目录就行。最后配一个crontab,定时去执行这个备份程序。
  • 此程序需要用root用户去执行,因为程序把不同crontab备份在对应用户不同权限下的目录

代码实现

#!/bin/sh
# this shell script from  https://www.cnblogs.com/itwild/

# backup dir
# root user will in ${bak_dir}/root, itwild user will in ${bak_dir}/itwild
bak_dir=/var/itwild

# new file will end with 2020-02-24_00:28:56
bak_suffix=$(date '+%Y-%m-%d_%H:%M:%S')

if [[ ! $bak_dir == */ ]]; then
    bak_dir="${bak_dir}/"
fi

create_dir_if_not_exist() {
    u="$1"
    user_bak_dir="${bak_dir}$u"

    if [ ! -d "$user_bak_dir" ]; then
        mkdir -p $user_bak_dir
        chown -R ${u}:${u} $user_bak_dir
    fi
}

backup_files() {
    u="$1"
    files=$2

    for f in ${files[*]}; do
        if [[ $f == *.sh ]]; then
            # only backup file which end with .sh
            copy_file $u $f
        fi
    done
}

copy_file() {
    u="$1"
    filepath=$2

    if [ ! -f "$filepath" ];then
        return
    fi

    user_bak_dir="${bak_dir}$u"
    filename=${filepath##*/}
    cur_ms=$[$(date +%s%N)/1000000]
    # avoid same filename here add cur_ms to distinct
    newfilepath="${user_bak_dir}/${filename}.${bak_suffix}.${cur_ms}"

    # switch to user and then copy file to right position
    su - $u -c "cp $filepath $newfilepath"
}

# start from here
cd /var/spool/cron/

for u in `ls`
do
    create_dir_if_not_exist $u
    files=$(cat $u | grep ".sh" | grep -Ev '^$|#' | awk '{for(i=6;i<=NF;++i) printf $i" "}')
    backup_files $u "${files[*]}"
done

你可能感兴趣的:(shell汇总(自用、持续更新...))