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
可能有一个答案,但我无法使用它。
答案 0 :(得分:4)
期望的联机帮助页说“如果因为exec(2)失败而无法成功生成程序”,那么我假设期望在内部使用exec。 exec不会调用任何shell进行通配符扩展和这样的魔术,这意味着你的ssh看到星号并且无法处理它。您是否试图像
那样明确地调用您的shellexpect_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公钥吗?