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

目录

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

2、批量创建用户

3.批量添加组用户

4.批量删除用户

5.批量修改用户密码

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

7、批量修改文件名

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

9、ftp自动登录上传文件

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

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

12、获取本机的网络地址

13、判断输入是否为IP

14、判断输入是否为数字


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

猜你喜欢

转载自blog.csdn.net/qq_33468857/article/details/82192371