• shell之免交互


    免交互
    交互:发出指令控制指令的运行,程序再接收到指令的效果做出对应的反应。
    免交互:间接的,通过第三方的方式把指令传送给程序,不用直接的下达指令
    Hhere Document 免交互
    这是命令行格式,也可以写在脚本当中。通过I/O重定向的方式将命令传送给交互式程序或指令
    是标准输入的一种替代品。代替了人工的输入方式。
    语法格式:
    命令(Linux的系统命令) <<标记
    内容1
    内容2
    内容3
    标记
    注意事项:
    1、标记可以是任意合法字符(一般不用特殊字符,不以数字开头,通常以EOF作为默认的标记位)
    2、结尾的标记一定要顶格写,且前面不能有任何字符,空格也不行
    3、结尾的标记后面也不能有任何字符,包括空格
    4、开头的标记前后的空格都会被省略

    read i << EOF
    > 22
    > EOF
    

    在这里插入图片描述

    cat <<EOF>>test2.txt
    > 123
    > 456
    > 789
    > EOF
    

    在这里插入图片描述

    tee test3.txt <<EOF
    > 1
    > 2
    > 1
    > 2
    > EOF
    

    在这里插入图片描述

    vim mjh.sh
    #!/bin/bash
    #引入变量
    file="test1.sh"
    i=school
    cat > $file <<EOF
    i am going to $i
    EOF
    sh mjh.sh
    cat test1.sh
    

    在这里插入图片描述

    在这里插入图片描述

    #!/bin/bash
    #整体变量赋值
    var="good!"
    myvar=$(cat <<EOF	
    #myvar=$(cat <<'EOF' 不向文件内传输 
    this school is beautiful
    $var
    EOF
    )
    echo $myvar
    

    在这里插入图片描述

    Expect实现免交互
    用tcl语言写的一个工具,主要用自动化控制和测试。解决shell脚本交互的问题。
    yum install -y expect
    转义符
    \n:换行
    \r:回车
    \t:相当于一个tab键
    \b:backspace表示退格,删除

    vim passwd.sh
    #!/usr/bin/expect 
    set timeout 5
    #set相当于设置,timeout超时时间,expect有一个默认的超时时间10s。设置超时时间5s
    #set也可以作为设置变量
    spawn passwd dn
    #spawn后面用来声明需要执行的命令,开启会话过程,并且跟踪后续的交互信息。
    expect "新的密码:"
    #捕获需要执行的命令行,只要能够捕获即可,不需要完整的,可以用*代表所有
    send "123\r"
    #输入指令代码
    expect "重新输入新的密码"
    send "123\r"
    #最后一定要有结束语,结束语只能写一个
    expect eof
    #交互指令结束以后,会退回原用户,切换回之前的用户
    interact
    #留在当前用户不会变
    chmod 777 passwd.sh
    ./passwd.sh
    

    在这里插入图片描述

    在这里插入图片描述

    vim su.sh
    #!/usr/bin/expect
    set timeout 5
    #传参的方式来表示
    set username [lindex $argv 0]
    set password [lindex $argv 1]
    #这种方式就是位置变量
    #开始追踪
    spawn su - $username
    #免交互开始执行
    expect "密码"
    send "$password\r"
    #继续捕获
    expect "~]$"
    send_user "ok"
    #sed_user = echo 打印指定内容
    #结束语
    interact	#留在当前用户不会变
    chmod 777 su.sh
    ./su.sh 用户 密码
    

    在这里插入图片描述

    在这里插入图片描述

    嵌入执行模式,在shell中加入expect,涉及到环境切换的场景不建议使用嵌套。
    ssh su不适合使用嵌入模式

    #!/bin/bash
    user=$1
    password=$2
    #非交互命令,使用shell
    useradd $user
    #嵌入免交互
    /usr/bin/expect <<-EOF
    spawn passwd $user
    expect "新的*"
    send "$password\r"
    expect "重新*"
    send "$password\r"
    expect eof
    EOF
    

    在这里插入图片描述

    在这里插入图片描述

    #!/usr/bin/expect
    set ip 192.168.233.10
    set user root
    set password 123
    set timeout 5
    #进入命令行交互
    spawn ssh $user@$ip
    expect {
    "yes/no" {send "yes\r";exp_continue}
    #这里捕获两次,表示该项被匹配之后,继续匹配其他的指定内容。类似于循环的continue。允许expect语句继续向下执行。
    "password" {send "$password\r"}
    }
    interact
    

    在这里插入图片描述

    在这里插入图片描述

    #!/usr/bin/expect
    set timeout 5
    set hostname [lindex $argv 0]
    set password [lindex $argv 1]
    #进入命令格式
    spawn ssh $hostname
    expect {
    "No route to host" {send_user "主机名/ip有误\n"}
    "Connection refusedi" {send_user "ssh连接拒绝\n"}
    "(yes/no)" {send "yes\r";exp_continue}
    "password" {send "$password\r"}
    }
    interact
    

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    博弈论——连续产量古诺模型
    Python读取NC格式数据绘制水汽通量等值线和和流场
    RoboTAP:由 Google DeepMind 开发的一款机器人操作系统
    会员管理有哪些功能呢?
    恶意代码防范技术笔记(四)
    salesforce零基础学习(一百二十六) Picklist Value Set 优缺点和使用探讨
    TS中null和undefined特殊性
    Leetcode刷题详解——四数之和
    微服务与中间件系列——容器技术Docker
    第二章 Servlet生命周期 ② 代码
  • 原文地址:https://blog.csdn.net/gjw01/article/details/139964152