Shell免交互

Shell免交互

  • [一. 变量配置](#一. 变量配置)

    • [1.1 在E0F外面的变量可以直接传入使用](#1.1 在E0F外面的变量可以直接传入使用)
    • [1.2 EOF的输入内容可以直接赋值给变量](#1.2 EOF的输入内容可以直接赋值给变量)
  • [二. expect语句](#二. expect语句)

    • [2.1 转义符](#2.1 转义符)
    • [2.2 expect的语法](#2.2 expect的语法)
    • [2.3 格式](#2.3 格式)
    • [2.4 脚本外传参](#2.4 脚本外传参)
    • [2.5 嵌套](#2.5 嵌套)
  • [三. 访问其它主机](#三. 访问其它主机)

  • 交互:当我们使用程序时,需要进入程序发出对应的指令,然后程序做出对应的执行结果

  • 免交互:I/O重定向,通过这种方式把指令提交给程序,程序运行指令。

文本免交互:

Here Document

命令<<标记

。。。

。。。

。。。

内容

标记

css 复制代码
root@u3:/opt# wc -l <<EOF
> 6
> 5
> 4
> EOF
3
root@u3:/opt# cat <<EOF>>test2.txt
> 1
> 2
> 3
> EOF
root@u3:/opt# cat test2.txt 
1
2
3
  1. 标记为可以是任意合法字符(EOE作为标记)
  2. 结尾的标记一定要顶格写,前面不能有空格,也不能有任何其他字符

一. 变量配置

1.1 在E0F外面的变量可以直接传入使用

csharp 复制代码
file='test3.sh'
i='sum'
cat >> $file <<EOF
today is ${i} day
EOF
root@u3:/opt# cat test3.sh
today is sum day

1.2 EOF的输入内容可以直接赋值给变量

csharp 复制代码
var="7 8 9"
myvar=$(cat <<EOF
1 2 3
4 5 6
$var
EOF
)
echo $myvar
root@u3:/opt# bash test2.txt 
1 2 3 4 5 6 7 8 9
csharp 复制代码
var="7 8 9"
myvar=$(cat <<'EOF'
#在开头的标记位使用单引号,外部的变量就不会被秒交互内部使用
1 2 3
4 5 6
$var
EOF
)
echo $myvar
root@u3:/opt# bash test2.txt 
1 2 3 4 5 6 $var
csharp 复制代码
去掉每行之前的tab键
可以自动抑制tab键的空格
cat >>test4.txt<<-EOF
                  66#普通空格
			77#tab键的空格
EOF
root@u3:/opt# bash lx.sh 
root@u3:/opt# ls
lx.sh  test4.txt
root@u3:/opt# cat test4.txt 
                  66
77

二. expect语句

建立在tcl(类c语言)的一个工具,可以用来对程序进行自动化控制和测试。解决shell脚本中交互的问题

apt -y install expect

2.1 转义符

  • \n:换行
  • \t:制表符(tab键)
  • \r:表示回车键
  • \b:表示退格键(backspace)

2.2 expect的语法

  1. #!/usr/bin/expect 必须声明使用的解释器
  2. 使用expect的脚本不可以使用bash编译,必须是赋权执行权限才能执行

2.3 格式

csharp 复制代码
#!/usr/bin/expect
#必须先声明解释器
set timeout 5
#定义超时时间,5秒到了,进程直接结束,默认超时时间是10秒
#set可以作为设置变量名(expect)
spawn passwd dn
#spawn表示开启一个会话,监控一个命令的执行过程,跟踪后续的交互信息

expect "新的密码:"
#开启捕获,匹配到需要输入的内容行
send "123abcd\r"
#send 用来模拟用户的输入过程
expect "重新输入新的密码:"
send "123abcd\r"
#expect的结束语句(只能从中选一个):
expect eof
#当交互结束之后,退回到上一次的用户,也就是spawn开始执行的用户是谁,就推回到谁
#interact
#当交互结束之后,留在当前用户不变

root@u3:/opt# chmod 777 passwd.sh   #必须给权限才能使用
root@u3:/opt# ./test1.sh passwd dn

2.4 脚本外传参

css 复制代码
#!/usr/bin/expect
set username [lindex $argv0]
#相当于shell脚本的位置变量
#set username dn
#username=dn
set password [lindex $argv 1]
spawn su - $username
expect "密码"
send "$password\r'
expect "#"
send_user "ok"
#send user相当于echo,打印指定内容
expect eof

2.5 嵌套

css 复制代码
#创建用户
#!/bin/bash
user=$1
password=$2
useradd -m-s /bin/bash $user
#开始使用嵌套,执行免交互
/usr/bin/expect <<-EOF## 标题
spawn passwd $user
expect "新的*"
send "${password}\r"
expect "重新*"
send "${password}\r'
expect eof
EOF
csharp 复制代码
root@u3:/opt# bash sul.sh test2 123

三. 访问其它主机

css 复制代码
#!/usr/bin/expect
set timeout 5
set ip 192.168.246.7
set user root
set password 123
spawn ssh $user@$ip
expect {
"(yes/no/\[fingerprint])?"{send "yes\n";exp_continue}
"password:"{send "$password\n"}
}
expect eof
相关推荐
子兮曰20 小时前
Chrome 权限元素实战:144 与 151 的渐进增强写法
前端·javascript·chrome
Frag0ut1 天前
Chrome 156 新特性完整指南:2026 最新功能与开发实践
chrome·谷歌浏览器·浏览器开发·chrome 156·webgpu\·css random·indexdb
PNP Robotics2 天前
【PNP具身分析】20+自由度灵巧手从抓取到精细交互,2026年灵巧手方向全球前沿具身典型案例
交互
寂寞的船2 天前
【Unity知识速递】第8期 IL2CPP 托管堆内存碎片与原生堆交互机制深度解析
unity·游戏引擎·交互
afumu3 天前
把五个网页版 AI 拉进同一个群聊:不用 API key 的多 Agent 编排
人工智能·chrome·typescript
解决问题no解决代码问题4 天前
日志脱敏双链路统一优化:从两套枚举到单一规则源,兼顾安全与可维护性
microsoft
MUSHANGXS4 天前
大模型时代的新蓝海-基于OS底层的AI-Agent应用
人工智能·职场和发展·交互
Dovis(誓平步青云)4 天前
启元 T1 Pro 人机相声搭档:语音-触摸双通道的启元机器人节奏引擎设计
开发语言·前端·javascript·microsoft·交互
宝桥南山4 天前
.NET 11 - 尝试一下Blazor中的新特性SupplyParameterFromTempData
microsoft·微软·c#·asp.net·.net·.netcore
其实防守也摸鱼5 天前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全