2013-03-13 40 views
3

echo測試顯示我的命令行變量正在工作,但是如何通過它們導出它們以用於嵌入式expect導出在嵌入式中使用的Bash命令行參數變量Expect

#!/bin/bash 

echo name of script is $0 
echo host is $1 
echo hostusername is $2 
echo hostpassword is $3 

expect -c 'spawn ssh -l $2 $1 < ./sf-wall_scp_bash.sh 
sleep 2 

expect { 
"(yes/no)? " {send "yes\n"} 
    exp_continue 
} 

expect { 
"?assword" {send "$3\r"} 
} 
sleep 1 
' 

如果與expect家當調用,它就像

#!/usr/bin/expect 

set host [lindex $argv 0] 
set hostusername [lindex $argv 1] 
set hostpassword [lindex $argv 2] 


spawn ssh -l $hostusername $host 
sleep 2 

expect { 
"(yes/no)? " {send "yes\n"} 
    exp_continue 
} 

expect { 
"?assword" {send "$hostpassword\r"} 
} 
sleep 1 

...如預期其工作。我需要使用bash,並且嵌入expect,因爲腳本需要調用bash特定的命令,函數,內置變量......否則,僅僅使用第二個示例將是一個工作選項,但事實並非如此。

我試過聲明和導出命令行參數變量,並在上面的第一個示例中分別更改$ 1,$ 2,$ 3到變量名稱聲明和導出,這在另一個腳本中,我有我在其中在腳本中聲明變量......區別在於它們不是命令行參數。

host=$1 
export host 
hostusername=$2 
export hostusername 
hostpassword=$3 
export hostpassword 

以及剛剛導出他們

export host 
export hostusername 
export hostpassword 

並試圖上面的第一個例子。沒有變化,expect繼續聲稱

無法讀取「X」:沒有這樣的變量

在另一個bash腳本,我能夠雙方宣佈它們,然後它們導出爲成功導出變量在上面的例子中。但是我一直沒能通過bash命令行參數變量來運行expect

+0

在您的初始腳本中,請嘗試雙引號。單引號(按設計)不能替代變量。您需要在期望的腳本中使用任何文字雙引號或美元符號(帶反斜槓)。 – phs 2013-03-14 02:04:50

+0

ssh旨在強制人們不要將密碼放在腳本和文件中。期望撤消設計。考慮SSH密鑰。他們不難實施。 – 2013-03-14 02:45:06

+0

@jimmcnamara ssh登錄信息不是我將使用命令行參數的唯一東西,我只是在我的示例中包含了這一點。另外,密碼並沒有放在腳本文件中,它們是動態的,特定於我無法設置密鑰的機器,以及爲什麼它們是通過CLI參數提供的。 – TryTryAgain 2013-03-14 03:55:12

回答

5

帶嵌套引號的代碼不容易編寫和讀取。我建議你在這裏使用shell的-文檔語法。例如(demo'ing傳遞bash瓦爾至expect的2種方式):

$ cat foo.sh 
arg1=$1 
export arg2=$2 

expect << END 
puts $arg1 
puts \$env(arg2) 
END 
$ bash foo.sh hello world 
hello 
world 
$ 

我喜歡export var從外殼並且在$env(var)引用它期望的那樣,你會不會擔心如果var有一些特殊字符(如',"或空格)。