一.常规输入:回车、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。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