交互:我们发出指令控制程序的运行,程序在接收到指令之后按照指令的效果做出对应的反应。
免交互:间接的,通过第三方的方式把指令传送给程序,不用直接下达指令。
这是命令行格式,也可以写在脚本当中。通过I/O重定向的方式将命令的列表传送给交互式程序或命令。
是标准输入的一种替代品。代替了人工的输入方式。
命令(linux的系统命令)<<标记 内容1 内容2 内容3 标记 [root@test2 opt]# wc -l << xy102 > 123 > 456 > xy102 2
1、标记可以是任意合法字符(一般不使用特殊字符,不以数字开头,通常以EOF作为默认的标记位)
2、结尾的标记一定要顶格写。且前面不能有任何字符,空格也不行。
3、结尾的标记后面也不能有任何字符,包括空格。
4、开头的标记前后的空格都会被省略掉
[root@test2 opt]# cat <>test2.txt > aaa > bbb > cccc > dddd > eof [root@test2 opt]# cat test2.txt aaa bbb cccc dddd
[root@test2 opt]# tee test3.txt<aa > bbc > ss > eof aa bbc ss [root@test2 opt]# cat test3.txt aa bbc ss
整体变量赋值
[root@test2 opt]# vim test1.txt #!/bin/bash #引入变量 var="Great! I am going to school" myvar=$(cat <标记加引号就不再往里传值
[root@test2 opt]# vim test1.txt #!/bin/bash #引入变量 var="Great! I am going to school" myvar=$(cat <<'EOF' this is mondy $var EOF ) echo $myvar [root@test2 opt]# sh test1.txt this is mondy $var免交互只对tab键
[root@test2 opt]# vim test1.txt #!/bin/bash cat <<-'EOF' test1 test2 EOF [root@test2 opt]# sh test1.txt test1 test2Expect实现免交互
用cl语言写一个工具,主要用自动化控制和测试。解决shell脚本交互问题。
转义符
\n:换行
\r:回车
\t:相当于一个tab键
\b:表示退格,删除
免交互修改密码
[root@test3 opt]# vim passwd.sh #!/usr/bin/expect #声明解释器,不再是默认的bash。必须要写 set timeout 5 #set相当于设置,timeout超时时间,expect有一个默认超时时间10秒。设置超时时间5秒 spawn passwd wbl #spawn后用来声明需要执行的命令,开启会话过程,并且跟踪后续的交互信息 expect "新的 密码:" #捕获需要执行的命令行 send "abc123\r" #输入指令代码 expect "重新输入新的 密码:" send "abc123\r" #最后结束语,结束语只能写一个 expect eof #交互指令结束之后,会退回原用户,切换回之前的用户 #interact #留在当前用户,不动 [root@test3 opt]# chmod 777 passwd.sh [root@test3 opt]# ./passwd.sh spawn passwd wbl 更改用户 wbl 的密码 。 新的 密码: 无效的密码: 密码少于 7 个字符 重新输入新的 密码: passwd:所有的身份验证令牌已经成功更新。 invalid command name "~" while executing "~ ..." (file "./passwd.sh" line 19)连接另一台主机
#!/usr/bin/expect set ip 192.168.65.22 set user root set password 123 set timeout 5 #进入命令行 spawn ssh $user@$ip expect { "yes/no" {send "yes\r";exp_continue} #捕获两次,表示该项被匹配之后继续匹配其他指定内容。类似循环continue允许继续执行 "*password" {send "$password\r"} } interact 结果 [root@test3 opt]# ./test1.sh spawn ssh root@192.168.65.22 The authenticity of host '192.168.65.22 (192.168.65.22)' can't be established. ECDSA key fingerprint is SHA256:vArlM9v0tBqTAeP9OCssdmVcDMvpAQlZkb3UPFaH0hY. ECDSA key fingerprint is MD5:28:e9:05:f9:e5:68:ce:f8:4a:e3:98:2a:1a:43:88:e4. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.65.22' (ECDSA) to the list of known hosts. root@192.168.65.22's password: Last login: Tue Jun 25 10:51:59 2024 from 192.168.65.1
免交互磁盘分区?
#免交互实现磁盘分区,分一个区,第一步要格式,第二部要实现挂载(手动), #在这个分区的挂载创建一个文件,写入内容“学习正好”,并且打印 #在一个脚本里完成
[root@test3 opt]# vim disk.sh #!/bin/bash disk=$1 /usr/bin/expect <<-EOF spawn fdisk $disk expect "命令(输入 m 获取帮助):" send "n\r" expect "Select (default p):" send "\r" expect "分区号 (1-4,默认 1):" send "\r" expect "起始 扇区 (2048-41943039,默认为 2048):" send "\r" expect "Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039) :" send "+200M\r" expect "命令(输入 m 获取帮助):" send "w\r" expect eof EOF mkfs.xfs -f /dev/sdb1 if [ $? -eq 0 ] then mkdir /opt/date mount /dev/sdb1 /opt/date file="/opt/date/date.txt" i="学习真好" cat > $file <结果
[root@test3 opt]# ./disk.sh /dev/sdb spawn fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 命令(输入 m 获取帮助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): Using default response p 分区号 (1-4,默认 1): 起始 扇区 (2048-41943039,默认为 2048): 将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+200M 分区 1 已设置为 Linux 类型,大小设为 200 MiB 命令(输入 m 获取帮助):w The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盘。 meta-data=/dev/sdb1 isize=512 agcount=4, agsize=12800 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=51200, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=855, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 学习真好1