2017-08-02 43 views
1

我寫了一個小期望腳本來連接到多個SSH服務器。 但是,如果我在初始化連接後使用終端interact,則終端窗口的行爲非常奇怪。期望腳本 - 修復怪異的終端調整行爲

例如,如果我開始在非全尺寸端腳本,並調整窗口的大小,使的Interact後大,它看起來就像是:

Weird Terminal Preview

現在,我我的第一個期望腳本也有這個問題。但我可以通過將下面的代碼來解決這個問題:

trap { 
    set XZ [stty rows ] 
    set YZ [stty columns] 
    stty rows $XZ columns $YZ < $spawn_out(slave,name) 
} WINCH 

而且這個工作完全正常!我能夠毫無問題地調整終端大小。

但是,我將這段代碼添加到了我的新腳本中,其中有多個interact在不同的proc(函數)中。和窗口大小調整,我得到以下錯誤:

can't read "spawn_out(slave,name)": no such variable

while executing

"stty rows $XZ columns $YZ < $spawn_out(slave,name)"

我現在對如何解決這個想法。這裏是我的代碼:

#!/usr/bin/expect -f 

set SERVER "0" 
set CHOICE "0" 

set SERVER_1_PKEY [exec cat /home/me/p1] 
set SERVER_2_PKEY [exec cat /home/me/p2] 

set SERVER_1_HOST "server1.com" 
set SERVER_2_HOST "server2.com" 

set SERVER_1_USER "server1user" 
set SERVER_2_USER "server2user" 

set SERVER_1_PORT "22" 
set SERVER_2_PORT "22" 

trap { 
    set XZ [stty rows ] 
    set YZ [stty columns] 
    stty rows $XZ columns $YZ < $spawn_out(slave,name) 
} WINCH 

proc s1 {SERVER_1_PKEY SERVER_1_HOST SERVER_1_USER SERVER_1_PORT} { 
    send_user "\033c" 
    spawn ssh ${SERVER_1_USER}@${SERVER_1_HOST} -p ${SERVER_1_PORT} 
    expect "assword:" 
    send "${SERVER_1_PKEY}\r" 
    interact 
} 

proc s2 {} { 
    send_user "\033c" 
    spawn ssh ${SERVER_2_USER}@${SERVER_2_HOST} -p ${SERVER_2_PORT} 
    expect "assword:" 
    send "${SERVER_2_PKEY}\r" 
    interact 
} 

set arg [lindex $argv 0] 
switch $arg { 
    "" { set CHOICE "0" } 
    "1" { set CHOICE "1" } 
    "2" { set CHOICE "2" } 
} 

if {$CHOICE eq "0"} { 
    puts -nonewline " Input \[1,2\]: " 
    flush stdout 
    gets stdin SERVER 
    if {$SERVER eq "1"} { s1 $SERVER_1_PKEY $SERVER_1_HOST $SERVER_1_USER $SERVER_1_PORT } 
    if {$SERVER eq "2"} { s2 $SERVER_2_PKEY $SERVER_2_HOST $SERVER_2_USER $SERVER_2_PORT } 
} 

if {$CHOICE eq "1"} { s1 $SERVER_1_PKEY $SERVER_1_HOST $SERVER_1_USER $SERVER_1_PORT } 
if {$CHOICE eq "2"} { s2 $SERVER_2_PKEY $SERVER_2_HOST $SERVER_2_USER $SERVER_2_PORT } 

任何人都可以幫助我解決這個問題或告訴我我失蹤了什麼?

+0

spawn_out(slave,name)在哪裏設置? –

+0

@BradLanam它不需要設置:'spawn返回UNIX進程ID。如果沒有進程產生,返回0。變量spawn_out(slave,name)被設置爲pty從屬設備的名稱.' Rel:https://www.tcl.tk/man/expect5.31/expect.1.html – NullDev

回答

1

當您在過程內調用spawn時,數組變量spawn_out(slave,name)僅具有該過程的作用域。通常情況下,您可以通過在每個過程中聲明它,將其置於全局範圍內:

proc s1 {...} { 
    global spawn_out 
    ... 
    spawn ... 
} 
send_user $spawn_out(slave,name) 
+0

謝謝!我所要做的就是將你建議的全局spawn_out添加到每個函數中。這解決了這個問題:) – NullDev