linux 免交互

Linux 免交互

1、免交互概念

概念:对于shell脚本的自动化运维,就要实现免交互来达到自动化运维的效果

2、基本免交互的例子

可以免交互统计出行号

2.1命令行免交互统计

powershell 复制代码
wc -l <<EOF
> a
> b
> c
> d
> EOF
4

2.2使用脚本免交互统计

powershell 复制代码
cat 1.sh
wc -l <<EOF
a
b
EOF
[root@localhost ~]# sh 1.sh
2

2.3使用免交互命令打印

powershell 复制代码
[root@localhost ~]# read i <<EOF
> a
> EOF
[root@localhost ~]# echo $i
a
[root@localhost ~]# 

2.4免交互修改密码

powershell 复制代码
passwd user <<EOF
> 123123
> 123123
> EOF

2.5重定向查看

powershell 复制代码
cat <<EOF
> 尾声:半个月亮
> 跋:从山峦到海洋
> EOF
尾声:半个月亮
跋:从山峦到海洋

2.6重定向到指定文件

powershell 复制代码
cat <<EOF>1.txt
尾声:半个月亮
跋:从山峦到海洋
EOF

2.7重定向直接指定文件

powershell 复制代码
tee 1.txt <<EOF
> 《额尔古纳河右岸》
> EOF
《额尔古纳河右岸》

2.8使用脚本完成重定向输入

powershell 复制代码
#!/bin/bash
file="1.txt"
i='girl'
cat >$file<<EOF
mws is a $i
EOF

2.9免交互脚本完成赋值变量

powershell 复制代码
#!/bin/bash
var="Life is fucking move!"
myvar=$(cat<<EOF
人生如戏
$var
EOF
)

echo "$myvar"

2.10关闭变量替换功能,按照原来样子输出

powershell 复制代码
#!/bin/bash
var="Life is fucking move!"
myvar=$(cat<<'EOF'
人生如戏
$var
EOF
)

echo "$myvar"

2.11去tab键,无法去空格

powershell 复制代码
#!/bin/bash
var="Great! I am going to school!"
myvar=$(cat <<-'EOF'
        this is line 1.
     today is monday.
   $var
EOF
)

echo $myvar

2.12注释打印,无法生效:批量注释

脚本展示

powershell 复制代码
#!/bin/bash
i=ab
:<<EOF
     abcd
abcd
$i
EOF

命令展示

3、expect

expect:建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题。
使用方法:表示捕捉关键词展示行

3.1脚本解释器

加入引用程序路径表示使用expect,表明使用这个shell

运行只能使用./运行,运行前赋权777

powershell 复制代码
#!/usr/bin/expect

3.2 spawn:启动新的进程并监控和捕捉

spawn 后面通常跟一个Linux执行命令,表示开启一个会话、启动进程,并跟踪后续交互信息。

例如:spawn passwd root

3.3 expect :从进程接收字符串

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

3.4 send:用于向进程发送字符串

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

方式一:

powershell 复制代码
expect "密码"{send "123123\r"}					#同一行send部分要有{  }

方式二:

powershell 复制代码
expect"密码										#换行send部分不需要有{ ) 
send "abc123\r"

方式三:expect支持多个分支

powershell 复制代码
expect											#只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
{											
"密码1" {send "123123\r"}
"密码2" {send "abcdef\r"}
"密码3" {send "abc123\r"}
}

3.5 exp_continue:匹配多个字符串在执行动作后加此命令

exp_continue 附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。

exp_continue类似于控制语句中的 continue 语句。表示允许 expect 继续向下执行指令。

注意∶ 使用exp_continue时,如果跟踪像 passwd 这样的输入密码后就结束进程的命令,expect{}外不要再加上expect eof因为spawn进程结束后会默认向expect发送eof, 会导致后面的 expect eof 执行报错

3.6 expect eof:结束符

表示交互结束,等待执行结束,退回到原用户,与spawn对应。

比如切换到root用户,expect脚本默认的是等待10s当执行完命令后,默认停留10s后,自动切回了原用户

3.7 interact:允许用户交互

  • 会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命.令不起作用;
  • 比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出,而不是留在远程终端上。
  • 使用interact会保持在终端而不会退回到原终端;
    注意∶ expect eof 与 interact 只能二选一

3.8 set:设置会话超时时间

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

3.9 send_users:回显命令

表示回显命令,相当于 echo

3.10 接收参数

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

powershell 复制代码
set hostname [lindex $argv 0]						#相当于 hostname=s§1				
set password [lindex Sargv 1]						#相当于 password=$2				

4、示例脚本:ssh远程登录


相关推荐
longze_72 小时前
Ubuntu连接不上网络问题(Network is unreachable)
linux·服务器·ubuntu
Dirschs2 小时前
【Ubuntu22.04安装ROS Noetic】
linux·ubuntu·ros
qianshanxue112 小时前
ubuntu 操作记录
linux
AmosTian4 小时前
【系统与工具】Linux——Linux简介、安装、简单使用
linux·运维·服务器
这我可不懂7 小时前
Python 项目快速部署到 Linux 服务器基础教程
linux·服务器·python
车车不吃香菇8 小时前
java idea 本地debug linux服务
java·linux·intellij-idea
tan77º8 小时前
【Linux网络编程】Socket - TCP
linux·网络·c++·tcp/ip
kfepiza9 小时前
Linux的`if test`和`if [ ]中括号`的取反语法比较 笔记250709
linux·服务器·笔记·bash
CodeWithMe9 小时前
【Note】《深入理解Linux内核》 第十九章:深入理解 Linux 进程通信机制
linux·运维·php