首页 > 系统相关 >shell脚本之免交互expect

shell脚本之免交互expect

时间:2023-08-17 19:45:54浏览次数:38  
标签:shell 之免 192.168 expect student 8.106 root localhost

目录

1. 多行重定向

cat <<EOF #打印在屏幕上

cat <<a.txt #不打印在屏幕上

[root@localhost ~]#cat <<EOF
> HELLO
> HI
> OK
> EOF
HELLO
HI
OK
[root@localhost ~]#cat <<EOF >test  #传给test
HELLO
HI
OK
EOF

[root@localhost ~]#cat test   #查看test
HELLO
HI
OK

2. Expect

  • 定义:是建立在tcl(tool command language)语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互的相关问题

  • Expect概述(与ssh相互配合使用)

    • 建立在tcl之上的工具
    • 用于进行自动化控制和测试
    • 解决shell脚本中交互相关的问题
  • 基本命令

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

    • 向进程发送字符串,用于模拟用户的输入
    • 该命令不能自动回车换行,一般要加\r(回车)
  • set

    • 设置超时时间,过期则继续执行后续指令
    • 单位是秒
    • timeout -1表示永不超时
    • 默认情况下,timeout是10秒
  • exp_continue

    • 允许expect继续向下执行指令
  • send_user

    • 回显命令,相当于echo

基本命令:

#脚本解释器
#!/usr/bin/expect(不用.sh结尾)

#spawn 后面通常跟一个Linux执行命令,表示开启一个会话、进程,并跟踪后续交互信息

例:spawn ssh 192.168.8.8

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

#send
向进程发送字符串,用于模拟用户的输入:该命令不能自动回车换行,一般要加 \r (回车) 或者\n 

