2013-12-14 83 views
2

我有腳本通過SSH將一些文件複製到其他服務器。我使用tar壓縮文件到farchive上,並從其他機器上的stdout解壓縮它。預期產卵的管道輸出

set timeout -1 

# user info 
set port [lindex $argv 0] 
set login [lindex $argv 1] 
set password [lindex $argv 3] 
set host [lindex $argv 2] 

#tar info 
set sdir [lindex $argv 4] 
set ddir [lindex $argv 5] 

spawn tar cf - $sdir | ssh -p $port [email protected]$host tar xf - -C $ddir 

expect "*?(yes/no)" { 
    send "yes\r" 
} 

expect "*?assword" { 
    send "$password\r" 
} 

expect "#" { 
    send "ls $ddir -la\r" 
} 

expect "#" { 
    send "exit\r" 
} 

interact 

但是'|'不能用產卵。我試圖找到任何解決方案,但沒有任何適合我的方式。你能給我這個問題的建議嗎?

+0

不要指望這個。使用ssh-keygen和ssh-copy-id設置ssh密鑰 –

+1

我沒有答案,但我有一個建議。如上所述,使用基於密鑰的身份驗證而不是基於密碼對於大多數情況來說更好。 另外,考慮使用Python來代替bash更復雜的腳本。如果可能,請使用光纖模塊,或僅使用標準庫pexpect模塊。 另外考慮使用rsync與壓縮。 對不起,我沒有你的具體問題的答案,但只有我如何解決問題的建議。 – johannestaas

回答

1

如果您不能安裝密鑰,你可以把「焦油... | SSH ......」行到另一個腳本,並與產卵調用它,只是通過所需的參數

.IE:

spawn anotherscript.bash $sdir $port $login $host 

你明白了。

2

「重生」 殼

set timeout -1 

# user info 
set port [lindex $argv 0] 
set login [lindex $argv 1] 
set password [lindex $argv 3] 
set host [lindex $argv 2] 

#tar info 
set sdir [lindex $argv 4] 
set ddir [lindex $argv 5] 

spawn $env(SHELL) 

expect "#" { 
    send "(tar cf - \$sdir) | (ssh -p \$port \[email protected]\$host tar xf - -C \$ddir)\r" 
} 

expect -re "(yes/no)" { 
    send "yes\r" 
} 

expect -re "assword" { 
    send "$password\r" 
} 

expect "#" { 
    send "exit\r" 
} 

interact