Shell 交互

免交互


引言:使用免交互模式减少非必要性的人工操作,提高工作效率

一、Here Document免交互

使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如ftp、cat或read命令

HereDocument是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入

1.语法格式
命令 <<标记
...
输入内容
...
标记

注意事项:

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

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

结尾的标记后面也不能有任何字符

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

[root@localhost hanxu]# cat <<EOF		输入的信息从命令行输出显示
> hahaha
> EOF
hahaha

在这里插入图片描述

输入的内容直接保存到文件

[root@localhost ~]# cat > 123 <<EOF
> ZHANGSAN
> LISI
> 王五
> EOF
[root@localhost ~]# cat 123
ZHANGSAN
LISI
王五

在这里插入图片描述

追加内容到文件

在这里插入图片描述

免交互的方式创建yum本地源

[root@localhost ~]# cat > test.repo <<EOF	创建yum本地源
> [test]									仓库名称
> name=test									仓库名称
> baseurl=file:///mnt						//连接地址;//为固定格式;/mnt为地址
> enabled=1									//开启本地源
> gpgcheck=0								//不验证软件包序号
> EOF					

另外写法1 cat <<EOF > local.repo
另外写法2 tee test1.txt <<EOF

通常使用read命令接收用户的输入值时会有交互过程,在EOF两个标记间可以输入变量值

[root@localhost ~]# read a <<EOF
 > 666
> EOF
[root@localhost ~]# echo $a
666

在这里插入图片描述

通过passwd给用户设置密码

[root@localhost ~]# useradd zhangsan
[root@localhost ~]# passwd zhangsan <<EOF
> 123456
> 123456
> EOF

在这里插入图片描述

2.变量设定

Here Document也支持使用变量,如果标记之间有变量被使用,会先替换变量值,如果想要将一些内容写入文件,除了常规的方法外,也可以使用Here Document,如果写入的内容中包含变量,在写入文件时要先将变量替换成实际值,在结合cat命令完成写入

如果写入的内容中包含变量,在写入文件时要先将变量替换成实际值,在结合cat命令完成写入

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

在这里插入图片描述

变量替换

脚本定义变量,输入内容到文件

#!/bin/bash
file="fil.txt"
i="boss "
cat > $file << EOF
I am a $i
EOF

在这里插入图片描述

整体赋值给一个变量,然后通过echo命令将变量值打印出来

#!/bin/bash
IVAR="张三"
MYAR=$( cat <<EOF
1.大聪明
2.卧龙
3.没凤雏厉害

这就是:$IVAR
EOF
)
echo $MYAR

在这里插入图片描述

#!/bin/bash
D_file="ky19.txt"
i="ky19 weizix"
cat > $D_file <<EOF
this if kgc $i
EOF

在这里插入图片描述

#!/bin/bash
IVAR="KY19班有个张斌,上课有手就行"
MYVAR=$(cat <<EOF
1.本地yum源是否会
2.ping百度是否会
抽查人:$IVAR
EOF
)
echo $MYVAR         

在这里插入图片描述

格式控制:

关闭变量替换的功能

关闭变量替换的功能,按照字符原本的样子输出,不做任何修改或替换

加上单引号。变量不做修改
在这里插入图片描述

#!/bin/bash
i="dhqwihdo qw"
shuchu=$(cat <<"EOF"
$i
1000000
EOF
)
echo $shuchu

在这里插入图片描述

2.1去除每行的TAB字符

在这里插入图片描述

3.多行注释

Bash的默认注释是"#“,该注释方法只支持单行注释,在Shell脚本的工作中,”#"右侧的任何字符串,bash都会被其忽略,Here Document的引入解决了多行注释的问题,

":"代表什么都不做的空命令,中间标记区域的内容不会被执行,会被bash忽略掉,因此可达到批量注释的效果

#!/bin/bash
aa=boss
: <<-EOF
this is yunwei
echo $a
EOF
echo "exec string"

在这里插入图片描述

二、Expect

1.epexct概述

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

2.expect的安装

expect它是一个程序需要提前安装;

rpm -q expect		查看是否安装
rpm -q tcl
yum install -y expect	安装

在这里插入图片描述

3.基本命令:

**3.1 脚本解释器:**expect脚本首先引入文件,表明使用的是哪一个shell

#!/usr/bin/expect

**3.2 spawn 启动新的进程(监控、捕捉)😗*spawn后面通常根跟一个Linux命令。表示开启一个会话,启动进程,并跟踪后续交互信息

例:spawn passwd root

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

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

例:

方式一:expect "密码"{ send "abc123\r"}	同一行send部分要有{}
方式二:expect"密码" 
		send "abc123\r"		换行send部分不需要有{}
方式三:expect支持多个分支
expect			只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
"密码1"{ send "abc123\r"}
"密码2"{ send "123456\r"}
"密码3"{ send "123123\r"}

**3.5结束符expect eof:**标识交互结束,等待执行结束,退回到原用户,与sqawn对应,比如切换到root用户,expect脚本默认的是等待10s,当执行完命令后,默认停留10s后,自动切回了原用户

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

**注:**expect与interat只能二选一

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

例:set timeout 30

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

exp_ continue类似于控制语句中的continue语句,标识允许expect继续向下执行指令;附加于某个expect的判断项之后,可以使该项被匹配后,还能继续匹配该expect-判断语句内的其它项

**3.8 send user:**send_user 表示回显命令,相当于echo