```bash
#!/usr/bin/expect

#设置超时时间
set timeout 5

#参数传入
set hostname  [lindex $argv 0]  
#hostname=$1

set password  [lindex $argv 1] 
#password=$2
[root@localhost ~]#rpm -q expect   #先查看是否安装expect,没有安装需要先安装(yum install expect -y)
expect-5.45-14.el7_1.x86_64

[root@localhost ~]#rpm -q tcl
tcl-8.5.13-8.el7.x86_64

[root@localhost ~]#vim test
#!/usr/bin/expect
spawn ssh 192.168.8.106    #启动命令

expect {       #捕捉spawn启动的进程的输出
    "yes/no" { send "yes\r"; exp_continue }  #捕捉yes或no,exp continue代表继续捕捉
    "password" { send "123123\r" }    #继续捕捉

}

#expect eof    #代表结束,结束返回之前终端
interact       #代表结束,留在远程终端

[root@localhost ~]#chmod +x test


[root@localhost ~]#./test     #执行脚本
spawn ssh 192.168.8.106
The authenticity of host '192.168.8.106 (192.168.8.106)' can't be established.
ECDSA key fingerprint is SHA256:e+J0VzcMDN/wqEMfgMwrXc+Gef7K/KjlHOIBeDyWFeI.
ECDSA key fingerprint is MD5:df:f7:b3:3f:f6:0e:64:6a:95:db:a7:09:a0:18:89:ee.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.8.106' (ECDSA) to the list of known hosts.
[email protected]'s password: 
Last login: Tue Aug 15 09:12:01 2023 from 192.168.8.1
[root@localhost ~]#
[root@localhost ~]#exit
登出
Connection to 192.168.8.106 closed.
[root@localhost ~]#

[root@localhost ~]#vim /data/test
#!/usr/bin/expect
set hostname [ lindex $argv 0 ]

spawn ssh $hostname

expect {
    "yes/no" { send "yes\r";exp_continue }
    "password" { send "123123\r" }
}

#expect eof
interact

[root@localhost ~]#chmod +x /data/test
[root@localhost ~]#/data/test 192.168.8.106
spawn ssh 192.168.8.106
The authenticity of host '192.168.8.106 (192.168.8.106)' can't be established.
ECDSA key fingerprint is SHA256:e+J0VzcMDN/wqEMfgMwrXc+Gef7K/KjlHOIBeDyWFeI.
ECDSA key fingerprint is MD5:df:f7:b3:3f:f6:0e:64:6a:95:db:a7:09:a0:18:89:ee.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.8.106' (ECDSA) to the list of known hosts.
[email protected]'s password: 
Last login: Thu Aug 17 17:50:25 2023
[root@localhost ~]#exit
登出
Connection to 192.168.8.106 closed.


[root@localhost ~]#vim test.sh
#!/bin/bash
hostname=$1
password=$2

/usr/bin/expect <<EOF

spawn ssh root@$hostname

expect {
        "(yes/no)"
        {send "yes\r";exp_continue}
        "*password"
        {send "$password\r"}
}
expect "*]#"   #只要出现以]#结尾的就新建用户zhangsan
send "useradd zhangsan\r"
expect eof
EOF

[root@localhost ~]#bash test.sh 192.168.8.106 123123
spawn ssh [email protected]
[email protected]'s password: 
Last login: Thu Aug 17 18:51:50 2023 from 192.168.8.100
[root@localhost ~]#useradd zhangsan
[root@localhost ~]#


[root@localhost ~]#id zhangsan
uid=1001(zhangsan) gid=1001(zhangsan) 组=1001(zhangsan)

#!/bin/bash
password="123123"

hostlist="
192.168.8.106
192.168.8.101
"

for i in $hostlist
do
/usr/bin/expect <<EOF

spawn ssh root@$i

expect {
        "(yes/no)"
        {send "yes\r";exp_continue}
        "*password"
        {send "$password\r"}
}
expect "*]#"
send "useradd zhangsan\r"
expect eof
EOF
done

3. awk数组

[root@localhost ~]#awk 'BEGIN{student[1]="TZONG";student[2]="YZONG";student[3]="IZONG";for(i in student){print i"---->"student[i]}}'
1---->TZONG
2---->YZONG
3---->IZONG

[root@localhost ~]#awk 'BEGIN{student["a"]="TZONG";student["b"]="YZONG";student["c"]="IZONG";for(i in student){print i"---->"student[i]}}'
a---->TZONG
b---->YZONG
c---->IZONG
[root@localhost ~]#awk 'BEGIN{student["aa"]="TZONG";student["b"]="YZONG";student["c"]="IZONG";for(i in student){print i"---->"student[i]}}'    #顺序可以变化
b---->YZONG
c---->IZONG
aa---->TZONG

4. 去除重复行实例

[root@localhost ~]#vim test
[root@localhost ~]#cat test
abc
def
ghi
abc
ghi
def

afa
ghi
[root@localhost ~]#awk '!a[$0]++' test   #输出不重复的行
abc
def
ghi

afa

标签:shell,之免,192.168,expect,student,8.106,root,localhost
From: https://www.cnblogs.com/LJ69/p/17638094.html

相关文章

  • 在ubuntu中半自动安装搜狗输入法的shell脚本
    总而言之就是用脚本实现了一遍搜狗官网教程中的内容,脚本仅仅在虚拟机环境的ubuntu22中对sogoupinyin_4.2.1.145_amd64.deb测试过,不保证在其他地方还能不能正常运行。脚本启动需要用sudo命令以管理员权限执行,脚本执行完毕并重启电脑后,按Ctrl+空格键调出输入法,按Shift键切换中......
  • PowerShell Deep Drive 2-正则审查O365安装日志
    PowerShellDeepDrive2-正则审查O365安装日志前言最近遇到一个问题,在安装O365客户端的时候,遇到安装失败的情况,需要检查O365的安装日志,确定问题。在Office365(现在称为Microsoft365)的安装过程中,系统会生成安装日志以记录安装操作的详细信息。这些日志对于排查安装问题、分析错......
  • PowerShell Deep Drive 1-禁用Windows更新服务
    防挨打Windows更新服务的必要性在以下几个方面得到超级可爱的体现哦~(。♥‿♥。)安全性:Windows更新服务是守护计算机系统安全的关键宝宝哦!微软定期发布安全补丁和更新,修修补补已知漏洞、填填系统安全缺口,......
  • xshell 右键粘贴
    打开xshell,选择【工具】-【选项】-【键盘和鼠标】,[向右按钮]改为[粘贴剪贴板内容],下面勾选将选定的文本自动复制的剪贴板即可。......
  • 获取shell脚本所处路径
    WORK_DIR=$(cd$(dirname$0);pwd)WORK_DIR:变量,后续可用;$(dirname$0):获取shell脚本所处的文件夹路径;cd$(dirname$0):切换到shell脚本所处的文件夹;cd$(dirname$0);pwd:切换到shell脚本所处的文件夹后再执行pwd;为什么不直接WORK_DIR=$(pwd)因为不能确定执......
  • Linux-shell常用命令
    1.$的使用echo"$0"打印当前文件名称echo"$1"打印当前文件后的第一个字符串echo"$2"打印当前文件后的第二个字符串echo"$*"打印当前文件后的所有字符串echo"$#"打印当前文件后的字符串个数2.""/''/``的区别""会识别$[]或者$(())中的内容并输出''直......
  • spring注入bean错误-Bean named 'abc' is expected to be of type 'AAA' but was actu
    先看如下两个注入到spring容器中的bean,一个是UserNewManager,一个是UserManager。@ServicepublicclassUserNewManager{publicvoiddoSomething(){}}@ServicepublicclassUserManager{...}再看下面的testcase,利用@Resource注解来注入bean。@......
  • shell脚本for循环、while循环、until循环
    1.AWK在Linux/UNIX系统中,awk是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。而awk比较倾向于将一行分成多个字段然后进行处理。AWK信息的读入也是逐行.指定的匹配模式进行查找,对符合条件的内容进行格式化输出或......
  • 用shell脚本设计的『扫雷』
    不知道为什么,这个脚本和CentOS7不兼容。载入脚本后,用WASD键控制光标移动,按空格挖开地块,挖到的数字是地块周围的地雷数量,挖到地雷后游戏失败;按F标记有地雷的地块,按E表示可能有地雷。已挖开的地块无法被标记。将所有地雷标记完毕后游戏胜利。按Q键退出游戏。无论如何退出游戏,脚......
  • HDFS shell 常用命令
    创建多级目录(-p):hadoopfs-mkdir-p/test/a/b 展示目录:hadoopfs-ls/ 递归展示:hadoopfs-ls-R/ 从HDFS上下载文件到本地:hadoopfs-get/test/a/b/h.txthadoopfs-copyToLocal  /test/a/b/h.txt 从本地上传文件到HDFS:hadoopfs-copyFromLocalhello......