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

2024-04-26

我制作了一个 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

这是期望脚本(script.expect) 片段

#!/usr/bin/expect -f
set timeout 30
set username [lindex $argv 0]
set SPASS [lindex $argv 1]
set servername [lindex $argv 2]
set case [lindex $argv 3]
set prompt "(%|#|\\$|%\]) $"
switch $case {
    Linux {
        log_user 0
        spawn ssh -o StrictHostKeyChecking=no $username@$servername
        expect  {
            "assword:" {
                send "$SPASS\r"
                expect -re "$prompt"
            }
            expect -re "$prompt"
        }
        send "sudo su -\r"
        expect {
            "assword:" { send "$SPASS\r" }
        }
        expect -re "$prompt"
        log_user 1
        send "opcagt -status ; opctemplate -l ; cat watch.cf 2> /dev/null\r"
        expect -re "$prompt"
        log_user 0
        send "exit\r"
        expect -re "$prompt"
        log_user 1
    }

我尝试获取 bash 命令输出($?)假设如果期望脚本中的密码不正确导致登录失败,bash 命令将返回非零值,但这并没有成功。 任何建议将不胜感激。


对于期望脚本中的错误检查,有一个不错的例子http://systeminetwork.com/article/handle-errors-expect-scripts http://systeminetwork.com/article/handle-errors-expect-scripts

你应该做的是这样的:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Bash 调用的 Expect 脚本的退出状态代码 的相关文章

随机推荐

  • 使用 SlowCheetah 和 ASP.NET 网站项目进行 Web.config 转换

    我正在尝试将 SlowCheetah XML Transforms 与ASP NET Web site project 不是 ASP NET Web 应用程序项目 在 Visual Studio 2010 中 当我右键单击Web confi
  • 如何在树视图标题中“创建”和“导入”按钮 Odoo 8 附近添加按钮?

    我可以成功在表单视图标题或树视图行中添加按钮 但我想在 Odoo 8 中 创建 和 导入 按钮附近的树视图标题中添加自定义按钮 我该如何执行此操作 我找到了解决我的问题的方法 如果我使用 我会替换创建按钮project project mo
  • gnuplot 动画 2D 矢量场

    我正在尝试使用 gnuplot 制作 2D 矢量动画 我想显示一行 即一次显示一个向量 我的数据结构如下 它们x y u v 2 24448 0 270645 1 00 1 00 3 24448 0 270645 0 500 1 20 我可
  • android widget id 仅适用于当前widget

    我可以获取当前的 widgetId 吗onUpdate 的方法AppWidgetProvider 我发现很多关于发送的帖子appWidgetId在意图字段中 但我不明白在发送之前我必须在哪里获取它 我没有找到在没有配置活动的情况下仅获取当前
  • 检查一个类是否派生自泛型类

    我的项目中有一个带有派生类的通用类 public class GenericClass
  • 我们可以在密钥库中加载多个证书和密钥吗?

    我们可以在密钥库中加载多个证书和密钥吗 是否始终需要仅加载对 即证书和密钥一起 如果密钥库有多个证书和密钥 当 Java SSL 尝试作为服务器建立连接时会选择哪一个 尽管这取决于 KeyStore 类型 但通常您可以在单个存储中存储多个私
  • 如何获取图标名称的完整文件路径?

    如何从 GNOME 中的图标名称获取完整文件路径 import gtk icon theme gtk icon theme get default icon info icon theme lookup icon my icon name
  • 使用 JavaScript 以编程方式更新 Google 电子表格?

    是否可以使用 JavaScript 从网页更新 Google 电子表格 设想 1 用户登陆网页 2 JS脚本执行 修改Google Spreadsheet 如何才能做到这一点 这是可能的 尽管我发现这很困难 请参阅此处了解所有详细信息 ht
  • AngularJs - 修改输入格式的指令

    我想做以下事情 我的控制器模型中有一个日期对象 我想让用户修改它 应为用户提供两个输入字段 第一个输入字段应修改日期 另一个输入字段应修改时间 两个输入字段应适用于相同的日期模型
  • UIImage 来自 NSString 中保存的字节

    我正在尝试从实际上保存在 NSString 中的字节数组创建 UIImage 有人可以告诉我该怎么做吗 这是我想做的事情 NSString sourceString mYActualBytesAREinHERe get the bytes
  • 开始/停止图像视图旋转动画

    我有一个开始 停止按钮和一个我想要旋转的图像视图 当我按下按钮时 我希望图像开始旋转 当我再次按下按钮时 图像应该停止旋转 我目前正在使用UIView动画 但我还没有找到停止视图动画的方法 我希望图像旋转 但是当动画停止时 图像不应返回到起
  • Rubberduck UI 子菜单被禁用

    我刚刚在 Windows 10 操作系统上安装了 Rubberduck VBE 插件 v2 0 11 2453 MSIL 当我在 Excel 中打开启用宏的 Excel 工作簿并启动 VBA 编辑器时 Rubberduck 启动 但 Rub
  • Android:尝试在空对象引用上调用虚拟方法“void android.widget.ListView.setAdapter(android.widget.ListAdapter)”

    我正在尝试创建一个列表视图 其中包含另一个活动中的图片和文本 我不太专注于android编程 所以基本上就像android编程的新手一样 我在调试我的应用程序时遇到困难 请帮我 Error Caused by java lang NullP
  • CUDA 估计 2D 网格数据的每块线程数和块数

    首先我要说的是 我已经仔细阅读了所有类似的问题 确定每个块的线程和每个网格的块 https stackoverflow com questions 4391162 cuda determining threads per block blo
  • Objective C - 音频延迟估计的互相关

    我想知道是否有人知道如何执行互相关两个音频信号之间iOS 我想将接收器 我正在从麦克风接收信号 处获得的 FFT 窗口与发射器处 正在播放音轨 处的 FFT 窗口对齐 即确保每个窗口的第一个样本 除了发射机的 同步 周期之外 也将是接收机的
  • wxPython 上的 IPython

    我一直在尝试找到一种方法 让 IPython Shell 能够在wx Frame 在库代码或 Google 中搜索 基于 wxPython 的 IPython 小部件 https www google com search q wxPyth
  • Three.js:基于图像的光照(IBL)

    I m searching to add an IBL to my scene and objects But I can t find anything on the web There are some examples with an
  • 将级联输入与 JasperReports JasperServer 4.0 的 API/Web 服务结合使用

    快速前言 我的公司实际上正在支付 Jasper 支持费用 但他们一直无法帮助我 此时 通过谷歌搜索答案只会让我找到他们网站上我自己的未答复的论坛主题 我快疯了 我在编写代码来使用 Jasper 的 Web 服务 API 处理级联输入时遇到了
  • 如何在Python中像Flask一样使用Klein接收上传的文件

    在搭建Flask服务器时 我们可以尝试接收用户上传的文件 imagefile flask request files imagefile filename str datetime datetime now replace werkzeug
  • 从 Bash 调用的 Expect 脚本的退出状态代码

    我制作了一个 Bash 脚本 它使用 Expect 脚本来自动进行 ssh 登录 该脚本连接到多个服务器并运行一些命令 bash 脚本会提示输入一次登录凭据 我想合并一个功能 其中如果第一个服务器登录失败 脚本将终止 以避免脚本检查下一个服