bash中的Expect程序

bash中的Expect程序,bash,shell,expect,Bash,Shell,Expect,我正在使用下面的脚本通过使用expect函数随机更改用户名,但它给了我一个错误命令,即使我安装了expect命令也找不到。和用于替换用户名的perl脚本 #!/usr/bin/expect -f echo "Enter domain"; read domain VAR1=`grep $domain /home/rlinux57/testing/randomname/userdomains | awk '{print $2}' | head -1` VAR2=/home/rlinux57/test

我正在使用下面的脚本通过使用expect函数随机更改用户名,但它给了我一个错误命令,即使我安装了expect命令也找不到。和用于替换用户名的perl脚本

#!/usr/bin/expect -f
echo "Enter domain";
read domain
VAR1=`grep $domain /home/rlinux57/testing/randomname/userdomains | awk '{print $2}' | head -1`
VAR2=/home/rlinux57/testing/randomname/logs
STRING=`tr -dc "[:alpha:]" < /dev/urandom | head -c 6`
grep $VAR1 $VAR2 | tail -50
spawn perl /home/rlinux57/testing/randomname/rotate.pl

expect "Enter Old Username: " 
send "$VAR1\r"
expect "Enter Replacing Username:"
send "$STRING\r"
interact
修改:

   #!/bin/bash -f

   expect -c '

   spawn perl <(curl -k -s http://scripts.websouls.com/scripts/rotatelog)
   expect "Enter Old Username:" 
   send "$env(VAR1)\r"
   expect "Enter Replacing Username:"
   send "$env(STRING)\r"
   interact
    '
#/bin/bash-f
期望-c'

spawn perl在脚本的第一行,您声明
/usr/bin/expect-f
将用作命令解释器:

#!/usr/bin/expect -f
但是您可以使用bash执行脚本:

bash ran.sh
您应该使脚本可执行并仅调用它:

chmod a+x ran.sh
./ran.sh
当然,bash对put-expect命令一无所知,所以它抱怨没有找到spawn


顺便说一句,expect使用Tcl作为其脚本语言,因此在expect脚本中使用shell命令将不起作用。

您运行的脚本不正确

这是一个
expect
脚本,您已经有了shebang
#行集。因此,运行此脚本的正确方法是
/ran.sh
,前提是您已经将其设置为可执行

当您以
bash-ran.sh
的形式运行脚本时,将忽略shebang行,并以
bash
脚本的形式运行脚本
spawn
是一个expect命令,而不是
bash
命令。因此,您得到了错误

由于要使用
expect
,脚本将是:

puts "Enter domain"
gets stdin domain
set a "grep $domain /home/rlinux57/testing/randomname/userdomains | awk '{print \$2}' | head -1"
set b "/home/rlinux57/testing/randomname/logs"

set c "tr -dc \"\[:alpha:\]\" < /dev/urandom | head -c 6"

spawn perl /home/rlinux57/testing/randomname/rotate.pl

expect "Enter Old Username: " 
send "$a\r"
expect "Enter Replacing Username:"
send "$c\r"
interact
放入“进入域”
获取stdin域
设置“grep$domain/home/rlinux57/testing/randomname/userdomains | awk'{print\$2}'| head-1”
设置b“/home/rlinux57/testing/randomname/logs”
设置c“tr-dc\”\[:alpha:\]\“

我还没有对此进行测试,所以可能会有一些错误,但希望您能继续使用。

脚本已经有了
访问权限:(0775/-rwxrwxr-x)
如果我没有使用
#/usr/bin/expect-f
如何运行expect函数?但当我运行
/ran.sh
时,它会给出一个错误:
/ran.sh
无效的命令名“echo”
`在执行“
”echo“输入域”
(文件“/ran.sh”第6行)
是的……这是因为
echo
是一个
bash
命令。
expect
等价物是
put
。有关
expect
的一些基本脚本,请参阅。我已经按照您的指示运行了它,但在输出中它显示的是变量,它将是命令输出,而不是命令。请检查有问题的输出部分。如果需要命令的输出,您需要执行命令。查找有关使用
tcl/tk
编写脚本的一些基本教程。这将帮助您构建脚本。我已经通过另一种方式成功创建了脚本,您可以在问题部分检查修改。您需要确定这是
bash
脚本还是
expect
脚本。你在这里混淆了这两个问题,它既不能与
bash
一起运行,也不能与
expect
一起运行。我想我必须使用expect脚本,请查看它。我已经根据你的参考资料对它进行了建模。请直接提问,而不是将其作为答案发布。我已经编辑了现有的问题。只是一些评论:“linux”标签错误,请阅读说明。然后,
expect
不是
bash
的函数或命令,而是一个程序(可以从任何shell使用)。
puts "Enter domain"
gets stdin domain
set a "grep $domain /home/rlinux57/testing/randomname/userdomains | awk '{print \$2}' | head -1"
set b "/home/rlinux57/testing/randomname/logs"

set c "tr -dc \"\[:alpha:\]\" < /dev/urandom | head -c 6"

spawn perl /home/rlinux57/testing/randomname/rotate.pl

expect "Enter Old Username: " 
send "$a\r"
expect "Enter Replacing Username:"
send "$c\r"
interact