V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Number13
V2EX  ›  Linux

Linux 自动化大神看过来,求助啊

  •  
  •   Number13 · 2020-09-10 10:49:16 +08:00 · 3119 次点击
    这是一个创建于 1539 天前的主题,其中的信息可能已经有所发展或是发生改变。

    expect 使用方式求助

    我想要判断执行程序的输出,是否有我指定的字符串怎么搞啊
    比如
    P1 程序执行后输出有 两种情况 情况 a:回显字符串中包含 aaaaa 情况 b: 回显字符串中包含 bbbbb
    现在想判断 P1 程序执行后 如果是情况 a 就 执行 aCommandLine 情况 b 就 执行 bCommandLine
    伪代码如下 :

    if {expect "aaaa"} {
    expect "aaaa" { send "aCommandLine"}
    } else if { expect "bbbb"} {
    expect "bbbb" { send "bCommandLine"}
    }

    12 条回复    2020-09-10 18:04:11 +08:00
    kaikai5601
        1
    kaikai5601  
       2020-09-10 10:57:47 +08:00
    你把输出传到一个变量里面,然后在判断变量
    Number13
        2
    Number13  
    OP
       2020-09-10 11:05:04 +08:00
    @kaikai5601 怎么将回显的字符串存到变量啊 大佬
    yorks
        3
    yorks  
       2020-09-10 11:37:59 +08:00
    ret=`P1`
    或者
    ret=$(p1)
    nuk
        4
    nuk  
       2020-09-10 11:52:32 +08:00
    出售《 TCL/TK 入门经典》
    ungrown
        5
    ungrown  
       2020-09-10 13:55:28 +08:00
    不如用 python
    subprocess 直接抓进程的 stdout stderr
    然后 if elif else
    fcitx
        6
    fcitx  
       2020-09-10 14:11:25 +08:00
    我很菜,但是我不明白为什么要 expect 放到 if 里面?
    难道不是:

    expect "aaaa" {
    send "aCommandLine"
    }
    expect "bbbb" {
    send "bCommandLine"
    }
    sleepm
        7
    sleepm  
       2020-09-10 14:15:01 +08:00
    参考 https://gist.github.com/prabirshrestha/3080525

    UNAME=$(uname)

    if [ "$UNAME" == "Linux" ] ; then
    echo "Linux"
    fi
    ly4572615
        8
    ly4572615  
       2020-09-10 14:32:57 +08:00
    我完全没有用过 expect,直接到了 ansible 时代
    wangyzj
        9
    wangyzj  
       2020-09-10 14:49:40 +08:00
    ```
    #!/bin/bash
    auto_login_ssh () {
    expect -c "set timeout 6;
    spawn -noecho scp -o StrictHostKeyChecking=no /home/appadmin/.ssh/id_rsa.pub $2@$3:/home/$2/.ssh/authorized_keys;
    expect *assword:*;
    send -- $1\r;
    expect *id_rsa.pub*;
    sleep 3;
    expect *denied*;
    exit;
    interact;";
    }
    auto_login_ssh $1 $2 $3
    ```

    供参考
    Number13
        10
    Number13  
    OP
       2020-09-10 17:53:41 +08:00
    @fcitx 或许你这个方法是对的,我最后也是采用这种方法
    Number13
        11
    Number13  
    OP
       2020-09-10 17:55:34 +08:00
    感谢各位,结帖了,各位提供的是 shell + expect 我指的是 纯 expect 脚本(本人问题描述有问题) ,解决方法也是和 6L 的一样的方式,所以感谢各位大佬
    lrvy
        12
    lrvy  
       2020-09-10 18:04:11 +08:00
    之前用 expect 写过登陆堡垒机的脚本,可以参考下:

    #!/usr/bin/expect -f
    set timeout 30

    # 登陆堡垒机
    spawn ssh op

    # 选择 Group
    expect "group:"
    sleep .1
    send "1\r"

    # 选择 Server
    expect "server:"
    sleep .1
    send "1\r"

    # 提权
    expect "login:"
    sleep .1
    send "sudo -s\r"
    sleep .1

    # ssh server
    send "ssh [lindex $argv 0]\r"
    sleep .1
    interact
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1023 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 20:53 · PVG 04:53 · LAX 12:53 · JFK 15:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.