简单的 expect else 脚本

Simple expect else script

我正在尝试 运行 一个命令并期待一个输出,我已经准备好了,但我似乎无法获得正确的语法,如果我不明白该怎么做预期输出。

#!/usr/bin/expect -f
set timeout -1
spawn ./container_check
expect -- "*wpa_supplicant-udmpro:v1.0*"
send -- "exit\r"
else -- "podman container start wpa_supplicant-udmpro\r"
expect eof

我希望脚本在看到 wpa_supplicant 响应时退出,但我也希望它在 运行 "podman container start wpa_supplicant-udmpro" 没有看到响应时退出,但我似乎无法获得它这样做。

#!/usr/bin/expect -f
set timeout -1
spawn ./container_check
if [ expect "*wpa_supplicant-udmpro:v1.0*" ];
    then { send "exit\r"; }
else { send "podman container start wpa_supplicant-udmpro\r"; }
expect eof
fi

又一次尝试,我不知道我在做什么哈哈

我感觉"podman"命令应该发给OS,而不是"container_check"程序。如果为真,那么也许这就是您所需要的:

如果 "container_check" 退出非零或向 stderr 发出任何内容,exec 将出错并且需要被捕获:

#!/usr/bin/expect -f
if {[catch {exec ./container_check 2>@1} check_output] != 0} {
    # a non-zero exit status: do we care?
}
if {![string match "*wpa_supplicant-udmpro:v1.0*" $check_output]} {
    exec podman container start wpa_supplicant-udmpro
}

参考:exec, string

如果container_check程序真的需要交互,那我就错了。


由于您使用的是 sshpass,因此您无需与 ssh 进程进行交互:expect 是这项工作的错误工具。坚持使用简单的 bash 脚本。

#!/bin/bash
doSsh() {
    sshpass -p "password" ssh -o StrictHostKeyChecking=no username@ipaddress "$@"
}

if [[ "$( doSsh docker container ls )" != *"wpa_supplicant-udmpro:v1.0"* ]]; then
    doSsh podman container start wpa_supplicant-udmpro
fi