Linux运维常用shell脚本实例 (转)

1、用shell脚本批量建立Linux用户

实现要求:创建用户student1到student50,指定组为student组!而且每个用户需要设定一个不同的密码!

  1.  
    #!/bin/bash
  2.  
    for i in `seq 1 50`
  3.  
    do
  4.  
        useradd -G student student$i ; 
  5.  
        echo student$i | passwd student$i --stdin;
  6.  
    done

【脚本实现如下:说明:Linux下 Passwd有参数  --stdin  This option is used to indicate that passwd should read the new password from standard input, which can be a pipe.  所以linux下自动改变用户密码的办法就是:  Echo 密码 |passwd –stdin 用户名】-------------------设置相同的密码------------------------

  1.  
    #!/bin/bash
  2.  
    password="123456"
  3.  
    for USER in user1 user2 user3
  4.  
    do
  5.  
    useradd -m $USER
  6.  
    echo -e "${password}\n${password}" | passwd $USER
  7.  
    done

 【说明:
     echo -n 不换行输出:
$echo -n "123"
$echo "456"
最终输出 123456
而不是
123
456
    echo -e 处理特殊字符:
        \n 换行且光标移至行首 】 
ok,就这么一个简单的脚本,就可以再系统里批量生成账号了。而且密码跟账号的名字一样。
这就是for do done语句用法。

2、批量创建用户

  1.  
    #!/bin/bash
  2.  
    DATE=$(date +%F_%T)
  3.  
    USER_FILE=user.txt
  4.  
    echo_color(){
  5.  
        if [ $1 == "green" ]; then
  6.  
            echo -e "\033[32;40m$2\033[0m"
  7.  
        elif [ $1 == "red" ]; then
  8.  
            echo -e "\033[31;40m$2\033[0m"
  9.  
        fi
  10.  
    }
  11.  
    # 如果用户文件存在并且大小大于0就备份
  12.  
    if [ -s $USER_FILE ]; then
  13.  
        mv $USER_FILE ${USER_FILE}-${DATE}.bak
  14.  
        echo_color green "$USER_FILE exist, rename ${USER_FILE}-${DATE}.bak"
  15.  
    fi
  16.  
    echo -e "User\tPassword" >> $USER_FILE
  17.  
    echo "----------------" >> $USER_FILE
  18.  
    for USER in user{1..10}; do
  19.  
        if ! id $USER &>/dev/null; then
  20.  
            PASS=$(echo $RANDOM |md5sum |cut -c 1-8)
  21.  
            useradd $USER
  22.  
            echo $PASS |passwd --stdin $USER &>/dev/null
  23.  
            echo -e "$USER\t$PASS" >> $USER_FILE
  24.  
            echo "$USER User create successful."
  25.  
        else
  26.  
            echo_color red "$USER User already exists!"
  27.  
        fi
  28.  
    done

3.批量添加组用户

添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30 
参考答案: 

  1.  
    #!/bin/sh
  2.  
    i=1
  3.  
    groupadd class1
  4.  
    while [ $i -le 30 ]
  5.  
    do
  6.  
    if [ $i -le 9 ] ;then
  7.  
    USERNAME=stu0${i}
  8.  
    else
  9.  
    USERNAME=stu${i}
  10.  
    fi
  11.  
    useradd $USERNAME
  12.  
    mkdir /home/$USERNAME
  13.  
    chown -R $USERNAME /home/$USERNAME
  14.  
    chgrp -R class1 /home/$USERNAME
  15.  
    i=$(($i+1))
  16.  
    done

4.批量删除用户

实现自动删除50个账号的功能。账号名为stud1至stud50。 
参考脚本: 

  1.  
    #!/bin/sh
  2.  
    i=1
  3.  
    while [ $i -le 50 ]
  4.  
    do
  5.  
    userdel -r stud${i}
  6.  
    i=$(($i+1 ))
  7.  
    done

5.批量修改用户密码

旧密码SSH主机信息old_info文件:

#     ip     user    passwd    port
192.168.18.217  root    123456     22
192.168.18.218  root    123456     22

修改密码脚本:

  1.  
    #!/bin/bash
  2.  
    OLD_INFO=old_info
  3.  
    NEW_INFO=new_info
  4.  
    for IP in $(awk '/^[^#]/{print $1}' $OLD_INFO); do
  5.  
    USER=$(awk -v I=$IP 'I==$1{print $2}' $OLD_INFO)
  6.  
    PASS=$(awk -v I=$IP 'I==$1{print $3}' $OLD_INFO)
  7.  
    PORT=$(awk -v I=$IP 'I==$1{print $4}' $OLD_INFO)
  8.  
    NEW_PASS=$(mkpasswd -l 8)
  9.  
    echo "$IP $USER $NEW_PASS $PORT" >> $NEW_INFO
  10.  
    expect -c "
  11.  
    spawn ssh -p$PORT $USER@$IP
  12.  
    set timeout 2
  13.  
    expect {
  14.  
    \"(yes/no)\" {send \"yes\r\";exp_continue}
  15.  
    \"password:\" {send \"$PASS\r\";exp_continue}
  16.  
    \"$USER@*\" {send \"echo \'$NEW_PASS\' |passwd --stdin $USER\r exit\r\";exp_continue}
  17.  
    }"
  18.  
    done