**3.9接收参数:**expect脚本可以接受从bash命令行传递的参数,是哟个[lindex $argv n]获得,其中n从0开始,分别表示第一个,第二个,第三个…参数

set hostname [lindex $argv 0] 相当于hostname=$1

set password [lindex $argv 1] 相当于passwd=$2

set hostname [lindex $argv 0] 相当于hostname=$1

set passwd [lindex $argv 1] 相当于passwd=$2

三、案例

1.免交互切换账户
#!/usr/bin/expect
#设置超时时间
set timeout 5
#参数传入
set hostname [lindex $argv 0]
#hostname=$1
set password [lindex $argv 1]
#passwd=$2
#开始追踪命令
spawn su $hostname
#免交互执行,捕捉信息并匹配
expect "密码"
{send "123456\r"}
sepect "ls"
send_user "ls"
#把控制权交给控制台
interact
#expect eof

在这里插入图片描述
在这里插入图片描述

2.免交互远程登陆
#!/usr/bin/expect
spawn ssh root@192.168.206.190

expect {
        "password:"
        { send "123456\r"; }

}

expect "#"
send "ls\r"
send "ifconfig ens33\r"
send "exit"

expect eof

在这里插入图片描述
在这里插入图片描述

总结

上述内容,主要讲了五交互的使用方法和以及用一些简单的案例,大多用于自动化的Shell脚本中

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用 `os/exec` 包来在 Go 中实现与 Shell交互。下面是一个简单的示例代码: ```go package main import ( "bufio" "fmt" "os/exec" ) func main() { cmd := exec.Command("sh") stdin, err := cmd.StdinPipe() if err != nil { panic(err) } stdout, err := cmd.StdoutPipe() if err != nil { panic(err) } scanner := bufio.NewScanner(stdout) if err := cmd.Start(); err != nil { panic(err) } go func() { defer stdin.Close() stdin.Write([]byte("echo hello world\n")) }() for scanner.Scan() { fmt.Println(scanner.Text()) } if err := cmd.Wait(); err != nil { panic(err) } } ``` 这个例子创建了一个 `sh` 进程,并通过管道向其输入了一个命令 `echo hello world`,然后读取了输出并打印到控制台。你可以根据自己的需求修改这个例子。 ### 回答2: golang的Shell交互是指在Golang程序中执行Shell命令并与其进行交互的功能。 在Golang中实现Shell交互可以使用os/exec包。该包提供了执行Shell命令的函数和方法,可以通过它们来执行Shell命令并获取命令的标准输出、标准错误和执行结果。 首先,我们需要引入os/exec包。然后,使用exec.Command函数创建一个Cmd类型的对象,该对象表示要执行的Shell命令。可以通过Cmd对象的方法设置命令的参数、工作目录等。 接下来,使用Cmd对象的CombinedOutput方法来执行Shell命令,并获取命令的输出结果。CombinedOutput方法会返回一个字节数组,其中存储了命令的标准输出和标准错误。 最后,我们可以将字节数组转换为字符串,并进行相应的处理,如打印输出或进一步解析。 以下是一个简单的示例代码,演示了如何在Golang中实现Shell交互的功能: ``` package main import ( "fmt" "log" "os/exec" ) func main() { cmd := exec.Command("ls", "-l") // 创建Cmd对象,执行ls -l命令 output, err := cmd.CombinedOutput() // 执行命令并获取输出结果 if err != nil { log.Fatal(err) // 如果执行命令出错,打印错误信息并退出 } fmt.Println(string(output)) // 将字节数组转换为字符串并打印输出 } ``` 以上代码会执行`ls -l`命令,并将结果打印到控制台。 需要注意的是,在使用Golang执行Shell命令时,需要保证可执行的命令位于环境变量`$PATH`所指定的路径中,否则需要指定完整的命令路径。示例中的`ls`命令是一个常见的Shell命令,因此不需要指定路径。 总结来说,通过使用os/exec包,我们可以在Golang程序中实现Shell交互的功能,从而执行Shell命令,并获取其输出结果。 ### 回答3: Go语言本身并不提供直接的Shell交互功能,但我们可以使用一些第三方库来实现类似的功能。 一个常用的库是“os/exec”,它允许我们执行外部 Shell 命令并与其进行交互。下面是一个简单的示例代码: ```go package main import ( "bufio" "fmt" "os" "os/exec" ) func main() { // 创建一个命令对象 cmd := exec.Command("/bin/sh") // 获取命令的标准输入和输出管道 stdin, _ := cmd.StdinPipe() stdout, _ := cmd.StdoutPipe() // 启动命令 cmd.Start() // 准备一个输入读取器,用于读取用户输入 reader := bufio.NewReader(os.Stdin) for { // 读取用户输入 input, _ := reader.ReadString('\n') // 将用户输入写入命令的标准输入管道 stdin.Write([]byte(input)) // 读取命令的标准输出 output := make([]byte, 1024) stdout.Read(output) // 打印输出结果 fmt.Println(string(output)) } } ``` 这段代码会启动一个新的Shell,并不断读取用户的输入并将其发送给Shell的标准输入,然后读取Shell的标准输出并打印出来。 请注意,这里的示例代码没有处理错误情况,为了简单起见,省略了错误处理部分。在实际应用中,我们应该对错误进行适当处理。 希望这个示例能够帮助你实现Go语言下的Shell交互功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值