2012-09-04 25 views
0

我想寫我的第一個期望的腳本,將新語言推到遠程文件。貓文件到遠程系統使用期望

這是我至今未真正的工作:

#!/usr/bin/expect 

set fid1 [open ./hosts.list r] 
set hosts [read -nonewline $fid1] 
close $fid1 

set banner_cmd "cat > /tmp/new_sshd_banner << EOF 


<New Language Goes Here> 


EOF" 
send "\n" 

stty -echo 
send_user "Enter password for remote sudo: " 
expect_user -re "(.*)\n" 
stty echo 
set pass $expect_out(1,string) 
send "\n" 

foreach host [split $hosts "\n"] { 
    eval spawn "/usr/bin/ssh $host" 
    expect { 
     -re "RSA key fingerprint" {send "yes\r"} 
     timeout {puts "Host is known"} 
    } 

    expect "$host" 
    send "sudo mv /etc/file /etc/file.orig" 
    expect "assword" 
    send $pass 

    expect "$host" 
    send "sudo $file_cmd" 

    expect "$host" 
    send "sudo mv /tmp/file /etc/file 

} 

當它運行時,這是我所看到的:

opensuse @ 15:10 ~/bin> ./fix_file.exp 

Enter password for remote sudo: 
spawn /usr/bin/ssh server 

<New Language Goes Here> 


Last login: Fri Aug 31 19:52:45 2012 from 10.152.81.105 
[[email protected] ~]$ Host is known 
sudo cat > /tmp/new_file << EOF 
> 
> 
> <New Language Goes Here> 
> 
> EOFsudo mv /etc/file /etc/filePASSWORD*missing " 
    while executing 
"send "sudo mv /tmp/file /etc/file 

" 
    ("foreach" body line 17) 
    invoked from within 
"foreach host [split $hosts "\n"] { 
    eval spawn "/usr/bin/ssh $host" 
    expect { 
     -re "RSA key fingerprint" {send "yes\r"} 
     timeout {puts "Host i..." 
    (file "./fix_file.exp" line 45) 

一件事,是不是很明顯是它將從用戶獲得的密碼粘貼到mv命令的輸出中。

我在哪裏出錯了?

回答

1

究竟是什麼錯誤說:

missing " 
    while executing 
"send "sudo mv /tmp/file /etc/file 

你錯過了線後收「:

send "sudo mv /tmp/file /etc/file 
+0

Cripes我怎麼錯過/捂臉 – theillien

+0

而現在,這是?固定的,我可以看到它的其餘部分正在做什麼,例如將密碼附加到其中一個文件名,它實際上只是將send命令的參數回顯到屏幕。不幸的是,它實際上並沒有執行我正在嘗試的操作該語言沒有被輸入到文件中 – theillien

+1

@theillien你可能會更好地在本地創建文件並執行spawn scp $ localfile $ {host}:/ tmp/new_sshd_banner來傳輸它(必要時用東西來處理密碼)。更普遍的是,我會寫一個過程來執行'send sudo ...',這樣你就可以處理_optional_的密碼請求,而不必每次都寫出完整的密碼。只調試一次是很好的。 :-) –