循环提示输入另一个密码时出现问题

2024-01-24

我需要一些关于 EXPECT 脚本的帮助......

我正在尝试在访问大量主机之前自动登录,并在用户错误输入密码时进行处理。我首先获取用户名和密码,然后针对特定主机对其进行验证。如果密码无效,我想循环并再次询问用户名和密码。

我正在尝试这个:-

(省略前面几行不相关的行)

    while {1} {
            send_user "login as:- "
            expect -re "(.*)\n"
            send_user "\n"
            set user $expect_out(1,string)
            stty -echo
            send_user "password: "
            expect -re "(.*)\n"
            set password $expect_out(1,string)
            stty echo

            set host "some-box.here.there.co.uk"
            set hostname "some-box"
            set host_unknown 0
            spawn ssh $user@$host
            while {1} {
                    expect {
                            "Password:"     {send $password\n
                                            break}
                            "(yes/no)?"     {send "yes\n"}
                            "Name or service not known"     {set host_unknown 1
                                                            break}
                            }
                    }
            if {$host_unknown < 1} {

                    expect {
                            "$hostname#"    {send "exit\r"
                                            break
                                            }
                            "Password:"     {send \003
                                            expect eof
                                            close $spawn_id
                                            puts "Invalid Username or Password - try again..."
                                            }
                            }
                    } elseif {$host_unknown > 0} {

                            exit 0}
            }
    puts "dropped out of loop"

现在我可以去对很多盒子做很多事情......

当我输入有效的用户名或密码时,这工作正常,并且我的脚本会执行并执行我想要的所有其他操作,但是当我输入无效的密码时,我会得到以下信息:-

Fred@Aserver:~$ ./Ex_Test.sh 全部

登录为:- MyID

密码:spawn ssh[电子邮件受保护] /cdn-cgi/l/email-protection
密码:

密码: 用户名或密码无效 - 再试一次...
登录为:- 找不到名为“exp6”的频道

