AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题

问题[expect](server)

Martin Hope
AmelieAudet
Asked: 2022-03-31 04:49:30 +0800 CST

继续声明不能正常工作 - bash

  • 0

对于上下文,我有一个使用 ssh 的多台机器的基础设施。我们通过 ssh 在没有密码的机器上以 root 身份连接,感谢每台机器上的 authorized_keys 文件。我们定期在我们的基础设施中添加新机器。

有问题的是创建一个脚本:

  1. ping 所有机器(通过解析包含我们所有机器名称的文件)
  2. 如果 ping 成功,请在没有密码的情况下测试 ssh 连接(使用命令ssh -o BatchMode=yes $machine uname -a)
  3. 如果 ssh 不起作用并且是因为此消息:(Are you sure you want to continue connecting (yes/no)?例如,因为它是与这台机器的第一个 ssh 连接),那么使用期望脚本,发送“yes”
  4. 如果 ssh 不起作用并且是因为要求输入密码,那么使用期望脚本,发送“CTRL + C”

我的问题是这两个条件 3. 和 4. 都可能发生在一台机器上,我不知道如何在我的脚本中使用 continue 语句。

这种特定情况适用于要求“是”但之后也要求输入密码的机器。

这是脚本的样子:

for machine in `cat ${liste} | grep -v \#`
do

ping -c1 ${machine} 2>&1 >/dev/null

if [ $? -eq 0 ]
then
    echo ${machine} >> ${pingok}    
    ssh -o BatchMode=yes ${machine} uname -a &> $verifssh 2>&1    
    echo $? > ${exitcode}
    
    if grep -q "255" "$exitcode"
    then        
        cut -c 15-74 $verifssh > $verifssh2
                
        if grep "ication failed." "$verifssh2"        
        then                
            expect ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null
            
            continue 3 
                        
        elif grep "Permission denied (publickey,password,keyboard-interactive)." "$verifssh2"        
        then        
            expect ${scriptexpectknownhosts} ${machine} 2>&1 >/dev/null            
            echo "${machine}   ->  The machine asks for a password" >> "${sshnok}"           
        fi
                
    elif grep -q "0" "$exitcode"   
    then   
        echo "${machine} works with ssh"
        echo "${machine}" >> ${sshok}               
    fi
    
else
    echo "${machine}" >> "${pingnok}"     
fi

done

这是期望脚本(它处理这两种情况):

set machine [lindex $argv 0]

spawn ssh $machine

expect {
    "Are you sure you want to continue connecting (yes/no)? "  {send "yes\r";exp_continue}
    -exact "Password: " {close}
    -re $prompt {send "exit\r";close}
}

所以简而言之,我的问题是,对于要求“是”答案然后需要密码的机器,我想在${sshnok}文件中注册它们但continue不起作用。我试过continue//它仍然不想回到上一个循环continue 2。continue 3

linux scripting bash ssh expect
  • 1 个回答
  • 87 Views
Martin Hope
Walter
Asked: 2022-01-07 20:27:42 +0800 CST

使用 expect 在 Bhyve 的 FreeBSD 中自动安装 Alpine Linux

  • 1

我正在尝试在 FreeBSD 下的 vm-bhyve 中自动安装 Alpine Linux,并且预计在启动菜单超时并启动 Alpine Linux 安装后不久就会死机。

#!/usr/bin/env expect
spawn vm install -f alpine alpine.iso # shortened for brevity
expect "localhost login:"
send "root\r"
...

这会导致以下错误:

"while executing
"send "root\r"

我怀疑每当屏幕清除并开始启动时,会让人误以为程序已经完成?结果,脚本就死了。

我以前从未以这种方式编写期望,是否可以用期望来做到这一点?

我还尝试在生成启动并立即进入来宾控制台的 vm install cmd 之前设置全局超时,但这并没有改变任何内容,因此我将其从上面的脚本中排除。在同一个地方睡觉并没有帮助,它只是延迟了启动(以及随后的失败,我为睡眠设置的数量)。

