2017-06-15 69 views
0

我有一個期望腳本,目前爲止它工作正常......它在現有的ssh通道上產生一個ssh會話,像這樣:

spawn ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o {ProxyCommand=nc -X 5 -x localhost:8888 %h %p} "$user_ip" 

$user_ip擁有用戶名和目的IP,通過SSH如預期一樣[email protected]

的問題是,有時,端口8888正在由另一個SSH隧道,每一次遇到這種情況我有調整代碼並更改隧道端口。

所以,我試圖發送一個變量的端口,以避免觸摸代碼的所有時間。 我得到命令行隧道口,如:

set proxy_port [lindex $argv 2] 

然後

spawn ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o {ProxyCommand=nc -X 5 -x localhost:"$proxy_port" %h %p} "$conn" 

我看到proxy_port變量設置正確,但是當腳本嘗試產卵的SSH,我得到:

spawn ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o {ProxyCommand=nc -X 5 -x localhost:8888 %h %p} [email protected] 
command-line line 0: garbage at end of line; "-o". 
send: spawn id exp5 not open 
    while executing 
"send "$pwd\r"" 
    (file "./amm-qev.new.exp" line 36) 

在上面的錯誤中,我看到該端口被正確替換,但它是抱怨ssh語法。

那裏有什麼毛病,我的軟弱眼睛沒有抓住?

+0

Stack Overflow是編程和開發問題的網站。這個問題似乎與題目無關,因爲它不涉及編程或開發。請參閱幫助中心的[我可以詢問哪些主題](http://stackoverflow.com/help/on-topic)。也許[超級用戶](http://superuser.com/)或[Unix&Linux堆棧交換](http://unix.stackexchange.com/)會是一個更好的地方。另請參閱[我在哪裏發佈關於Dev Ops的問題?](http://meta.stackexchange.com/q/134306) – jww

+0

@jww我同意_「Stack Overflow是編程和開發問題的網站」,但是,完全不同意「這不是關於編程或開發」。這個問題是關於用** expect **腳本語言進行編程時發生的問題......就像許多人發佈的** Stack Overflow ** – Renato

回答

2

Tcl的{...}語法就像shell中的單引號字符串('...'),其中$var不會被展開。你應該使用雙引號。

spawn ssh -o UserKnownHostsFile=/dev/null \ 
      -o StrictHostKeyChecking=no \ 
      -o "ProxyCommand=nc -X 5 -x localhost:$proxy_port %h %p" \ 
      "$conn"