生成新密码new_info文件:

192.168.18.217  root    n8wX3mU%        22
192.168.18.218  root    c87;ZnnL        22

6、 将目录下大于k的文件转移出去

编写shell脚本,将/usr/local/test目录下大于100k的文件转移到/tmp目录下:

  1.  
    #!/bin/bash
  2.  
    for FILE in `ls /usr/local/test`
  3.  
    do
  4.  
    if [ -f $FILE ] ; then
  5.  
    if [ `ls -l $FILE | awk `{print $5}` -gt 100000 ] ; then
  6.  
    mv $FILE /tmp/
  7.  
    fi
  8.  
    fi
  9.  
    done

================

  1.  
    #!/bin/bash
  2.  
    for FileName in `ls -l /usr/local/test | awk '$5>102400' {print $9}`
  3.  
    do
  4.  
    mv $FileName /tmp/
  5.  
    done
  6.  
    ls -al /tmp/
  7.  
    echo "done!"

7、批量修改文件名

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

# touch article_{1..3}.html

# ls

article_1.html  article_2.html  article_3.html

现在想把article改为bbs:

方法1:

for file in $(ls *html); do

    mv $file bbs_${file#*_}

    # mv $file $(echo $file |sed -r 's/.*(_.*)/bbs\1/')

    # mv $file $(echo $file |echo bbs_$(cut -d_ -f2) 

done

方法2:

for file in $(find . -maxdepth 1 -name "*html"); do

     mv $file bbs_${file#*_}

done

方法3:

# rename article bbs *.html

8、ftp自动登录批量下载文件

  1.  
    ##### 从ftp服务器上的/home/data 到 本地的/home/databackup####
  2.  
    #!/bin/bash
  3.  
    ftp -n<<!
  4.  
    open 192.168.1.171
  5.  
    user guest 123456
  6.  
    binary
  7.  
    cd /home/data
  8.  
    lcd /home/databackup
  9.  
    prompt
  10.  
    mget *
  11.  
    close
  12.  
    bye
  13.  
    !

9、ftp自动登录上传文件

  1.  
    ####本地的/home/databackup to ftp服务器上的/home/data####
  2.  
    #!/bin/bash
  3.  
    ftp -n<<!
  4.  
    open 192.168.1.171
  5.  
    user guest 123456
  6.  
    binary
  7.  
    hash
  8.  
    cd /home/data
  9.  
    lcd /home/databackup
  10.  
    prompt
  11.  
    mput *
  12.  
    close
  13.  
    bye
  14.  
    !

10、ftp自动登录下载单个文件

  1.  
    ####ftp服务器上下载/home/data/a.sh to local /home/databackup####
  2.  
    #!/bin/bash
  3.  
    ftp -n<<!
  4.  
    open 192.168.1.171
  5.  
    user guest 123456
  6.  
    binary
  7.  
    cd /home/data
  8.  
    lcd /home/databackup
  9.  
    prompt
  10.  
    get a.sh a.sh
  11.  
    close
  12.  
    bye
  13.  
    !

11、ftp自动登录上传单个文件

  1.  
    ####把本地/home/databachup/a.sh up ftp /home/databackup 下####
  2.  
    #!/bin/bash
  3.  
    ftp -n<<!
  4.  
    open 192.168.1.171
  5.  
    user guest 123456
  6.  
    binary
  7.  
    cd /home/data
  8.  
    lcd /home/databackup
  9.  
    prompt
  10.  
    put a.sh a.sh
  11.  
    close
  12.  
    bye
  13.  
    !

12、获取本机的网络地址

比如:本机的ip地址是:
192.168.100.5/255.255.255.0,
那么他的网络地址是:
192.168.100.1/255.255.255.0
方法一:

  1.  
    #!/bin/bash
  2.  
    IP=ifconfig eth0|grep 'inet addr'|sed 's/^.*addr://g'|awk '{print $1}'
  3.  
    NETMASK=ifconfig eth0 |grep "inet addr"|sed 's/^.*Mask://g'
  4.  
    echo "$IP/&NETMASK"
  5.  
    exit

方法二:

  1.  
    #!/bin/bash
  2.  
    #This script print ip and network
  3.  
    file="/etc/sysconfig/network-scripts/ifcfg-eth0"
  4.  
    if [ -f $file ] ;then
  5.  
    IP=`grep "IPADDR" $file|awk -F"=" '{ print $2 }'`
  6.  
    MASK=`grep "NETMASK" $file|awk -F"=" '{ print $2 }'`
  7.  
    echo "$IP/$MASK"
  8.  
    exit 1
  9.  
    fi

IP地址也可这样获取:IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "
子网掩码:NETMASK= `ifconfig eth0 | grep "inet addr"|cut -f 4 -d ":"

13、判断输入是否为IP

方法1:

  1.  
    function check_ip(){
  2.  
        IP=$1
  3.  
        VALID_CHECK=$(echo $IP|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
  4.  
        if echo $IP|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$">/dev/null; then
  5.  
            if [ $VALID_CHECK == "yes" ]; then
  6.  
                echo "$IP available."
  7.  
            else
  8.  
                echo "$IP not available!"
  9.  
            fi
  10.  
        else
  11.  
            echo "Format error!"
  12.  
        fi
  13.  
    }
  14.  
    check_ip 192.168.1.1
  15.  
    check_ip 256.1.1.1

方法2:

  1.  
    function check_ip(){
  2.  
        IP=$1
  3.  
        if [[ $IP =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
  4.  
            FIELD1=$(echo $IP|cut -d. -f1)
  5.  
            FIELD2=$(echo $IP|cut -d. -f2)
  6.  
            FIELD3=$(echo $IP|cut -d. -f3)
  7.  
            FIELD4=$(echo $IP|cut -d. -f4)
  8.  
            if [ $FIELD1 -le 255 -a $FIELD2 -le 255 -a $FIELD3 -le 255 -a $FIELD4 -le 255 ]; then
  9.  
                echo "$IP available."
  10.  
            else
  11.  
                echo "$IP not available!"
  12.  
            fi
  13.  
        else
  14.  
            echo "Format error!"
  15.  
     
  16.  
        fi
  17.  
    }
  18.  
    check_ip 192.168.1.1
  19.  
    check_ip 256.1.1.1

增加版:加个死循环,如果IP可用就退出,不可用提示继续输入,并使用awk判断

  1.  
    function check_ip(){
  2.  
        local IP=$1
  3.  
        VALID_CHECK=$(echo $IP|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
  4.  
        if echo $IP|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then
  5.  
            if [ $VALID_CHECK == "yes" ]; then
  6.  
                return 0
  7.  
            else
  8.  
                echo "$IP not available!"
  9.  
                return 1
  10.  
            fi
  11.  
        else
  12.  
            echo "Format error! Please input again."
  13.  
            return 1
  14.  
        fi
  15.  
    }
  16.  
    while true; do
  17.  
        read -p "Please enter IP: " IP
  18.  
        check_ip $IP
  19.  
        [ $? -eq 0 ] && break || continue
  20.  
    done

方法3

  1.  
    function check_ip(){
  2.  
    IP=$1
  3.  
    if [[ $IP =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
  4.  
    FIELD1=$(echo $IP|awk -F "." '{print $1}')
  5.  
    FIELD2=$(echo $IP|awk -F "." '{print $2}')
  6.  
    FIELD3=$(echo $IP|awk -F "." '{print $3}')
  7.  
    FIELD4=$(echo $IP|awk -F "." '{print $4}')
  8.  
    if [ $FIELD1 -le 255 -a $FIELD2 -le 255 -a $FIELD3 -le 255 -a $FIELD4 -le 255 ]; then
  9.  
    echo "$IP available."
  10.  
    else
  11.  
    echo "$IP not available!"
  12.  
    fi
  13.  
    else
  14.  
    echo "Format error!"
  15.  
     
  16.  
    fi
  17.  
    }
  18.  
    check_ip 192.168.0.29
  19.  
    check_ip 288.2.3.4

14、判断输入是否为数字

  1.  
    方法1:
  2.  
    if [[ $1 =~ ^[0-9]+$ ]]; then
  3.  
        echo "Is Number."
  4.  
    else
  5.  
        echo "No Number."
  6.  
    fi
  7.  
    方法2:
  8.  
    if [ $1 -gt 0 ] 2>/dev/null; then
  9.  
        echo "Is Number."
  10.  
    else
  11.  
        echo "No Number."
  12.  
    fi

方法3:

    1.  
      echo $1 |awk '{print $0~/^[0-9]+$/?"Is Number.":"No Number."}'  #三目运算符
    2.  
      DIR=$1
    3.  
      KEY=$2
    4.  
      for FILE in $(find $DIR -type f); do
    5.  
          if grep $KEY $FILE &>/dev/null; then
    6.  
              echo "--> $FILE"
    7.  
          fi
    8.  
      done
       
       
      (转) https://blog.csdn.net/bbwangj/article/details/73480480
posted @ 2018-08-07 15:08  Xuwenxing  阅读(403)  评论(0编辑  收藏  举报