编辑:我正在尝试在后台启动安装程序,休眠 30 秒,然后附加控制台。此时,Expect应该可以工作了。

expect curses
  • 1 个回答
  • 137 Views
Martin Hope
Ror
Asked: 2021-07-29 01:48:31 +0800 CST

安全重启多个远程服务器上的服务

  • 0

我需要编写一个脚本,以便我和我的同事可以在多台服务器上重新启动不同的服务。我们都使用 LDAP 连接到服务器,所以我希望我的脚本将我们的 LDAP 用户连接到服务器,然后使用 sudo 重新启动服务(我可以在每台服务器上编写一个脚本来重新启动所有需要的服务)。现在脚本只需运行类似的命令

ssh -t user@host "sudo service XXX restart" 

问题在于,对于每台服务器,脚本都会两次询问用户密码(一次用于 ssh 连接,两次用于 sudo 命令)。我的第一个猜测是使用 read -s -p 提示用户输入登录名和密码,然后使用该变量自动使用 ssh 登录。显然,Expect 是执行此操作的方法,但我没有找到在 Expect 脚本中安全地提示密码或在 bash 脚本中提示密码并在 expect 脚本中安全地传递变量的方法。

我确实查找了诸如 pssh、集群 ssh 之类的解决方案,这些解决方案似乎可以正常工作,但不适用于 sudo。我知道最好的方法是使用 ssh 密钥,但由于多个用户需要使用脚本,我想使用 LDAP 登录名/密码。

scripting security bash ssh expect
  • 1 个回答
  • 89 Views
Martin Hope
TobiM
Asked: 2021-04-24 09:28:54 +0800 CST

在变量中使用 ansible --ask-become-pass

  • 4

我需要在期望脚本中使用我的 --ask-become-pass 密码。有什么方法可以使用在变量中启动 ansible_playbook 时输入的密码?

伪代码:

# ansible-playbook --become --ask-become-pass -i testing master.yml
BECOME password: secretpassword

然后在任务中

- name: use pw variable in task
  expect:
   command: /bin/bash -c "/usr/bin/my_command"
   responses:
     Password: "{{ prompted_pass }}"

我希望在阅读“密码”提示时输入“密码”

我知道 become_user,不幸的是它对我的情况没有帮助,因为远程服务器要求输入密码 - 但它与 become_password 相同。

我尝试转储变量和环境,但找不到任何有用的东西。

谢谢,托拜厄斯

ansible expect
  • 1 个回答
  • 2722 Views
Martin Hope
Mikkel
Asked: 2016-09-27 07:36:52 +0800 CST

带有 sudo 的 Ansible“期望”模块?

  • 2

我想用 Ansible 运行安装程序脚本。安装程序脚本会提示一些响应,并且需要以 root 权限运行。

这是我的 Ansible 任务的本质:

- expect:
  become: yes
  become_method: sudo
  command: "installer.bin"
  echo: yes
  responses:
    "Choose the appropriate installation or upgrade option.": "2"
    "Where should the software be installed?": "/opt/newsoftware/" 

我原以为这会起作用,但我得到了错误

fatal: [127.0.0.1]: FAILED! => {"changed": false, "failed": true, "msg": "unsupported parameter for module: become_method"}

如果我省略“become_method”,则会收到此错误:

fatal: [127.0.0.1]: FAILED! => {"changed": false, "failed": true, "msg": "unsupported parameter for module: become"}

我的 Ansible 是 2.1.1.0 版

ansible expect
  • 1 个回答
  • 3546 Views
Martin Hope
sysfiend
Asked: 2016-04-29 03:24:43 +0800 CST

相同的脚本,相同的操作系统,相同的安装,失败

  • 0

所以我正在使用RANCID来监控一些开关,我现在正在使用clogin它来测试一些修改。

我在两台不同的计算机上工作,但它们都来自办公室。尽管它们位于不同的子网中,但它们都可以稳定telnet并ssh连接到我现在正在使用的交换机(Alcatel Omni 6248)。我已经RANCID在两台计算机上进行了默认安装并添加了所需的一切。

