预期产卵的管道输出

时间:2013-12-14 19:45:32

标签: linux bash expect spawn

我有通过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 $login@$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

但是'|'不适用于spawn。我试图找到任何解决方案,但对我来说没有任何合适的方法。你能否就这个问题给我一个建议?

2 个答案:

答案 0 :(得分:3)

“生成”shell

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 \$login@\$host tar xf - -C \$ddir)\r"
} 

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

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

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

interact

答案 1 :(得分:1)

如果您无法设置密钥,可以将“tar ... | ssh ...”行放入另一个脚本并使用spawn调用它,只需传递所需的参数

.i.e:

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

你明白了。