shell脚本免交互

shell脚本免交互

一、交互

交互:我们发出指令控制程序的运行,程序在接收到指令之后,按照指令的效果做出对应的反应

免交互,间接的,通过第三方的方式把指令传送给程序,不用直接的下达指令

Here document 免交互

这是命令行格式,也可以写在脚本当中。通过I/O重定向的方式,将命令列表传送给交互式程序或命令

是标准输入的一种替代品。代替了人工的输入方式。

语法格式:

命令(linux的系统命令)<<标记

内容1

内容2

内容3

标记

复制代码
wc -l <<xy102
123
456
789
xy102

注意事项:

1、标记可以是任意合法字符(一般不用特殊字符,不以数字开头,通常以EOF作为默认的标记位)

2、结尾的标记一定要顶格写。且前面不能有任何字符,空格也不行

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

4、开头的标记前后的空格都会被省略掉

复制代码
#!/bin/bash
#引入变量
file="test2.sh"
i=school
cat >$file<<EOF
I am going to $i
EOF

#!/bin/bash
#整体变量赋值
var="Great! I am goint to school"
myvar=$(cat <<EOF
this is Monday
$var
EOF
)
echo $myvar

Expect实现免交互

用tcl语言写的一个工具,主要用自动化 控制和测试。解决shell脚本交互的问题

转义符:

\n:换行

\r:回车

\t:相当于一个tab键

\b:表示退格,删除

复制代码
#!/usr/bin/expect
#声明解释器,不再是默认的bash
set timeout 5
#set设置,timeout超时时间,expect有一个默认的超时时间10秒。设置超时时间5秒
#set 也可以作为设置变量 
spawn passwd xy102
#spawn后面用来声明需要执行的命令,开始会话过程,并且跟踪后续的交互信息
expect "新的 密码:"
#捕获需要执行的命令行,只要能够捕获即可,不需要完整的,可以*代表所有
send "123\r"
#输入指令
expect "重新输入新的 密码:"
send "123\r"
expect eof
#interact expect eof
#expect eof 交互指令结束之后,会退回原用户
#interact 交互指令结束之后,会留在原用户
#最后一定要有结束语,结束只能写一个

#!/usr/bin/expect
set timeout 5
#传参的方式来表示
set username [lindex $argv 0]
set password [lindex $argv 1]
#这种方式就是位置变量
#开始追踪
spawn su - $username
#免交互开始执行
expect "密码:"
send "$password\r"
#继续捕获
expect "~]$"
send_user "ok\n"
#send_user = echo
#结束语
expect eof

嵌入执行模式,在shell当中加入expect。涉及到环境切换的场景不建议使用嵌套

ssh su不适合使用嵌入模式

复制代码
#!/bin/bash
user=$1
password=$2
#非交互命令,使用的是shell
useradd $user
#嵌入免交互
/usr/bin/expect <<-EOF
spawn passwd $user
expect "新的*"
send "$password\r"
expect "重新*"
send "$password\r"
expect eof
EOF

#!/usr/bin/expect
set ip 192.168.39.40
set user root
set password 123
set timeout 5
#进入交互

spawn ssh $user@$ip

expect {
        "(yes/no)"  { send "yes\r";exp_continue }
        #这里需要捕获两次,表示该项被匹配之后,继续匹配其他的指定内容。
        #类似循环的continue,允许expect语句,向下执行
        "password" { send "$password\r" }
}
interact

#!/usr/bin/expect
set timeout 5
set hostname [lindex $argv 0]
set password [lindex $argv 1]

spawn ssh $hostname

expect {

     "No route to host" {send_user "主机名/ip有误\n"}
     "Connection refused"  {send_user "ssh连接拒绝\n"}
     "(yes/no)" {send "yes\r";exp_continue}
     "password" {send "$password\r"}
}
interact
~          
相关推荐
smartpi_ai14 小时前
自学习“放着不动“会自动退出吗?超时退出缺席的交互兜底、退出条件挂串口的状态联动设计
学习·microsoft·交互
CappuccinoRose15 小时前
Web Components 基础
前端·javascript·交互·web component·shadow dom
做萤石二次开发的哈哈2 天前
海康班班通交互一体机技能接入实战:ISAPI透传+OTAP双协议封装,Web/App/小程序教学管理应用一站生成
前端·物联网·小程序·交互·萤石开放平台·蓝海aiot一站式工作台·aiot开发
LayZhangStrive2 天前
Agent开发 - 实现人类与Manus智能体的终端窗口命令交互
ai·交互·agent·react·终端·manus
yyt3630458412 天前
KLineChartQuant:GLSL 的精度问题及 RTC 解法
前端·vue.js·react.js·交互·图形渲染·webgl·数据可视化
Dream-Y.ocean2 天前
基于具身交互智能数字人,我用Flask搭了一个AI教学平台:课代表AI全流程实战
人工智能·flask·交互
励志不掉头发的内向程序员2 天前
【LibreCAD 2D架构】从鼠标点击到图形创建:RS_ActionDrawLine交互流程与状态机解析
开发语言·c++·qt·学习·系统架构·计算机外设·交互
Htr_2 天前
Reflexio 使用指南:让 AI 智能体从每次交互中持续学习
人工智能·学习·交互
智购科技无人售货机工厂店3 天前
2026自动售货机大屏交互设计原则:从信息层级到视觉动线的工程实践~YH
运维·python·单片机·嵌入式硬件·自动化·交互
平头哥技术团队4 天前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互