Shell 编程之免交互

一、Here Document

语法格式:

命令 << 标记

......

......

标记

1.用wc -l的命令统计输入的文字的行数

复制代码
[root@localhost ~]# wc -l <<EOF
> aaa
> bbb
> ccc
> EOF
3

备注:
显示行数。

2.整体赋值给变量,通过echo打印出来

复制代码
[root@localhost ~]# vim aaa.sh
a="很高兴认识你"
b=$(cat <<EOF
你好,
$a
EOF
)
echo $b
[root@localhost ~]# bash ccc.sh
你好, 很高兴认识你

备注:
你好, a EOF在使用 tab键时,b=(cat <<EOF要改写成b=$(cat <<-EOF

3. 添加注释符 #,多行注释

复制代码
[root@localhost ~]# vim ddd.sh
echo 11
:<<EOF
echo 22
echo 33
EOF
echo 44
​​​​​​​[root@localhost ~]# bash ddd.sh   
11
44

备注:
:表示什么命令都不做的空命令

二、expect

1.基础命令

expect 建立在TCL语言基础之上的一个工具,需要一些交互任务自动完成,解决交互的相关问题。

(1)expect

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

(2) send 发送字符串,用户输入,无法自动换行,+r回车

(3) spawn 开起会话,后面跟系统命令,启动进程

(4) expect eof 结束符 等待执行结束

(5) interact 结束交互,但依旧停留在目标终端,不会返回原始终端。

2.ssh无交互登录到远程服务器

复制代码
[root@localhost ~]# yum -y install expect
[root@localhost ~]# vim eee.sh
#!/usr/bin/expect
spawn ssh 192.168.10.102
expect {
"*yes/no" {send "yes\r";exp_continue}
"password:" {send "aptech\r";}
}
expect "#"
interact
[root@localhost ~]# chmod +x eee.sh
[root@localhost ~]# ./eee.sh

备注:

  • #!/usr/bin/expect 这里需要用expect自己的解释器,注意不要写成bash否则无法识别。
  • spawn ssh root@192.168.100.102 开启一个程序,这个程序是ssh远程登录。
  • "*yes/no" {send "yes\r"; exp_continue} 当提示符中出现yes/no的时候,自动发送一个yes字符。
  • "password: " { send "aptech\r"; } 当出现password的时候,就会向程序发送密码,默认是不换行的,所以需要\r回车换行,多个条件需要大括号括起来。
  • interact 需要继续交互,不要用expect eof,否则会直接退出远程服务器。

3. 对方服务器上进行一下操作后再退出可执行以下脚本

复制代码
[root@localhost ~]# vim eee.sh
#!/usr/bin/expect
spawn ssh 192.168.10.102
expect {
"*yes/no" {send "yes\r";exp_continue}
"password:" {send "aptech\r";}
}
expect "#"
send "ifconfig ens33\r"
send "exit\r"
expect eof
[root@localhost ~]# chmod +x eee.sh
[root@localhost ~]# ./eee.sh

备注:

expect "#" //当捕获到#的时候
send "ls \r" //执行ls命令
send "ifconfig ens33 \r" //执行ifconfig ens33命令
send "exit\r" //执行完exit退出登陆
expect eof //不需要进行交互了,意味着结束expect程序

4. 创建用户并设置密码

复制代码
[root@localhost ~]# vim fff.sh
#!/bin/bash
user=$1
password=$2
useradd $user
expect<<EOF
spawn passwd $user
epect "New password:"
send "${password}\r"

expect "Retry new password:"
send "${password}\r"
expect eof 
EOF
[root@localhost ~]# cat /etc/shadow

5. ssh远程自动登录

102主机服务器

复制代码
​​​​​​​[root@localhost ~]# yum -y install vsftpd
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl start vsftpd

101客户端

复制代码
#!/usr/bin/expect
spawn ftp 192.168.10.102
expect "Name"
send "ftp\r"
expect "Password:"
send "\r"
expect "ftp>"
send "exit\r"
expect eof
[root@localhost ~]# chmod +x hhh.sh 
[root@localhost ~]# ./hhh.sh 
相关推荐
AlfredZhao13 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户97183563346619 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪21 小时前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
Inhand陈工2 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理