从 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 脚本的退出状态代码 的相关文章

  • 健全性检查 SSH 公钥? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我已要求用户提供他们的公共 id rsa pub ssh 密钥 然后将其放入 home theiraccount ssh authorized key
  • Bash 变量:区分大小写?

    Bash shell 脚本区分大小写吗 是可变的date与DATE 是的 它区分大小写 就像 UNIX 的其余部分一样 date and DATE是两个不同的变量 makefile and Makefile是两个不同的文件 h and H是
  • 混淆 bash 中存储的密码

    我有一个 bash 脚本 我需要编写密码才能运行程序 其他人可以看到它 有没有办法把密码写得不太明显 即使他可以在 bash 中执行相同的命令并获取密码 他也无法读取文本形式的密码 今天我这样做 PASSWORD 1234567 progr
  • 获取当前时间(以小时和分钟为单位)

    我正在尝试从系统收集信息 并且需要获取当前时间 以小时和分钟为单位 目前我有 date awk print 4 输出如下 16 18 54 怎样才能把秒数去掉呢 提供格式字符串 date H M Running man date将给出所有格
  • Grpc.Auth:无法从程序集“Grpc.Core.Api”加载类型“Grpc.Core.CallCredentials”

    Context 我正在尝试使用 Google 的 Cloud Natural Language API 我有我的服务帐户密钥 JSON 文件 并且正在尝试编写一个简单的 NET Core 应用程序 更具体地说是使用 NET Core 的 A
  • 运行玩笑测试时,Firebase 在signInAnonymously() 上抛出“auth/network-request-failed”

    我正在使用 firebase 为我的应用程序 使用 create react app 构建 编写一些测试 并且我正在尝试匿名登录我的测试数据库 但认证失败 然而 所有其他 Firebase 操作 CRUD 都工作得很好 我还可以从在浏览器中
  • Spring Security 3 以编程方式登录

    我正在使用 spring 创建一个 REST Web 服务 我需要在其中实现登录 注销功能 函数的 url 应类似于 api login 和 api logout 用户名和密码将使用 POST 方法传递 我在 REST Web 服务下面有一
  • Bash 脚本重定向不起作用,为什么? [复制]

    这个问题在这里已经有答案了 我最近在 bash 脚本中发现了意外行为 我想在解决它之前先了解它 这是一个简化的示例 bin sh SCRIPT tmp echoscript sh gt gt tmp log bin sh SCRIPT ec
  • bash 用变量值替换字符串中的变量名

    这有点奇怪 我有以下字符串 我有一个名为 REDIRECT 的变量设置为 https working MYDOMAIN blah blah 我需要将 MYDOMAIN 替换为分配给 MYDOMAIN 的变量的实际值 不确定 bash 还是
  • ssh 的 url 方案:在远程主机上调用命令

    是否有通过 ssh 调用远程主机上的命令的 url 方案 在我的用例中 我想称之为 psql c select from my table order by id 似乎有一个关于连接参数的 RFC 示例 来自https tools ietf
  • Bash 脚本:语法错误:意外的文件结尾[重复]

    这个问题在这里已经有答案了 我有以下文件 并且该文件上有 chmod a x 当我尝试运行它时 出现第 75 行 语法错误 意外的文件结尾 我的脚本有什么错误 我需要做什么来修复它 bin sh log directory for ascp
  • Unix cURL POST 使用文件中的内容到特定变量

    我已经搜索过这个答案 但没有找到任何有效或完全符合我的问题的答案 使用 Unix cURL 我需要将键 值对发布到服务器 密钥将是 MACs 换行符分隔的 MAC 地址文件的内容将是此 POST 的 VALUE 我试过了 curl d fi
  • 如何替换带引号的多单词字符串作为参数?

    我正在尝试替换包含多个带引号的单词的字符串变量作为命令的参数 因此 给出以下示例脚本 请注意 shebang 中的 x 这会导致输出被记录到 stderr bin bash x myArg hello world echo string i
  • 如何使用 awk 或 sed 将“[1.0 - 4.0]”等字符串替换为数值?

    我有一个 CSV 文件 正在通过一组 awk sed 命令进行管道传输 CSV 文件中的某些行如下所示 10368 Verizon DSL DSL NY NORTHEAST 5 4 1 1 3 0 0 384 0 768 其中第 8 列和第
  • 如何替换每行中出现的所有字符串?

    我想在以下脚本中将所有出现的 用户名 替换为 但它仅替换第一次出现的情况 ls al sed s username 这就是 sed 默认情况下的工作方式吗 提前致谢 你需要g 全局 修饰符 sed s username g
  • ASP.NET MVC 5 基于用户角色自定义 Bootstrap 导航栏

    我正在使用 ASP NET MVC 5 内置身份验证方法 我想根据用户所处的角色显示和隐藏链接 在菜单导航栏中 有人达到这个目的了吗 从哪里开始 只需将您的链接包含在 if User IsInRole SomeRole
  • Asp net Core 获取用户Windows用户名

    在ASP net CORE mvc中构建内联网 我需要获取当前用户的Windows用户名进行登录 我不需要使用Windows身份验证自动登录用户 我已经有一个自定义登录控制器来做到这一点 我只需要他的用户名 它在本地工作正常 但在 IIS
  • envsubst 不能进行就地替换吗?

    我有一个配置文件 其中包含一些 ENV VARIABLE 样式的变量 This is my file It might contain EXAMPLES of text 现在我希望将该变量替换为保存在实际环境变量中的值 所以我正在尝试这个
  • bash、zsh :声明 [*] (天哪)

    我正在使用具有以下语法的 bash 脚本 declare a THIS 这在 zsh 中似乎是非法的 我收到 未找到匹配项 THIS 错误 谁能帮我把它翻译成 zsh 吗 另外 什么是 语法是什么意思 我知道我们正在声明一个数组 但为什么要
  • -bash: gulp: 在 Mac 中找不到命令

    我尝试在 mac 中安装 gulp 如下所示 Is iMac itop npm root Users itop node modules Is iMac itop npm config set prefix usr local Is iMa

随机推荐

  • 使用 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 脚本会提示输入一次登录凭据 我想合并一个功能 其中如果第一个服务器登录失败 脚本将终止 以避免脚本检查下一个服