我有一个充满 Linux 机器的网络。在这个网络中,我有一个用户为user1,所有机器的密码为密码。
我有以下脚本将文件放在网络所有机器中user1的主目录中。
#!/usr/bin/expect -f
# connect via scp
spawn cat /home/user1/Desktop/IPlistfile.txt | while read line do
spawn scp /home/user1/Desktop/filetobesent.txt user1@${line}:/home/user1/Desktop
#######################
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "password\r"
}
}
interact
done
Run Code Online (Sandbox Code Playgroud)
问题是我收到一条错误消息“ can't read line. No such variable”。但是,如果我直接使用 IP 地址而不是行变量,则可以传输文件。
编辑:IPlistfile.txt 包含我网络中的 IP 地址列表。每行包含一个 IP 地址。
我正在运行一个expect脚本,密码有一个$字符。外壳会寻找以下字符以扩展成某些内容并吐出no such variable。
有没有办法解决?
当我ambari-server upgrade从 bash 脚本运行命令时,在升级过程中我们遇到了问题
已经备份了 Ambari Server 数据库 [y/n] (y)?
所以我们想自动化这个过程,通过期待yes在问题出现时发送的脚本。
请建议如何ambari-server upgrade通过期望自动化
ambari-server upgrade
Using python /usr/bin/python
Upgrading ambari-server
INFO: Upgrade Ambari Server
INFO: Updating Ambari Server properties in ambari.properties
...
WARNING: Can not find ambari.properties.rpmsave file from
previous version, skipping import of settings
INFO: Updating Ambari Server properties in ambari-env.sh ...
INFO: Can not find ambari-env.sh.rpmsave file from previous
version, skipping restore of environment settings. ambari-env.sh may not
include any user customization. …Run Code Online (Sandbox Code Playgroud) 我通过 usingexpect在我的 bash 脚本中使用expect -c,但是如何将参数传递给它?
这是我尝试过的:
FILE="myFile"
HOST="myhostname"
/usr/bin/expect -c $FILE $HOST '
set FILE [lindex $argv 0];
set HOST [lindex $argv 1];
send_user "$FILE $HOST"
spawn scp -r -o StrictHostKeyChecking=no $FILE root@$HOST:/tmp/
expect "assword:"
send "password\r"
interact'
Run Code Online (Sandbox Code Playgroud)
如果我创建一个单独的具有相同内容的期望脚本,但在 bash 中像这样调用它:
myScript.expect $FILE $HOST
Run Code Online (Sandbox Code Playgroud)
它有效,但我如何做同样的事情但使用该expect -c选项?
更新:
还试过:
/usr/bin/expect -c '
set FILE [lindex $argv 0];
set HOST [lindex $argv 1];
send_user "$FILE $HOST"
spawn scp -r -o StrictHostKeyChecking=no $FILE root@$HOST:/tmp/
expect "assword:"
send …Run Code Online (Sandbox Code Playgroud) 我有一个脚本叫做setup.sh:
. install.sh && . tolinux.sh && . startn.sh && . startm.sh
Run Code Online (Sandbox Code Playgroud)
这是install.sh:
yes | sudo apt-get update
yes | sudo apt-get install default-jdk
yes | sudo apt-get install expect
sudo apt-get install lftp
cd /usr/local/src/
wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
tar xf noip-duc-linux.tar.gz
cd noip-2.1.9-1/
/usr/bin/expect <<END_SCRIPT
spawn make install
expect "Please enter the login/email*" { send "Username\r" }
expect "Please enter the password for user*" { send "password\r" }
expect "Please enter an update interval*" { send …Run Code Online (Sandbox Code Playgroud) 我在expect脚本中有以下内容
spawn cat version
expect -re 5.*.*
set VERSION $expect_out(0,string)
spawn rpm --addsign dist/foo-$VERSION-1.i686.rpm
Run Code Online (Sandbox Code Playgroud)
该cat命令正在正确获取版本,但它似乎添加了一个新行。因为我希望输出如下:
dist/foo-5.x.x-1.i686.rpm
但是我在开头包含以下错误:
cannot access file dist/foo-5.x.x
-1.i686.rpm
Run Code Online (Sandbox Code Playgroud)
为什么expect在cat命令输出中添加一个新行,有什么方法可以不这样做或修复 cat 命令的输出?
我正在测试 Expect 以使基本模板正常工作。我创建了一个演示 bash 脚本,它会询问一些问题并将输入输出到文件中。
当我直接或通过“expect FILENAME”执行 .exp 文件时,甚至在使用 autoexpect 时,我都会收到以下错误,表明它没有被正确解释(预期的 .exp 文件?)。我应该怎么做才能让 bash 脚本运行 Expect?
期待文件:
#!/usr/bin/expect -f
set timeout -1
spawn /bin/bash "./test-interactive.sh"
# expect "*"
expect "Please fill in each prompt."
send -- "a\r"
expect "*"
send -- "b\r"
expect "Please fill in each prompt."
# expect "*"
send -- "c\r"
expect "*"
send -- "d\r"
expect eof
Run Code Online (Sandbox Code Playgroud)
Bash 外壳文件:
#!/bin/bash
_message="Please fill in each …Run Code Online (Sandbox Code Playgroud) 我有以下期望脚本:
#!/usr/bin/expect
set timeout 20
set cmd "/path/vpntool --server 1.2.3.4:443 --vpnuser user"
set password [lindex $argv 0]
eval spawn $cmd
expect "VPN:"
send "$password\r";
interact
expect ".*\(Y\/N\)"
send "Y\r";
interact
Run Code Online (Sandbox Code Playgroud)
脚本在问题“您想连接到此服务器吗?(是/否)”处停止等待答案。
有谁知道可能是什么问题?
使用expectssh 和密码自动登录远程,调整窗口大小时,stty size报告旧大小。vim导致诸如和 之类的命令less变得混乱。
我正在编写一个 bash 脚本来安装我正在开发的一些小软件。该脚本以sudo(以 root 身份)运行,但脚本执行的某些命令需要(或应该)由我将其名称保留在$userName变量中的普通用户运行。大多数命令都是单行的,而且su -c "/what/ever/command" $userName效果很好。
但是,我不想运行的其中一个命令root会问我一些事情(实际上,只有一件事,但很多次:是否应该覆盖现有文件)。我可能称之为“ baaad_command”的那个命令没有提供默认答案的任何选项(没有“ --assume-no”或类似的东西)。
我看是可行的唯一选择是使用预期的命令,并回复“ n\r”命令输出和串巫婆开始与每一次“ Overwrite”,我想我的脚本没有答复(意为“ n\r“)多次baaad_command问"Overwrite... ? [y/n]"
我尝试了许多不同的 su、spawn、expect 组合……但没有任何运气。
这是我迄今为止的最后一次尝试:
#!/bin/bash
if [[ -d "$destinationFolder" ]] ; then
if [[ -n "$userName" ]] ; then
spawned=$(su -c expect -c "
spawn baaad_command --user \"foo\" --passwd \"bar\" \"$destinationFolder\"
expect {
Overwrite: { send \"n\r\"; exp_continue }
eof { exit }
}
" )
else …Run Code Online (Sandbox Code Playgroud)