linux cpu占用率如何看
271
2022-11-03
免交互
一
1 概述
使用I/O重定向的方式将命令列表提供给交互式程序或命令,比如ftp、cat,或read命令。
HereDocument是标准输入的一种替代品,可以帮助脚木开发人员不必使用临时文件米构建输入信息,而是直接就地生产出一个文件并用作命令的标准输入。
基本语法格式:
命令<<标记
.....
.....
标记
特殊字符"<<"在标记和命令之间,这样做的目的是将命令块的输出重定向到程序或命令的
Stdin(标准输出)。标记的选择要确保不会出现在其他地方,避免出现混淆;两个标记之间的内容被当做是一个文件并用作 “命令”的标准输入。另外Here Document也可以与非交互式程序和命令一起使用。
四点注意事项:
标记可以使用任意的合法字符;
结尾的标记一定要顶格写·前面不能有任何字符:
结尾的标记后面也不能有任何字符包括空格):
开头的标记前后的空格会被省略
举例
[root@localhost ~]# cat < > hello world >EOF hello world [ root@localhost ~]# cat > name < //输入保存到文件 >liuchun > zhougang >EOF [ root0localhost ~]#cat name liuchun zhougang [ root@localhost ~]# cat >> name < //追加输入保存到文件 >liufei >EOF [root@localhost ~]# cat name liuchun zhanggang lisi [root@localhost ~]# 2 免交互常规使用 1.1通过read 命令接收输入并打印,输入值是两个EOF标记之间的部分,也就是"10",这将作为变量a的值 [ rootelocalhost~].read a < > 10 >EOF [ root@localhost~]# echo $a 10 1.2通过passwd给用广设置密码案例 1:给用户创建密码 [ root@localhost ~]#passwd zhangsan < >123456 >123456 >EOF 更改用户zhangsan的密码。 新的密码:无效的密码:密码少于8个字符 重新输入新的密码:passwd:所有的身份验证令牌已经成功更新。 2.变量设定(支持变量替换) 2.1 在写入文件时要先将变量替换成实际值,在结合cat命令完成写入 [root@localhost ~]# a=10 [root@localhost ~]# aa=$(cat < > $a > EOF > ) [root@localhost ~]# echo $aa 10 [root@localhost ~]# 案列2-支持变量替换 在写入文件时会先将变量替换成实际值,再结合cat命令完成写入 #!/ bin/bash doc_file="KY17.txt "i="KY17" cat > $doc_file < welcome to class $i EOF cat KY17.txt 2.2整体赋值给一个变量,然后通过echo 命令将变量值打印出来。 #!/bin/ bash ivar="Great! Beautyful !" myvar=$ (cat < This is Line 1. That are sun, Moon and stars. $ivar#输出时会进行变量替换 EOF ) echo $myvar 3.格式控制 3.1 关闭变量替换的功能 关闭变量替换的功能,按照字符原本的样子输出,不做任何修改或替换 关闭变量替换 [ root@localhost ~]# aa=$(cat <<'EOF' //关闭变量替换对标记加单引号,即可关闭变量替换 20 $a EOF ) #! /bin/bash i="ky17 class ' kgc=$(cat <<'EOF' #对标记加单引号,即可关闭变量替换 $i EOF ) echo $kgc 3.2去掉每行之前的TAB字符 在第一行的标记前面加‘-’,这个表示要抑制各行首TAB的作用。 [ root@localhost ~]# vim tab. sh //写一个脚本测试抑制tab键输出 #! /bin/bash cat < hello world EOF cat <<-EOF hello world EOF [ root@localhost ~]# bash tab. sh hello world hello world 4.多行注释 Bash的默认注释是"#”,该注释方法只支持单行注释,在shell脚本的工作中,"="右侧的任何字符串,bash都会将其忽略。Here Document的引入解决了多行注释的问题。 :“代表什么都不做的空命令。中间标记区域的内容不会被执行,会被bash 忽略掉,因此可达到批量注释的效果。 !/bin/ bash a=kgc :<<-EOE //多行注释以:开头的Here Document标记内容不会被执行 the second comnent. test line. echo $a EOF echo "exec string " 二 Expect 1.建立在tcl之 上的一个工具 2.用于进行自动化控制和测试 3.解决shelI脚本中交互相关的问题 Expect安装 1.挂载光盘 2.制作本地YUM源 3.执行安装命令 expect 1.判断上次输出结果中是否包含指定的字符串,如果有则立 即返回,否则就等待超时时间后返回 2.只能捕捉由spawn启动的进程的输出 3.用于接收命令执行后的输出,然后和期望的字符串匹配 send 1.向进程发送字符串,用于模拟用户的输入 2.该命令不能自动回车换行,一般要加\r (回车) spawn 1.启动进程,并跟踪后续交互信息 结束符 1.expect eof 执行自动化任务通常使用expect eof 等待执行结束 2.interact 执行完成后保持交互状态,把控制权交给控制台 set 1.设置超时时间,过期则继续执行后续指令 2.单位是秒 3.timeout -1表示永不超时 4.默认情况下,timeout是10秒 exp_ continue 1.允许expect继续向下执行指令 send_ user 1.回显命令,相当于echo 接收参数 1.Expect脚本可以接受从bash传递的参数 2.可以使用[lindex $argv n]获得 3.n从0开始,分别表示第一个,第二个,第三个...参数 基本命令: (1)脚本解释器 expect脚本中首先引入文件,表明使用的是哪一个shell。 #!/usr/bin/expect (2) spawn spawn后面通常跟- -个Linux执行命令,表示开启一个会话、启动进程,并跟踪后续交互信息。 例: spawn passwd root ( 3 ) expect 判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回;只能捕捉由spawn启动的进程的输出;用于接收命令执行后的输出,然后和期望的字符串匹配 (4)send 向进程发送字符串,用于模拟用户的输入;该命令不能自动回车换行,一般要 加\r(回车)或者\n 例: 方式- -: expect "密码" { send "abc123\r"} #同一行send部分要有{ } 方式二:| expect "密码" send "abc123\r" #换行send部分不需要有{} 方式三: expect支持多个分支 Expect #只要匹配了其中一个情况,执行相应的send语句后退出该expect语句 "密码1"{ send "abc123\r"} "密码2"{ send "123456\r"} "密码3"{ send "123123\r"} (5) 结束符expect. eof 表示交互结束,等待执行结束,退回到原用户,与spawn对应。 比如切换到root用户,expect 脚本默认的是等待10s,当执行完命令后,默认停留10s后,自动切回了原用户 interact 执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命令不起作用,比如interact后添加exit,并不会退出root用户。而如果没有interact则登录完成后会退出而不是留在远程终端上。 使用interact会保持在终端而不会退回到原终端,比如切换到root用户,会一直在root用户状态下;比如ssh到另--服务器,会一直在目标服务器终端,而不会切回的原服务器。 注意: expect eof与interact只能二选一。 (6)set expect默认的超时时间是10秒,通过set命令可以设置会话超时时间,若不限制超时时间则应设置为-1。 例: set timeout 30 ( 7) exp_ continue exp_ continue 附加于某个expect判断项之后,可以使该项被匹配后,还能继续匹配该expect-判断语句内的其他项。exp_continue类似于控制语句中的continue 语句。表示允许expect继续向下执行指令。 例如:下例将判断交互输出中是否存在yes/no或*password. 如果匹配yes/ no则输出yes 并再次执行判断;如果匹配*password则输出abc123并结束该段expect语句。. expect { “(yes/no)"{ send "yes\r"; exp_continue ; } "*password" { set t imeout 300; send "abc123\r"; } 注意:使用exp_continue时,如果跟踪像passwd这样的输入密码后就结束进程的命令,expect{ }外不要再加上expect eof,因为spawn进程结束后会默认向expect发送eof,会导致后面的expect eof执行报错 注:表示允许用户进行交互操作,一直保持会话连接 (8 ) send user send_ user表示回显命令, 相当于echo (9)接收参数 expect脚本可以接受从bash命令行传递的参数,使用[lindex $argv n]获得。其中n从0开始,分别表示第一个,第二个,第三个..参数。 例: set hostname [ lindex $argv 0] 相当于hostname=$1 set password [ lindex $argv 1] 相当于password=$2 用expect编写脚木 例1: ssh无交互登录到远程服务器 [root@sjserver ~]# vim expect.sh #!/usr/bin/expect //这里需要用expect自己的解释器,注意不要写成bash否则无法识别 spawn ssh root8192.168.100.100 //开启一个程序,这个程序是ssh远程登录 expect { //捕获内容,当出现password的时候,就会向程序发送密码,默认是不换行的,所以需要\r回车换行,多个条件需要花扩号括起来,注意格式问是圈! "password : " { send "123456\r":;} interactl/交互,否则会直接退出远程服务器 [ root@sjserver ~]#chmod +x expect.sh l/需要加执行权限 [ rootesjserver~]# ./expect.sh spawn ssh root8192.168.100.100 root@192.168.100.100's password: Last login: Mon Jul 27 23:31:00 2020 from 192.168.100.120 定义和引用变量 用set关键字定义变量,变量名和变量的值中间用空格分开,其他用法与shell脚本一致 #! /usr/ bin/ expect set user root set ip 192.168.245.211 set pass 123456 引用位置变量 #!/usr/ bin/ expect set user root set ip [lindex $argv 0]l/设置第一个位置变量为ip set pass [lindex $argv 1]//设置第二个位置变量为登陆密码 spawn ssh $user@$ip expect { "password : " { send "$pass \r";} expect "#"" send "ls\r" send "ifconfig ens33\r" send "exit\r" [root@localhost ~]# ./expect.sh 192.168.245.211 123456 //执行时需要加位置变量 还可以定义其他参数,例如超时时间,日志等 #超时时间 set timeout20 /登陆超时多少秒退出开启日志文件 log_file test. Logl /日志记录操作显示信息 log_user 1 为屏幕输出信息,o为不输出 ssh免交互登录另外一种写法 #!/usr/bin/ expect set timeout 60 log_file test . log log_user 1 set ip [ lindex $argv o] set password [ lindex $argv 1]spawn ssh roote$ { ip) expect { " ( yes/ no) " { send "yes\r" ; exp_continue} "*password" { send "Spassword\r"} interact 嵌入执行模式,将expect过程融入shell当中,方便执行和处理在shell脚本中调用expect 1、创建用户并设置用户密码例1: #!/bin/bash username=$1 useradd $username /usr/bin/expect <<-EOF spawn passwd $username expect { "密码" //注意:获取的内容和发送的内容不能在同一行否则执行不成功 { send "1234561r" ;exp_continue } ”新的密码" { send "1234561r" ; } EOF 验证结果: [ root@server ~]# . /user.sh wangwu spawn passwd wangwu 更改用户wangwu 的密码。新的密码: 无效的密码:密码少于8个字符 无效的密码:密码少于8个字符重新输入新的密码: passwd:所有的身份验证令牌己经成功更新。 #!/bin/bash user=$1 Password=$2 useradd $user expect < spawn passwd $user #开启一个进程跟踪passwd命令,expect只能捕捉该进程信息 expect"新的*" #匹配输出信息"新的*" send "$ {password} \r" #自动输入密码 expect"重新*:” #匹配输出信息"重新*" send "$ {password} \r" 手自动输入密码 expect eof; 等待结束标记 EOF 2、ssh远程到服务器 案列1 #!/ bin/ bash expect -c " /需要用expect -c调用expect程序 spawn ssh root@192.168.245.211 expect \"password: \” { send \ "123456\r\" } interact " [root@localhost ~]# vim expects.sh //不仅停留还要打些命令退出的情况 #!/bin / bash expect -c " spawn ssh roote192.168.245.211 expect \ "password: \" { send \ "123456\r\"} expect \"]#\” { send \"ifconfig\r\"} expect \"]#\"{ send \"exit\r\"} expect eof " 实现ssh自动登录 案列2 #!/usr/bin/expect set timeout 5 set hostname [ lindex $argv 0] set password [ lindex $argv 1] spawn ssh $hostname expect { "connection refused" exit #连接失败情况,比如对方ssh服务关闭 "Name or service not known" exit #找不到服务器,比如输入的IP地址不正确 "to continue"{ send "yes \r" ;exp_continue} "password: " { send " $password\r"} } interact exit 3.利用expect完成FTP登录过程 # !/usr/bin/expect -f set timeout 10 spawn ftp 192.168.8.33 expect "Name* " send "ftp \r" expect "Password: * "send " \r" expect "ftp>*" interact或 expect eof
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~