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
相关推荐
此刻觐神1 天前
IMX6ULL开发板学习-03(Linux文件相关命令)
前端·chrome
chaofan9801 天前
从文字响应到动态沙盒:深度解析 Gemini 交互模拟 API 的技术实现与集成
人工智能·交互·api
Meme Buoy1 天前
11.2统一建模语言UML-事务关系图
microsoft·uml
skywalk81631 天前
使用DuMate帮助创建 Python 3.9 环境并部署 Kotti CMS
前端·chrome
code小生1 天前
微软 Microsoft Edge 浏览器插件开发者注册指南
前端·microsoft·edge·edge浏览器·浏览器插件开发者
空中海1 天前
2.5 手势识别与交互系统
flutter·交互·dart
卷卷说风控1 天前
工作流的 Skill 怎么写?
java·javascript·人工智能·chrome·安全
帐篷Li1 天前
【Vibe Coding】一口气搞懂AI黑话:Vibe Coding、Agent、提示词、MCP、Skills全解析
人工智能·microsoft
拓端研究室1 天前
2026中国医疗健康行业趋势报告:投融资回暖、AI渗透与产业链提价|附100+份报告PDF、数据、可视化模板汇总下载
人工智能·物联网·microsoft
Eiceblue1 天前
Python 如何实现 Excel 数据分列?一列拆分为多列
python·microsoft·excel