Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Bash调用的Expect脚本的退出状态代码_Bash_Login_Ssh_Tcl_Expect - Fatal编程技术网

从Bash调用的Expect脚本的退出状态代码

从Bash调用的Expect脚本的退出状态代码,bash,login,ssh,tcl,expect,Bash,Login,Ssh,Tcl,Expect,我制作了一个Bash脚本,它使用一个expect脚本来自动化ssh登录。 bash脚本会提示输入一次登录凭据 我想加入一个功能,如果第一台服务器登录失败,脚本将终止,以避免脚本检查下一台服务器,从而导致用户帐户被锁定。如果连续3次登录失败且脚本尝试连接的服务器数超过3,则会发生帐户锁定 这是bash脚本中调用expect脚本的代码段 countu=0 for servername in $(cat $linux_host_list) do ./script.expect $LUSERNAME $

我制作了一个Bash脚本,它使用一个expect脚本来自动化ssh登录。 bash脚本会提示输入一次登录凭据

我想加入一个功能,如果第一台服务器登录失败,脚本将终止,以避免脚本检查下一台服务器,从而导致用户帐户被锁定。如果连续3次登录失败且脚本尝试连接的服务器数超过3,则会发生帐户锁定

这是bash脚本中调用expect脚本的代码段

countu=0
for servername in $(cat $linux_host_list)
do
./script.expect $LUSERNAME $LPASS $servername Linux >> linux_log_file.txt & < /dev/null
let countl=countl+1
done
我尝试获取bash命令输出(
$?
),假设如果expect脚本中的密码不正确导致登录失败,bash命令将返回非零值,但没有成功。
任何建议都将不胜感激。

您应该认真看一看。

我不太喜欢脚本和所有内容,因此我无法编写确切的步骤或脚本来证明我的想法-请原谅

我读到bash提供了一种称为退出状态的东西

退出状态是0表示真,1表示假,或任何其他状态

您可以通过执行一个命令,然后键入“echo$?”检查其退出状态来看到这一点

我的建议是,当您尝试使用ssh连接到一台服务器,但身份验证失败时,应该有一个非0的退出状态


在此处获取if-then-else循环,并检查0的状态以执行脚本,以及检查任何其他值以完全退出脚本,并显示适当的错误消息

对于expect脚本中的错误检查,在

你应该这样做:

proc do_exit {msg} {
    puts stderr $msg
    exit 1
}

switch -exact -- $case {
    Linux {
        spawn ssh ...
        expect {
            -re {assword: $} {
                send -- "$SPASS\r"
                exp_continue 
                # remain in this expect block and look for the next matching pattern
            }
            "some message about incorrect password" {
                do_exit "incorrect password"
            }
            timeout {do_exit "timed out waiting for prompt"}
            default {do_exit "something else happened"}
            -re $prompt
        }
        # ... rest of your script
    }
}
我假设您不需要知道“opcagt…”系列命令的退出状态(您只想查看watch.cf文件的内容。如果您真的在意,您需要让shell告诉您:

send -- "opcagt -status 2>&1 || echo "non-zero return from opcagt: $?"
expect {
    "non-zero return" { handle error and exit? }
    -re $prompt
}
# ... continue

您正在后台运行expect脚本(
&
),因此在继续之前无法获得第一个脚本的结果

按照编写expect脚本的方式,如果第一个密码失败,它将在第二个密码提示时超时30秒。相反,您可以执行
expect
替代操作,查看是否收到另一个
assword
提示,然后立即退出

然后将shell脚本更改为不将expect调用放在后台,而是使用
$?
捕获输出并对其进行测试。

部分:

    expect  {
        "assword:" {
            send "$SPASS\r"
            expect -re "$prompt"
        }
        expect -re "$prompt"
    }
看起来我非常怀疑。特别是,我真的希望这会导致事情变得混乱。一种更惯用的写作方式是:

    expect  {
        "assword:" {
            send "$SPASS\r"
            exp_continue
        }
        -re "$prompt"
    }

如果你读了我的问题,我说我已经尝试过($?),但没有成功。老实说,我会犹豫是否要做任何超出预期的事情。多年来,Expect一直是自动化系统任务的主要工具之一,而这些任务并不期望自动化。它做了许多其他此类工具无法比拟的事情(例如,它几乎完美地模拟tty/用户的能力)。这并不是说织物不好,因为我对它一无所知……只是Expect有一些非常大的鞋要穿。我只是建议这样做,因为织物只是为这些任务而制的。没有害处!
    expect  {
        "assword:" {
            send "$SPASS\r"
            exp_continue
        }
        -re "$prompt"
    }