• 免交互 实验


    免交互

    交互:我们发出指令控制程序的运行,程序在接收到指令之后按照指令的效果做出对应的反应。

    免交互:间接的,通过第三方的方式把指令传送给程序,不用直接下达指令。

    Here document 免交互

    这是命令行格式,也可以写在脚本当中。通过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
    test2

    Expect实现免交互

    用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

  • 相关阅读:
    DyLoRA:使用动态无搜索低秩适应的预训练模型的参数有效微调
    【等保常见问题解答】等保测评机构能帮忙做等保整改吗?
    Google Earth Engine(GEE)——基于Landsat的高级植被指数 (AVI)、裸土指数 (BSI) 和冠层阴影指数 (SSI) 的计算
    Java数组—精讲篇
    C#开源、功能强大、免费的Windows系统优化工具 - Optimizer
    ros远程订阅
    【git】GitHub仓库没有 Contribution activity
    进程之理解进程的概念
    关于MySQL主从复制的数据同步延迟问题
    【网络教程】SSH通过pem文件登陆(使用密钥对登陆)
  • 原文地址:https://blog.csdn.net/2402_84844434/article/details/139963551