标签: expect

期望超时,在 Bash 脚本中

如何在以下脚本中为“expect”添加超时?我想将其设置为 120 秒。

#!/bin/bash
HOST="localhost"
USER="myuname"
PASS="mypassword"

VAR=$(expect -c "
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
expect \"\\\\$\"
send \"ls\r\"
expect -re \"$USER.*\"
send \"logout\"
")

echo "==============="
echo "$VAR"
Run Code Online (Sandbox Code Playgroud)

bash expect

14
推荐指数
2
解决办法
6万
查看次数

Ansible ssh 作为用户并执行具有 root(期望)

我必须管理大量主机,其中只有一个用户可以从 SSH 访问(我们称他为 foo),然后必须以 root 身份登录才能执行特权命令。

Foo 用户没有任何类型的 sudo 权限,因此我被迫以 root 身份登录以执行特权命令。我实际上正在使用一个期望脚本来完成这项工作(ssh 以 foo 身份登录,通过 su 以 root 身份登录)并且我想切换到 Ansible。我知道我可以创建一个新用户并授予他 sudo 权限或基本上授予 foo sudo 权限,但是是否可以使用 Ansible 做与 expect 相同的事情?

我想以 foo 身份进行 ssh 连接,然后以 root 身份执行剧本或任何类型的临时命令。我在 Ansible 文档中没有找到任何关于此的信息,所以我在这里询问是否有人已经接受过这种审讯。

root sudo expect ansible

8
推荐指数
1
解决办法
3万
查看次数

期望脚本 + 期望错过发送字符串 + 延迟问题

我编写了 active.ksh 脚本(基于expect),以便自动登录到某些 Solaris 机器并执行主机名命令(登录到虚拟 IP 以验证哪个主机名是活动机器 - 我有两个集群 solaris 机器)

问题在于expect; 期望发送密码字符串 (pass123) 并且它错过了密码问题,它仍然等待密码。

所以实际上密码(pass123)是在密码问题之后输入的。在大多数情况下,expect 脚本工作正常,但有时会错过密码。

问题示例

 ./active.ksh
 spawn ssh 10.10.18.61
 sh: /usr/local/bin/stty: not found
 This computer system, including all related equipment, networks and network devices      (specifically including Internet access),is provided only for authorized uss
 Password:        * my remark - pass123 string was missed the Password Question        pass123
 Password: 
Run Code Online (Sandbox Code Playgroud)

剧本

  #!/bin/ksh

  VIP_ADDRESS=10.10.18.61


  expect_for_verify_which_active_machine=`cat << EOF
  set timeout -1
  spawn  ssh   $VIP_ADDRESS 
  expect {
  ")?"   { send "yes\r" …
Run Code Online (Sandbox Code Playgroud)

linux solaris ssh expect shell-scripting

7
推荐指数
1
解决办法
1万
查看次数

发送预期脚本错误:执行时 Spawn id exp4 未打开

我正在尝试运行此脚本,但在修改时出现不同的错误。这是代码和输出。请帮忙。

在帖子末尾更新调试信息

    #!/bin/bash
    (( $# != 1 )) && { echo >&2 "Usage: $0 \"[COMMAND]\""; exit 1; }
    servers_addresses=(10.10.10.10 )
    for server_address in ${servers_addresses[@]}; do
    expect <<EOF
    spawn ssh -t root@$server_address "$*"
    expect -timeout 2 "Are you sure you want to continue connecting (yes/no)?" { send "yes\n" }
    expect "s password:" { send "Correct_Password\n" }
    expect "s password:" { send "Wrong_Password_22222\n" }
    expect "s password:" { send "Wrong_Password_33333\n" }
    expect eof
    EOF
    done
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

    goldberg188@Test-Server ~$ ./test.sh "sudo cat /etc/hosts" …
Run Code Online (Sandbox Code Playgroud)

linux unix shell bash expect

7
推荐指数
1
解决办法
3万
查看次数

如何检测 Expect 脚本中的超时

考虑一个期望脚本,它生成一个命令并等待一系列事件。我们用它来测试软件。当超时时,我总是试图从脚本中获取失败返回值。

spawn some-command

set timeout 10

expect "First message"
expect "Other message"
Run Code Online (Sandbox Code Playgroud)

即使超时,此脚本也始终返回 0(成功)。处理超时的唯一方法是将每个 Expect 语句转换为:

expect {
    timeout { exit 1 }
    eof     { exit 1 }
    "First message"
}
Run Code Online (Sandbox Code Playgroud)

但这很快就会变得笨拙。有任何简化吗?是否有一个期望选项会导致早期超时/ eof 致命错误?

automation automated-testing expect

7
推荐指数
1
解决办法
4116
查看次数

使用 Expect 的 SU 和运行命令

我想 su 到另一个用户,使用 expect,然后以该用户身份运行图形程序。我正在使用 kcalc 进行测试:

#!/usr/bin/expect
set timeout 20
spawn su dummy
expect "Password:"
send "PASS\r";
send "kcalc\r"
Run Code Online (Sandbox Code Playgroud)

我还尝试删除最后一行并将 su 更改为“su dummy -c kcalc”,但这也不起作用。我很感激任何帮助。

linux su bash expect

6
推荐指数
1
解决办法
7344
查看次数

如何打印期望脚本的名称?

在 bash 中,我可以这样做:

echo "这个脚本的名字是 $0"

有没有办法在期望中做类似的事情?

expect

5
推荐指数
1
解决办法
4187
查看次数

期望+如何确定是否因为超时而期望中断?

以下简单期望脚本的目标是获取远程机器上的主机

有时期望脚本无法对 $IP_ADDRESS 执行 ssh(因为远程机器不活动等)

所以在这种情况下,expect 脚本将在 10 秒后中断(超时 10),这没问题,但是......

有两种选择

  1. Expect脚本成功执行ssh,并在远程机器上执行了命令hostname
  2. 预计脚本中断,因为超时为 10 秒

在这两种情况下,expect 都会退出

  • 如果 ssh 成功,预计会在 0.5-1 秒后中断,但如果 ssh 不好,则会在 10 秒后中断

但我不知道expect脚本是否成功执行ssh?

是否可以识别超时过程?或验证期望因超时而结束?

备注我的 Linux 机器版本 - red-hat 5.1

期待脚本

 [TestLinux]# get_host_name_on_remote_machine=`cat << EOF
  > set timeout 10
  > spawn  ssh   $IP_ADDRESS
  >            expect {
  >                      ")?"   { send "yes\r"  ; exp_continue  }
  > 
  >                      word:  {send $PASS\r}
  >                   }
  > expect >  {send "hostname\r"}
  > expect >    {send exit\r}
  > expect eof …
Run Code Online (Sandbox Code Playgroud)

linux ksh tcl expect shell-scripting

5
推荐指数
1
解决办法
3337
查看次数

在 Expect 中发送文件的内容

如何在 Expect 中发送文件的内容?我必须以某种方式使用 cat 命令吗?如果是,如何?假设我的文件名为 1.txt。

例子:

期望“输入要发送的命令:” {send "???? \r"} ???? --> 文件 1.txt 的内容。

linux unix expect

5
推荐指数
1
解决办法
4507
查看次数

如何防止脚本吞下所有标准输入?

我有一个脚本,它从循环中的管道读取并在循环中运行一个期望脚本和一个普通的 shell 脚本。这两个脚本都运行 ssh 到另一台服务器以获取一段数据。例如:

cat /tmp/file |
while read a b c d
do
   s=`expect-script server1 $b`
   c=`ssh $b normal-script`
   echo $s $c
done
Run Code Online (Sandbox Code Playgroud)

即使 /tmp/file 中有很多行,脚本也会在处理第一行后退出。我怀疑预期脚本正在吞噬所有标准输入,因此当它返回时,没有任何东西可以阅读。我怎样才能避免这种情况?我不希望我调用的任何脚本从主脚本的 stdin 中读取。

ssh shell stdin expect

5
推荐指数
1
解决办法
2754
查看次数

标签 统计

expect ×10

linux ×5

bash ×3

shell ×2

shell-scripting ×2

ssh ×2

unix ×2

ansible ×1

automated-testing ×1

automation ×1

ksh ×1

root ×1

solaris ×1

stdin ×1

su ×1

sudo ×1

tcl ×1