Shell脚本之免交互操作

前言:主播最近遇到了烦心事,这段时间没有前言

目录

1.Here Document

1.1Here Document概述

1.2语法格式

1.3Here Document使用注意事项

2.Here Document实验

2.1输入命令并输出

2.2输入命令并保存到文件 

2.3追加命令到文件

 2.4创建yum源

 3.Here Documen免交互

  3.1read命令

 3.2通过 passwd 给用户设置密码

3.3变量设定(支持变量替换)

3.3.1定义变量替换成实际值

 3.3.2支持变量替换

3.3.3整体赋值变量

 4.格式控制

4.1关闭变量替换

 4.2去掉每行之前的TAB字符

4.3多行注释

5.expect

5.1expect的概述

5.2expect的安装

 5.3expect中的基本命令

 5.3.1脚本解释器

5.3.2spawn 启动新的进程(监控,捕捉)

5.3.3expect

5.3.4send

5.3.5结束符expect eof

5.3.6interact

5.3.7set

5.3.8exp_continue

5.3.9 send user

5.3.10接收参数

5.4expect实验

5.4.1ssh无交互登录到远程服务器

 5.4.2 如果想要在对方服务器上进行一下操作后再退出可执行以下脚本

 5.4.3ssh免交互登录

 5.4.4创建用户并设置用户密码

5.4.5 ssh自动登录

​6.总结


1.Here Document

1.1Here Document概述

1.使用I/O重定向的方式将命令列表提供给交互式程序

2.标准输入的一种替代品

1.2语法格式

格式:

命令 <<标记

。。。

输入内容

。。。

标记

举例子:

1.3Here Document使用注意事项

1.标记可以使用任意合法字符

2.结尾的标记一定要顶格写,前面不能有任何字符(包括空格)

3.结尾的标记后面也不能有任何字符(包括空格)

4.开头标记前后空格会被省略掉

5.单引号 变量双引号 —

2.Here Document实验

2.1输入命令并输出

[root@localhost ~]# cat <<EOF   //直接把输入的从命令行输出
> helloow world
> EOF
helloow world

2.2输入命令并保存到文件 

[root@localhost ~]# cat > name <<EOF   //输入保存到文件
> liuchun
> zhougang
> EOF

[root@localhost ~]# cat name

hehe

chenchen

2.3追加命令到文件

[root@localhost ~]# cat >> name <<EOF    //追加输入保存到文件
> fengfeng

> jianjian
> EOF

[root@localhost ~]# cat name 
hehe

chenchen

fengfeng

jianjian

 2.4创建yum源

[root@localhost ~]# cat > local.repo <<EOF
> [local]
> name=local
> baseurl=file:///mnt
> enabled=1
> gpgcheck=0
> EOF

[root@localhost ~]# cat local.repo

name=local
baseurl=file:///mnt
enabled=1
gpgcheck=0

 3.Here Documen免交互

  3.1read命令

[root@localhost ~]# read hehe <<EOF
> 100
> EOF
[root@localhost ~]# echo $hehe
100

 3.2通过 passwd 给用户设置密码

[root@localhost ~]# passwd liunan <<EOF
> 123456
> 123456
> EOF
更改用户 liunan 的密码 。
新的 密码:无效的密码: 密码少于 8 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。

3.3变量设定(支持变量替换)

3.3.1定义变量替换成实际值

[root@localhost ~]# a=$(cat <<EOF  
> $hehe
> EOF
> )

[root@localhost ~]# echo $aa

100

[root@localhost ~]# echo $hehe

100

 3.3.2支持变量替换

[root@localhost ~]vim bianliang.sh

#!/bin/bash 
doc_file="ky19.txt" 
i="ky19 nannan"
cat > $doc_file << EOF 
nannan zhen shuai $i 
EOF

[root@localhost ~]cat ky19.txt

nannan zhen shuai ky19 nannan

3.3.3整体赋值变量

[root@localhost ~]vim jiaohuan2.sh

#!/bin/bash
IVAR="hehe yan zhi dan dang"
MYVAR=$( cat <<EOF
myvar=$(cat <<EOF

This is Line 1.

That are Sun,Moon and Stars.

$ivar
EOF
)
echo $MYVAR

 

 4.格式控制

4.1关闭变量替换

1.[root@localhost ~]# echo $hehe
2.100
3.[root@localhost ~]# echo $a
4.100
5.[root@localhost ~]# a=$(cat <<'EOF'
6.> 200
7.> $ky
8.> EOF
9.> )
10.[root@localhost ~]# echo a
11.a
12.[root@localhost ~]# echo hehe
13.hehe

 4.2去掉每行之前的TAB字符

(在第一行的标记前面加‘-’,这个表示要抑制各行首 TAB 的作用。ps:一定要用tab键)

1.[root@localhost ~]# vim guanbb.sh
2.#!/bin/bash
3.cat <<EOF
4        hehe zhen shuai
5.EOF
6
7.cat <<-EOF
8.       guan chen bu ru hehe
9.EOF

 

4.3多行注释

1.[root@localhost ~]# vim duohang.sh
2.#!/bin/bash
3.cat <<EOF
4      hehe zhen shuai
5.EOF
6
7
8.#cat
9.:<<-EOF
10.        guanchen bu ru nannan shuai
11.EOF

Bash 的默认注释是“#”,该注释方法只支持单行注释,在 Shell 脚本的工作中,“#”右侧的任何字符串,bash 都会将其忽略。Here Document 的引入解决了多行注释的问题。
:”代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash 忽略掉,因此可达到批量注释的效果。
 

5.expect

5.1expect的概述

expect就是建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题

5.2expect的安装

因为expect是一个程序,所以要安装才能用

1.rpm -q expect
2.rpm -q tcl
3.yum install -y expect

 5.3expect中的基本命令

 5.3.1脚本解释器

1.expect 脚本中首先引入文件,表明使用的事哪一种shell
2.#! /usr/bin/expect

