坚持#第243天~shell脚本5

来源:互联网 发布:软件交付需求变更 编辑:程序博客网 时间:2024/06/14 14:11

10.expect shell脚本交互式操作?

expect:(自动切换用户,属于自动化范畴)

expect核心有expect、spawn、send、set

su - tom

su - jack此时需要有密码才能切换用户

send发送需要交互值,代替用户手动输入的内容

set设置变量值

set timeout 60 到60秒超时

set timeout -1 永不超时

interact  执行完成后保持交互状态。

expect eof表示结束

 

题目:切换到普通用户,在普通用户的环境下【再切换到另一个普通用户,此时需要输入密码,成功切换之后再在/tmp下面创建一个名字叫tom.txt的文件】,左边的【】里面的动作要求执行一个脚本会自动完成

expect查看有没有这个命令

yum install expect -y安装expect命令

which expect查询命令所在位置

/usr/bin/expect结果

vim /scripts/expecttest1.sh

#!/usr/bin/expect命令要换一下位置

start(buxie)

spawn su - tom切换到tom里面去

expect “密码:”   expect就是捕捉关键字

send “1\n”表示输入1并按回车

expect “$”进去之后的提示符

send “touch /tmp/tom.txt\n”表示输入了命令之后再回车,注意send最后面必有\n

expect eof表示结束

chmod +x /scripts/expecttest1.sh必须要加执行权限

su -jim

/scripts/expecttest1.sh

效果是

spawn su - tom

密码:

su:鉴定故障

说明了没有给jim设置密码,设置完之后在执行/scripts/expecttest.sh

交互完成之后就会退出来

 

题目:将公钥发给251,服务器的密码是1

先演练一下:

ssh-keygen

回车

y回车

回车

ssh-copy-id 251

出现关键字password,输入1回车

 

start:

vim /scripts/expecttest2.sh

#!/usr/bin/expect

#

spawn ssh-copy-id 251

expect “password”

send “1\n”

expect eof别忘了expect有结束标志

别忘了expect要加执行权限

 

vim /root/.ssh/authorized_keys,清空

 

上题扩展:输入ip,能发送公钥给那个ip

#!/usr/bin/expect

#

spawn ssh-copy-id $ip_addr

expect “password”

send “1\n”

expect eof

再去写一个脚本:

vim /

#!/bin/bash

read -p “input ip:” ip_addr

/scri

发现还是行不通

#!/bin/bash

read -p “input ip:” ip_addr

read -p “input root passwd:”root_passwd

/usr/bin/expect << ok  将eof上面的内容输入到/usr/bin/expect里面

spawn ssh-copy-id -i$ip_addr

expect “password”

send “$root_passwd\n”

expect eof

ok

 

expect第一次成功(不是expect换一个捕获就行了,而是expect不能瞎写,不能写不存在的,捕获不到就炸了,不要多余expect了):

[root@server ~]#/usr/bin/expect << ok

> spawn ssh-copy-id -i192.168.1.62

> expect "@"

> send"123456\n"

> expect eof

> ok

 

expect第二次成功:

/usr/bin/expect << ok

spawn ssh-copy-id -i192.168.1.62

expect "password"

send "123456\n"

expect eof

ok

 

expect第三次成功:

/usr/bin/expect << ok

spawn su - michael2

expect "密码"

send "123456\n"

expect "michael2"

send "touch/tmp/lbxtmp/michael2.txt\n"

expect eof

ok

 

expect第四次成功:

#!/bin/bash

read -p "inputip:" ip_addr

read -p "input rootpasswd:" root_passwd

/usr/bin/expect << ok

spawn ssh-copy-id -i$ip_addr

expect "password"

send"${root_passwd}\n"

expect eof

ok

 

试试第一开始没有录入指纹的情况不加yes/no的expect行不行?

答:不行,一定要非常精准,若未录入指纹则要加yes/no的这种情况,若已经录入指纹,要去掉yes/no这种情况。

#!/bin/bash

read -p "inputip:" ip_addr

read -p "input rootpasswd:" root_passwd

/usr/bin/expect << ok

spawn ssh-copy-id -i$ip_addr

expect"yes/no"

send"yes\n"

expect "password"

send"${root_passwd}\n"

expect eof

ok

最后提醒一下expect注意要加执行权限

 

第五次成功:

1.将公钥发送到192.168.1.1~192.168.1.10密码是1

注意expect要加执行权限啊

复制给上面

#!/bin/bash

# 将公钥发送到192.168.1.1~192.168.1.10密码是1

for((i=1;i<=10;i++));do

    /usr/bin/expect << ok

    spawn ssh-copy-id 192.168.1.$i

    expect "yes/no"

    send "yes\n"

    expect "password"

    send "1\n"

    expect eof

ok

# 注意:结束标志"ok"必须要放到行首才行

done

 

 

MD5加密:

echo 1 | md5sum可以生成32位的字符串

wc -c查看一行有多少字

wc -l 查看有多少行

 

1个月定期改变服务器的密码

 

[  -x(判断这条命令是否存在) /usr/bin/expect ] || yum installexpect -y &> /dev/null可以放在read -p上面

 

spawn su -tom

expect{

    “密码”  {send “1\n”;exp_continue}

    “$”     {send “touch /tmp/tom.txt\n”;exp_continue}

    “$”     {send “mkdir /tests\n”}

}

expect eof

 

11.函数?

start:

vim hanshu.sh

#!/bin/bash

test1(){     试下test1后面不加空格,可以连在一起

    echo “hah”

}

