命令 << 标记linux
传入的内容shell
标记bash
注意服务器
在写入文件时,会先将变量替换为实际值,在结合cat 命令完成写入ssh
#!/bin/bash file="EOF.txt" i="school" cat > $file <<EOF this is my $i EOF cat EOF.txt
#!/bin/bash var="great! i am going to school!" myvar=$(cat <<EOF this is line 1. today is monday. $var EOF ) #) 要另起一行写,不能够写在EOF 后面 #变量要加上双引号“” ,不然内容将会输出在1行中 echo "$myvar"
#!/bin/bash var="great! i am going to school!" #在第一个标记两边加上单引号'' 便可关闭变量的替换功能 myvar=$(cat <<'EOF' this is line 1. today is monday. $var EOF ) #")" 要另起一行写,不能够写在EOF 后面 echo "$myvar"
#!/bin/bash var="great! i am going to school!" #在第一个标记前面加上"-" ,既能够抑制各行行首的TAB #注意,只是抑制TAB,而不是空格 myvar=$(cat <<-EOF this is line 1. today is monday. $var EOF ) #) 要另起一行写,不能够写在EOF 后面 echo "$myvar" ~
":"表明什么都不作的空命令。中间标记区域的内容不会被执行,会被bash忽略掉,所以可达到批量注释的效果ide
#!/bin/bash # ":" 开头的Here Document 标记内容不会被执行 : <<EOF this is line 1. today is monday. EOF echo "abcd"
创建在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题。工具
因此,须要先安装软件包 expect 和 tcl测试
yum -y install expect
this
expect 脚本中首先引入文件,代表使用的是哪个shellspa
#!/usr/bin/expect
spawn 后面一般跟一个linux 执行命令,表示会开启一个会话,启动进程,并跟踪后续交互信息
spawn passwd root
向进程发送字符串,用于模拟用户的输入;改命令不能自动回车换行,通常要加 \r (回车)或者 \n换行
expect "密码" {send "1234567\n"} #同一行send 部分要有 { }
expect "密码" send "1234567\n" #换行send 部分不须要有 { }
#expect 支持多分枝。只要匹配了其中一个状况,执行相应的send 语句后,退出相应的expect语句 expect { "密码" {send "1234567\n} "password" {send "1234567"} }
expect eof
表示交互结束,等待执行结束,退回到原用户,与spawn 对应
如:切换到root 用户,expect 脚本默认是等待10s,当执行完命令后,停留10s,而后自动切换回原用户
interact
执行完成后保持交互状态,吧控制权交给控制台,会停留在目标终端而不会退回到原终端。这个时候就能够手工操做。
interact 后的命令不起做用。好比interact 后面添加exit ,并不会退出root用户。
而若是没有interact ,则登陆完成后会退出,而不是留在远程终端上
使用interact会保持在终端而不会退回到原终端,好比切换到root用户,会一直在root用户状态下; 好比ssh到另外一服务器,会一直在目标服务器终端,而不会切回的原服务器。
# expect eof 和 interact 只能二选一
expect 默认超时时间是10 秒,经过set 命令能够设置会话超时时间。若不限制超时时间,则设置为 -1
set timeout 10
exp_continue 附加于某个 expect 判断项以后,可使该项被匹配后,还能继续匹配该 expect 判断语句内的其余项。exp_continue 相似于控制语句中的 continue 语句。表示容许 expect 继续向下执行指令
使用exp_continue 时,若是跟踪像passwd 这样的输入密码后就结束的进程的命令,expect{} 外不要再加上expect eof 。由于spawn 进程结束后会默认向expect发送eof ,会致使后面的expect eof报错
expect { "(yes/no)" {send "yes\n";exp_continue;} "*password" {set timeout 300;send "1234567";} } #判断交互输出中是否存在yes/no 或者*password 。若是匹配 yes/no 则输出yes,并再次执行判断;若是匹配*password 则输出1234567,并结束该段expect6语句
send_user 表示回显命令,至关于echo
expect 脚本口语i接受从bash 命令行传递的参数,使用 [lindex $argv n]
得到。n 从0开始,分别表示第一个,第二个...... 参数
set hostname [lindex $argv 0] set password [lindex $argv 1]
#!/usr/bin/expect #设置超时时间为5s set timeout 5 #设置第一个位置参数 set username [lindex $argv 0] #设置第二个位置参数 set password [lindex $argv 1] #开启跟踪命令 spawn su - $username #免交互执行,捕捉信息并匹配 expect "密码:" send "${password}\n" #结束符 #若是设置成expect eof 则会切换用户后,过5s,而后自动退回到原用户 interact
#!/usr/bin/expect set timeout 5 set hostname [lindex $argv 0] set password [lindex $argv 1] spawn ssh $hostname #设置多分支匹配 #ssh远程,首次登陆须要保存登陆主机信息。 expect { "NO route to host" exit "Connection refused" exit "(yes/no)" {send "yes\n" ;exp_continue} "password:" {send "$password\n"} } interact
将expect 过程融入到 shell 当中,方便执行和处理
例:建立用户并设置密码
#!/bin/bash #设置位置参数传入 #设置第一个位置参数 username=$1 #设置第二个位置参数 password=$2 #注意,/usr/bin/expect解释器不支持useradd useradd $username #使用Here Document 将expect 的输入直接交给 /usr/bin/expect 执行 /usr/bin/expect <<EOF #开启命令跟踪 spawn passwd $username #免交互执行,捕捉信息并匹配 expect "新的 密码" send "${password}\n" expect "从新输入新的 密码" send "${password}\n" #结束免交互 expect eof EOF #结尾标记