5.3.2spawn 启动新的进程(监控,捕捉

1.spawn后面通常跟一-个Linux执行命令,表示开启一个会话、启动进程,并跟踪后续交互信息 例: spawn passwd root

5.3.3expect

1.判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;只能捕捉由spawn启动的进程的输出;用于接收命令执行后的输出,然后和期望的字符串匹配

5.3.4send

1.向进程发送字符串,用于模拟用户的输入;该命令不能自动回车换行,一般要加\r(回车)或者\n

5.3.5结束符expect eof

1.表示交互结束,等待执行结束,退回到原用户,与spawn对应。
比如切换到root用户,expect脚本默认的是等待10s,当执行完命令后,默认停留10s后,自动切回了原用户

5.3.6interact

1.执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命令不起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。
使用interact会保持在终端而不会退回到原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另一服务器,会一直在目标服务器终端,而不会切回的原服务器。

ps:expect eof 与 interact只能二选一

5.3.7set

expect 默认的超时时间是10秒,通过 set 命令可以设置会话超时时间,若不限制超时时间则应设置为-1。
例: set timeout 30

5.3.8exp_continue

exp_continue

附加于某个expect判断项之后,可以使该项被匹配后,还能继续匹配该expect-判断语句内的其他项。exp_continue类似于控制语句中的 continue 语句。表示允许expect继续向下执行指令。
例如:下例将判断交互输出中是否存在yes/no 或*password。如果匹配 yes/no则输出 yes 并再次执行判断;如果匹配*password则输出abc123 并结束该段expect语句。

expect {
     " (yes/no)"{ send "yes\r"; exp _continue ; }
    "*password" { set timeout 300; send "abc123\r";}
注意:使用exp continue时,如果跟踪像passwd 这样的输入密码后就结束进程的命令,expect{}外不要再加上expect eof
因为spawn进程结束后会默认向expect发送eof,会导致后面的 expect eof执行报错  

ps:表示允许用户进行交互操作,一直保持会话连接

5.3.9 send user

send_ user表示回显命令,相当于echo

5.3.10接收参数

expect脚本可以接受从bash命令行传递的参数,使用[lindex $argv n]获得。其中n从0开始,分别表示第一个,第二个,第三个..参数。

例:
set hostname [ lindex $argv 0]
相当于hostname=$1
set password [ lindex $argv 1]
相当于password=$2

5.4expect实验

5.4.1ssh无交互登录到远程服务器

[root@ky19 jiaohu ~]# vim expect.sh 

#!/usr/bin/expect   //这里需要用expect自己的解释器,注意不要写成bash否则无法识别
spawn ssh root@192.168.75.135   //开启一个程序,这个程序是ssh远程登录
expect {              
 //捕获内容,当出现password的时候,就会向程序发送密码,默认是不换行的,所以需要\r回车换行,多个条件需要花括号括起来,注意格式问题!
        "password:"
        { send "123456\r"; }
}

[root@ky19 jiaohu ~]# chmod +x expect.sh  //需要加执行权限
[root@ky19 jiaohu ~]# ./expect.sh 
spawn ssh root@192.168.75.138
root@192.168.75.138's password: 
Last login: 
Tue May 10 15:33:27 2022 from 192.168.75.135

 5.4.2 如果想要在对方服务器上进行一下操作后再退出可执行以下脚本

[root@localhost ~]# vim expect.sh
#!/usr/bin/expect
spawn ssh root@192.168.75.138
expect {
        "password:"
        { send "123456\r"; }

expect "#"       //当捕获到#的时候【#代表是管理员用户;$表示普通用户】
send "ls\r"    //执行ls命令
send "ifconfig ens33\r"   //执行ifconfig ens33命令
send "exit\r"   //执行完exit退出登陆
expect eof    //不需要进行交互了,意味着结束expect程序,如果不写的话不会执行操作直接退出;如果不写,写interact也无法在对方机器上执行命令,eof可以替换
过十秒钟自动退出

 5.4.3ssh免交互登录

#!/usr/bin/expect 
set timeout 15   //set:是设置的意思【设置登录超时时间是15秒就退出】
log_file test.log  //所有的日志文件都是以.log结尾的
log_user 1
set ip [lindex $argv 0] 
set password [lindex $argv 1] 
spawn ssh root@${ip} 
expect {
"(yes/no)"
{send "yes\r"; exp_continue} "*password"  
#//如果是yes则回车;否则退出;并且捕获密码*代表任意
{send "$password\r"}
}
Interact

 5.4.4创建用户并设置用户密码

#!/bin/bash
username=$1
useradd $username
/usr/bin/expect <<-EOF
spawn passwd $username
expect {
"密码"     //注意:获取的内容和发送的内容不能在同一行否则执行不成功
{send "123456\r";exp_continue}  
//expend来捕获密码;如果密码输入123456正确,则换行;否则用exp来捕获下一个密码 表示继续
"新的密码"
{send "123456\r";}
}
EOF

验证结果:
[root@server ~]# . user.sh wangwu
spawn passwd liunan
更改用户 liunan 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

5.4.5 ssh自动登录

#!/usr/bin/expect 
set timeout 5  //超时时间为5秒
set hostname [lindex $argv 0] 
set password [lindex $argv 1] 
spawn ssh $hostname  //主机名
expect {
	"Connection refused" exit            #连接失败情况,比如对方ssh服务关闭
	"Name or service not known" exit           #找不到服务器,比如输入的IP地址不正确
	"to continue" {send "yes\r";exp_continue} 
	"password:" {send "$password\r"}
}
interact 
Exit

6.总结

这章主要就是讲了EOF和免交互登录

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值