Bash:expect + scp:多个文件出现问题

时间:2011-09-20 15:46:24

标签: bash file-upload expect scp

function expect_password {
    expect -c "\
    set timeout 90
    set env(TERM)
    spawn $1
    expect \"password:\"
    send \"$password\r\"
    expect eof
  "
}

expect_password "scp /home/kit.ho/folder/file1 root@$IP:/usr/bin"

上述expect_password完美无缺!

但是,我想在该目录中传输多个文件,所以我尝试了:

expect_password "scp /home/kit.ho/folder/* root@$IP:/usr/bin"

但是出现了一个错误:

/home/kit.ho/folder/*: No such file or directory
Killed by signal 1.

似乎expect无法识别*。如何以这种方式传输文件? 使用rsync可能有一个答案,但我无法使用它。

3 个答案:

答案 0 :(得分:4)

期望的联机帮助页说“如果因为exec(2)失败而无法成功生成程序”,那么我假设期望在内部使用exec。 exec不会调用任何shell进行通配符扩展和这样的魔术,这意味着你的ssh看到星号并且无法处理它。您是否试图像

那样明确地调用您的shell
expect_password "sh -c \"scp /home/kit.ho/folder/* root@$IP:/usr/bin\""

(也许你需要省略单引号)?

编辑: 使用\“而不是'

答案 1 :(得分:1)

Expect是Tcl的扩展,而Tcl本身并不会说shell-filename-globbing。尝试

而不是使用框架来制定Tcl解决方案
set -- /home/kit.ho/folder/* 
expect_password "scp $* root@$IP:/usr/bin"

使用此解决方案时,带空格的文件无法正常工作。

答案 2 :(得分:0)

你不能完全放弃密码并使用SSH公钥吗?