while executing  "expect -re "(.*)\n""
invoked from within  "if {[lindex $argv 1] != ""} {
    puts "Too many arguments"
    puts "Usage is:-  Ex_Test.sh  host|ALL"

} elseif {[lindex $argv 0] != ""} {

    while {1} {
    ..."
(file "./Ex_Test.sh" line 3)

它的“找不到名为“exp6”的频道”这一行确实困扰着我。

我究竟做错了什么?我正在阅读《探索期待》(Don Lines),但一无所获......


每当expect应该等待一些词,它会保存spawn_id对于那个期望过程expect_out(spawn_id).

根据您的代码,expect的spawn_id是在遇到时生成的

        expect -re "(.*)\n"

当用户输入内容并按下回车键时,它将保存expect的spawn_id。如果您在调试中使用了expect,您可能会在调试输出中看到以下内容

expect does "" (spawn_id exp0) match regular expression "(.*)\n" 

假设用户输入“Simon”,那么调试输出将是

expect: does "Simon\n" (spawn_id exp0) match regular expression "(.*)\n"? Gate "*\n"? gate=yes re=yes
expect: set expect_out(0,string) "Simon\n"
expect: set expect_out(1,string) "Simon"
expect: set expect_out(spawn_id) "exp0"
expect: set expect_out(buffer) "Simon\n"

如您所见,expect_out(spawn_id) 保存spawn_id它必须从中期望值。在这种情况下,术语exp0指向标准输入。

If spawn使用命令,然后如您所知,tcl 变量spawn_id保存对进程句柄的引用,称为生成句柄。我们可以玩玩spawn_id通过显式设置进程句柄并将其保存以供将来参考。这是一个很好的部分。

根据您的代码,当使用以下代码给出错误密码时,您将关闭 ssh 连接

close $spawn_id

通过利用spawn_id,你正在这样做,而你缺少的是设置expect的进程句柄返回到其原始参考句柄。 IE。

While {1} { 

    ###Initial state. Nothing present in spawn_id variable ######
    expect "something here"; #### Now exp0 will be created  

    ###some code here ####

    ##Spawning a process now###

    spawn ssh xyz ##At this moment, spawn_id updated

    ###doing some operations###
    ###closing ssh with some conditions###
    close $spawn_id

    ##Loop is about to end and still spawn_id has the reference to ssh process  
    ###If anything present in that, expect will assume that might be current process
    ###so, it will try to expect from that process

}

当循环第二次执行时,expect 将尝试期望来自spawn_id句柄只不过是 ssh 进程,这就是您收到错误的原因

can not find channel named "exp6" 

请注意,“exp6”只不过是 ssh 进程的生成句柄。

Update :

如果某个进程句柄可用spawn_id, then expect总是期待来自那个的命令 仅过程。

也许您可以尝试以下方法来避免这些问题。

#Some reference variable 
set expect_init_spawn_id 0

while {1} {

    if { $expect_spawn_id !=0 } {
            #when the loop enters from 2nd iteration,
            #spawn_id is explicitly set to initial 'exp0' handle
            set spawn_id $expect_init_spawn_id 
    }

    expect -re "(.*)\n"
    #Saving the init spawn id of expect process
    #And it will have the value as 'exp0'
    set expect_init_spawn_id $expect_out(spawn_id)
    spawn ssh xyz

    ##Manipulations here

    #closing ssh now
    close $spawn_id
}

这是我的观点,可能不是有效的方法。你也可以想出自己的逻辑来处理这些问题。

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

循环提示输入另一个密码时出现问题 的相关文章

  • 将 URL 转换为绝对路径

    有没有简单的方法可以将包含两字节字符的 URL 转换为绝对路径 我问的原因是我正在尝试寻找这样的资源 URL url getClass getResources getresources test txt String path url t

随机推荐

  • 从目录获取文件时排除某些文件扩展名

    How to exclude从目录获取文件时的某些文件类型 I tried var files Directory GetFiles jobDir 不过这个功能好像只能选择你想要包含的文件类型 不能排除 你应该自己过滤这些文件 你可以这样写
  • 我应该按照什么顺序包含头文件?

    我是编程新手 在我开始使用大量头文件后 头文件的主题让我陷入了困境 除此之外 我正在尝试使用预编译头 我还使用 SFML 库 因此我还必须包含那些标头 现在我有 stdafx h main cpp 然后是 A h A cpp B h B c
  • libgdx - 如何在舞台中添加背景图像?

    我正在学习 libgdx 但我陷入了困境 我在舞台中添加了一个按钮 现在我想在舞台中添加一个图像 以便该图像看起来像按钮的背景图像 我的意思是说按钮应该位于图像上 我一直在寻找教程但无法做到这一点 如何做呢 有什么帮助吗 您唯一需要做的就是
  • Nodemon 不工作:[nodemon] 由于更改而重新启动

    I use nodemon questions tagged nodemon作为节点中的开发依赖项 突然 CLI 中显示 nodemon 由于更改而重新启动 当我更改代码时 然后我已经全局安装了nodemon 但它仍然无法工作 它不适用于任
  • 如何在不使用if的情况下编写Fibonacci Java程序[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 在 int Fibonacci in
  • IE 下的脚本 onload/onerror(用于延迟加载)问题

    我正在重建我的延迟加载模块以接受异步请求 但我有一个大问题 Internet Explorer 不支持 script onload onerror 旧脚本确实全局评估了使用 ajax 同步调用读取的目标脚本源 它工作得很好 它是跨浏览器的
  • 有没有办法在 HTML5 视频上使用 DRM?

    由于 Flash 正在节节败退 我想知道是否有办法通过 DRM H264 ogg 和 WebM 保护 html5 视频 On the HTML5 上的 W3C 常见问题解答 http www w3 org html wiki FAQs Is
  • 如何在 Windows 中以编程方式更改 DNS 服务器?

    我想以编程方式更改 DNS 服务器 我不想建立DNS服务器 我只是想自动更改主备dns服务器 这项工作需要用Python来完成 您可以使用 os system 调用命令行工具来为您完成此操作 import os os system nets
  • VS2017任务运行资源管理器未找到任务

    我正在尝试在 VS 2017 内的 MVC Core 项目中设置 gulp 我有我认为有效的 gulpfile js var gulp require gulp var rimraf require rimraf var concat re
  • 在 DataBound 事件上获取绑定到 ListView 的数据

    我有一个 ListView 控件 并且已向该控件添加了一个 DataBound 事件 不知道这是否正确 我想从该事件访问绑定到该特定 ItemTemplate 的数据 这可能吗 C 解决方案 protected void listView
  • 当 contenteditable 中有多行时,替换光标前的单词

    我想替换光标之前的单词contenteditablediv 另见在文本区域或 contenteditable div 中键入 TAB 时检测最后写入的单词 https stackoverflow com questions 50794324
  • “忙碌”效果叠加

    我有一个 wpf 应用程序 它执行非常繁重的操作 其中用户需要等待应用程序 思考 我想要做的是 当应用程序的主线程正在思考时 另一个线程将禁用整个窗口并给它一种灰色的颜色 并且屏幕中间会出现一个圆形进度条 这是一个大问题 我真的不需要整个代
  • 类型“ViewController”不符合协议“UITableViewDataSource”

    很快就开始练习了 在单个 ViewController 中我试图制作一个UITableView 在故事板中 我设置了数据源和委托 我在这里收到错误 ViewController 不符合协议 UITableViewDataSource cla
  • SqlProfileProvider - 您可以在项目中使用 Profile.GetProfile() 吗?

    我正在尝试在应用程序中使用 SqlProfileProvider 但似乎无法按照我想要的方式使用它 我希望能够简单地调用这样的配置文件 Profile p Profile GetProfile naspinski p Organizatio
  • 在 Visual Studio 2010 中调试 exe

    有没有办法使用 Visual Studio 2010 通过 Shift 双击运行 exe 来调试外部 exe 通常 要在特殊模式下运行应用程序 我们必须按 Shift 键并双击 exe 但我在启动时遇到了一个错误 我想我需要添加一个命令行参
  • 如何替换cmd.exe中的百分号字符?

    在 Windows 命令提示符中 我尝试替换中的空格set string Hello World用字符串 20 天真地尝试像这样使用字符串文字 20 set string string 20 结果是HelloWorld20 尝试使用转义字符
  • Java Swing 菜单速度缓慢的解决方法

    在 Java 7 和 8 中 Swing 菜单中存在一个错误 导致在其他 X11 应用程序正在运行时通过 X11 远程运行应用程序时速度缓慢 这个问题是在 Java 7 中引入的 并且从未得到修复 有人对解决方法有任何建议吗 使用 nxcl
  • 在python3 asyncio中使用串口

    我正在尝试 但到目前为止 未能使用 python asyncio 访问串行端口 我真的很感激关于在简单的 fd 上使用新的 python 异步框架的任何提示 Cheers James 这是一个使用的工作示例pyserial异步 https
  • C# 中 CreateObject 的等效代码

    我有一个VB6代码 谁能告诉我怎么写C 这段代码如下 Set Amibroker CreateObject Broker Application Set STOCK Amibroker Stocks Add ticker Set quote
  • 循环提示输入另一个密码时出现问题

    我需要一些关于 EXPECT 脚本的帮助 我正在尝试在访问大量主机之前自动登录 并在用户错误输入密码时进行处理 我首先获取用户名和密码 然后针对特定主机对其进行验证 如果密码无效 我想循环并再次询问用户名和密码 我正在尝试这个 省略前面几行