2013-12-14 59 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