function test1(){

    echo “hah”

}

test1

 

case $1 in

start)

    test1;;别忘了case有两个分号,case就是考分号

*)

    echo “try again”

esac

 

a=50

function test(){

    local a=0可以将全局变量在局部里面改变其值,local是局部变量

    echo $a

}

echo $a

a=1

echo $a

test

echo $a

结果是0 50  1 1错,订正:50 1 0 1注意执行的顺序,函数在哪执行看在哪调用

 

12.数组?

declare -asz1声名数组sz1

sz1[0]=a给数组sz1赋予第一个值为a

declare |grep sz1查看

 

declare -asz2

sz2=(A B C DE)直接赋值

declare |grep sz2查看

(declare -a 查看所有)

 

echo${sz1[0]}取值

echo ${sz2[*或@]}取所有值

 

for i in${sz2[*]};do echo $i;done使用for循环遍历取值

 

echo${#sz2[*]}获取数组长度

3

echo${!sz2[*]}获取数组下标

0 1 2

echo${sz2[*]:1}从下标1开始取值

B C D E

echo${sz2[*]:1:3}

B C D

 

题目:1.定义一个数组,数组叫user_name,值为user1~user10,使用数组方式创建这10个用户,并为用户设置密码,密码和用户名一致

解:

declare -auser_name

user_name=(user1user2 user3 user4 user5 user6 user7 user8 user9 user10)用下面的写法呀

user_name=(user{1..10})

for i in${user_name[*]};do useradd $i;echo $i > passwd --stdin $i;done

删除这10个用户:for i in${user_name[*]};do userdel -r $i;done

 

 

 

 

 

 

 

 

 

 

13.正则表达式?

 

14.sed?

 

15.awk?

 

 

 

 

函数和数组可以将代码简化,重复利用

 

 

作业:

bilibili的马哥教育

凡哥笔记1就剩作业了(留着和吴老师发的面试题一起看)

 

交换机和路由器的关系:

网线的颜色顺序:

静态路由和动态路由:静态路由自己分配ip地址,动态路由DHCP自动分配ip地址

备份:系统备份(操作系统)、用户备份(文件)

每个用户的每个标识是什么?uid

 

下周三考试

 

 

作业:

1.将公钥发送到192.168.1.1~192.168.1.10 密码是1

注意expect要加执行权限啊

复制给上面

#!/bin/bash

# 将公钥发送到192.168.1.1~192.168.1.10密码是1

for((i=1;i<=10;i++));do

    /usr/bin/expect << ok

    spawn ssh-copy-id 192.168.1.$i

    expect "yes/no"

    send "yes\n"

    expect "password"

    send "1\n"

    expect eof

ok

# 注意:结束标志"ok"必须要放到行首才行

done

 

2.双色球
red: 33选6(意思是取6个随机数,范围是1~33,随机到的数不能有重复)
blue : 16选1(意思是取1个随机数,范围是1~16)

解:

i=1

while [ $i-le 6 ]

do

     redtmp=$[$RANDOM%33+1]

     flag="yes"

     for j in ${red[*]}

     do

         if [ $j -eq $redtmp ]

         then

         flag="no"

         break

         fi

     done

     if [ $flag = "yes" ]

     then

         red[$i]=$redtmp

          let i++

     fi

 done

 for i in {1..6}

 do

     echo -n "${red[i]} "

 done

 echo

 echo "$[$RANDOM%16+1]"

 

 

编写gid命令:

vim gid.sh

#!/bin/bash

# 编写gid命令-李涛

if [ -z $1];then

        echo "Usage: gid<groupname|--help|-l|--list>"

        exit 2

else

        if [ $1 == "--help" ];then

                echo "Usage: gid<groupname|--help|-l|--list>"

                echo "Show the group'sinfo"

                echo "Options:"

                echo -e "  --help\tprint this page"

                echo -e "  -l, --list\tlist all groups"

                echo -e "  groupname\tprint the group's info"

        elif [[ $1 == "-l" || $1 =="--list" ]];then

                cat /etc/group | cut-d":" -f1

        else

                groupExist=`cat /etc/group |cut -d":" -f1 | grep $1`

                gid=`cat /etc/group | cut-d":" -f1,3 | grep $1 | cut -d":" -f2`

                members=`cat /etc/group | cut-d":" -f1,4 | grep $1 | cut -d":" -f2 | grep -v $1`

                administrator=`cat /etc/gshadow| cut -d":" -f1,3 | grep $1 | cut -d":" -f2 | grep -v $1`

                if [ $1 =="$groupExist" ];then

                        echo"name:$groupExist"

                        echo"gid:$gid"

                        if [ -z $administrator];then

                                echo"administrator:"

                        else

                                echo"administrator:$administrator"

                        fi

                        if [ -z $members ];then

                                echo"members:${groupExist}"

                        else

                                echo"members:${groupExist},${members}"

                        fi

                else

                        echo "gid: $1:nosuch group"

                        exit 1

                fi

        fi

fi

 

怎么让这个脚本变为系统命令直接输入gid就能执行?

方法1:cp ./gid.sh/usr/bin/gid

chmod 700/usr/bin/gid

方法2:cp ./gid.sh ./gid

PATH=${PATH}:目录的绝对路径(临时生效)

 

感悟:

组管理员是什么?

cat/etc/gshadow一共有四个部分

man 5gshadow查看就知道第三个部分就是组管理员

哎呀火影笔记上第4页写了的呀,别忘了啊