一.常规输入:回车、Yes/No等

        1.cat  +  文件 + 管道符


cat commend.txt | apt-get install ssh


        2.echo + 管道符


echo -e "Y" | apt-get remove ssh



echo -e 处理转义字符


        3.expect

安装:


sudo apt-get install expect


编写expect文件如:


#! /usr/bin/expect
set timeout 0
spawn apt-get remove ssh
expect "Yes or No:"
send "Y\r"
interact


1. [#! /usr/bin/expect] 

  这个跟bash shell 开头一样,是告诉系统使用那个解释器来解释脚本

  注意:这一行需要在脚本的第一行。 

2. [set timeout 0] 

  设置超时时间为0(秒)

3. [spawn sudo apt-get update]  spawn [spɔːn]

  它主要的功能是给后面的shell语句运行进程加个壳,用来传递交互指令。 

4. [expect " "] 

     意思是判断上次输出结果里是否包含”的字符串,如果有则执行下一步,否则就等待一段时间(timeout)。

5. [send "xxx\r" ] 

  这里就是发送交互信息,与手动输入相同。 命令字符串结尾加上“\r”,如果出现异常等待的状态可以核查一下。 

6. [interact] 

  执行完成后保持交互状态,把控制权从expect交会给shell,shell就可以执行spawn加壳的命令。

    没有这句的话,即使已经成功输入,也不会执行shell命令,因为控制权还是expect手里,而expect是不能解释shell命令的。

运行:


./test3.expect
expect test3.expect



root@​​type-ThinkPad-T480s:/home/type#​​ ./test3.expect
spawn apt-get remove ssh
Y
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列软件包将被【卸载】:
ssh
升级了 0 个软件包,新安装了 0 个软件包,要卸载 1 个软件包,有 8 个软件包未被升级。
解压缩后将会空出 98.3 kB 的空间。
(正在读取数据库 ... 系统当前共安装有 304178 个文件和目录。)
正在卸载 ssh (1:7.2p2-4) ...



注意后缀为.expect


        4.重定向 + 文件


apt-get install ssh < commend.txt


特殊地,当一个shell命令需要多个参数时,以echo为例,用\n来区分多个参数,例如parasoft安装时在不同阶段共需要7次交互,可以用以下命令来代替手动操作:


echo -e "1\n\n\n\n\n\n" | ./parasoft_cpptest_professional-2020.1.0.20200422B856-linux.x86_64.sh


二. 密码

1.expect


#! /usr/bin/expect
set timeout 0
spawn sudo apt-get update
#expect "Password:"
send "******\r" # your password
interact


2.EOF文本块


#! /bin/bash
sudo -S mkdir test <<EOF
****** # your password
EOF


三、终端控制

1.模拟:timeout


timeout 5 apt-get remove ssh


也适用于输入密码


(base) :~$ timeout 5 su root
密码: (base) :~$


2.杀死进程


su root &
pid=$!
kill -SIGSTOP $pid


-SINGSTOP → CTRL+Z

-SIGINT → CTRL+C

实例:docker build自动在镜像中安装parasoft及其依赖环境。

PS:若是apt-get,可以通过apt-get -y xxx来执行自动确认,而无需用echo或expect。