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页写了的呀,别忘了啊