如何在以下脚本中为“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) 我必须管理大量主机,其中只有一个用户可以从 SSH 访问(我们称他为 foo),然后必须以 root 身份登录才能执行特权命令。
Foo 用户没有任何类型的 sudo 权限,因此我被迫以 root 身份登录以执行特权命令。我实际上正在使用一个期望脚本来完成这项工作(ssh 以 foo 身份登录,通过 su 以 root 身份登录)并且我想切换到 Ansible。我知道我可以创建一个新用户并授予他 sudo 权限或基本上授予 foo sudo 权限,但是是否可以使用 Ansible 做与 expect 相同的事情?
我想以 foo 身份进行 ssh 连接,然后以 root 身份执行剧本或任何类型的临时命令。我在 Ansible 文档中没有找到任何关于此的信息,所以我在这里询问是否有人已经接受过这种审讯。
我编写了 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) 我正在尝试运行此脚本,但在修改时出现不同的错误。这是代码和输出。请帮忙。
在帖子末尾更新调试信息
#!/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) 考虑一个期望脚本,它生成一个命令并等待一系列事件。我们用它来测试软件。当超时时,我总是试图从脚本中获取失败返回值。
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 致命错误?
我想 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”,但这也不起作用。我很感激任何帮助。
以下简单期望脚本的目标是获取远程机器上的主机名
有时期望脚本无法对 $IP_ADDRESS 执行 ssh(因为远程机器不活动等)
所以在这种情况下,expect 脚本将在 10 秒后中断(超时 10),这没问题,但是......
有两种选择
在这两种情况下,expect 都会退出
但我不知道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) 如何在 Expect 中发送文件的内容?我必须以某种方式使用 cat 命令吗?如果是,如何?假设我的文件名为 1.txt。
例子:
期望“输入要发送的命令:” {send "???? \r"} ???? --> 文件 1.txt 的内容。
我有一个脚本,它从循环中的管道读取并在循环中运行一个期望脚本和一个普通的 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 中读取。