2016-10-31 142 views
-1

我使用下面的腳本通過使用expect函數來隨機更改用戶名,但它給了我一個錯誤命令,即使我已經安裝了expect命令但沒有找到。和perl腳本用來替換用戶名。在Bash腳本中使用Expect函數

#!/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 

輸出:

bash ran.sh 
    Enter domain 
    domainname.net 
    ran.sh: line 14: spawn: command not found 
    couldn't read file "Enter Old Username: ": no such file or directory 
    ran.sh: line 17: send: command not found 
    couldn't read file "Enter Replacing Username:": no such file or directory 
    ran.sh: line 19: send: command not found 
    ran.sh: line 20: interact: command not found 

修改:

#!/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 
    ' 
+0

您需要決定是否希望這是'bash'腳本或'expect'腳本。你有兩個混在這裏,它不會運行'bash'或'expect'。 – Munir

+0

我想我必須去期待腳本,請看看它,我已根據您的參考[鏈接]模具它(https://gist.github.com/Fluidbyte/6294378) – blaCkninJa

+0

請[編輯](http:///stackoverflow.com/posts/40348590/edit)直接提問,而不是將其作爲答案發布。 – Munir

回答

1

在腳本的第一行,你的狀態,即/usr/bin/expect -f被用作命令解釋:

#!/usr/bin/expect -f 

但你使用bash執行腳本:

bash ran.sh 

你應該讓你的可執行腳本,只是涉及到它:

chmod a+x ran.sh 
./ran.sh 

當然,bash所做的什麼都不知道放期望的命令,所以它抱怨不尋找菌種。

順便說一下,expect使用Tcl作爲它的腳本語言,所以haven shell命令在expect腳本中不起作用。

+0

如果我沒有使用'#!/ usr/bin/expect -f',腳本已經'訪問:(0775/-rwxrwxr-x)'比我如何運行expect函數? 。 – blaCkninJa

0

您正在錯誤地運行腳本。

這是一個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 

我沒有測試過這一點,所以有可能在其中有一些錯誤,但希望應該讓你去。

+0

但是當我運行'/ ran.sh'比它給出了一個錯誤: ''./ran.sh '無效的命令名稱 「回聲」' '而executing' ' 「回聲」 輸入域「'' '(file」./ran.sh「line 6)' – blaCkninJa

+0

是的......那是因爲'echo'是一個'bash'命令。 'expect'相當於'puts'。請參閱https://gist.github.com/Fluidbyte/6294378,瞭解一些基本腳本與'expect'。 – Munir

+0

我已經按照你的方向運行它,但是在輸出中它顯示的是變量,它將是命令輸出而不是命令。 請檢查問題部分的輸出。 – blaCkninJa