暂时不要考虑错误配置

所以我设法获得了一些交换机的配置,但其中两个失败了,所以我尝试修改 clogin 以便它获取每个路由器配置。经过一些更改,执行

./clogin -c "show running-config" alcatel-sw

将导致脚本登录,执行

terminal datadump

然后等待提示,直到它得到一个TIMEOUT. 在尝试修复它时,我只是决定获取默认值clogin并再次从零开始,因此我恢复了备份副本并尝试登录到CISCO交换机(与默认clogin脚本完美配合)。我执行了

./clogin -c "show running-config" cisco-sw

我得到了一个TIMEOUT,好像我在使用旧脚本一样。我检查了一下,没有,我使用的是默认的。我什至转移了我在另一台计算机上的那个(我在发送之前测试过)并再次尝试得到同样的错误。

关于这怎么可能的任何想法?

我在同一台机器上使用 CentOS 7.2,几乎都是全新安装,并且clogin一直在工作,直到我修改它,然后用备份副本替换它。

scripting networking monitoring expect rancid
  • 1 个回答
  • 57 Views
Martin Hope
jens freudenau
Asked: 2012-07-12 08:47:15 +0800 CST

在期望脚本中终止屏幕会话

  • 2

我使用 expect 脚本中的 spawn 命令开始我的屏幕连接:spawn screen /dev/...

但我不知道脚本完成后如何关闭屏幕

unix gnu-screen expect
  • 1 个回答
  • 1021 Views
Martin Hope
Eytan
Asked: 2012-05-16 00:20:20 +0800 CST

expect + 如何在 solaris 上安装 expect

  • 0

主题 - 在 solaris 上安装 expect 以编写 expect 脚本

我机器的详细信息:

uname -a SunOS 5.10 Generic_139555-08 sun4v sparc SUNW,Netra-T5220

我安装了 Solaris 机器(Solaris 10),然后我成功安装了以下软件包,以便在我的 Solaris 机器上构建预期的基础设施

但是在安装包后我收到以下错误

请告知运行 expect 需要什么?

  1)

  /usr/local/bin/expect   -version
  /usr/local/bin/expect: cannot execute

  2)

  expect
  expect: not found

如何为 Solaris 安装 expect 的示例(来自站点 - http://jibbysununix.blogspot.com/2010/01/automating-sftp-with-expect-script.html)

(我从 sun 免费软件下载了 x86packages)。tcl-8.5.3-sol10-x86-local libgcc-3.4.6-sol10-x86-local 期望-5.43.0-sol10-x86-local

   1)pkgadd -d tcl-8.5.3-sol10-x86-local

   2)pkgadd -d libgcc-3.4.6-sol10-x86-local

   3)pkgadd -d expect-5.43.0-sol10-x86-local 
solaris bash tcl shell-scripting expect
  • 2 个回答
  • 10034 Views
Martin Hope
ILikeTacos
Asked: 2012-05-11 12:05:29 +0800 CST

如何从启用 SNMP 的网络设备侦听 SNMP 陷阱?

  • 1

我刚开始在学校的网络部门工作,我被分配了一个项目来开发一个程序来侦听来自 SNMP 网络设备的陷阱。

我正在使用接入点 Cisco Aironet 1242 测试的设备,我一直在网上查看如何执行此操作,并且遇到了 unix 中的多个命令,如 snmptrapd,但我不知道如何应用此命令来创建一个程序。

我需要使用 Perl,所以我已经能够使用 Expect 登录到接入点,并启动启用模式,但是一旦进入那里,我就不知道该做什么了。我的程序必须侦听链接和链接陷阱。

我一直在阅读 AP man 条目(通过?然后<ENTER>在终端上),但我还没有看到我可以使用的东西。

任何建议将不胜感激。

另一方面,如果这个问题的格式不属于这个站点,请将其删除。我无意违反规则,因为我没有关于特定问题的问题,我的问题对于网站来说可能太宽泛了。

perl snmp access-point expect
  • 1 个回答
  • 670 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve