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

Bash:expect+;scp:多个文件出现问题,bash,file-upload,expect,scp,Bash,File Upload,Expect,Scp,以上expect\u密码功能完美 但是,我想传输该目录中的多个文件,因此我尝试: 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/fi

以上
expect\u密码
功能完美

但是,我想传输该目录中的多个文件,因此我尝试:

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 "scp /home/kit.ho/folder/* root@$IP:/usr/bin"
似乎
expect
无法识别
*
。我怎样才能用那种方式传输文件?
使用rsync有一个可能的答案,但我不能使用它。

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

expect的主页上说“如果程序因为exec(2)失败而无法成功生成”,所以我假设expect在内部使用exec。exec不调用任何shell来进行通配符扩展和类似的魔术,这意味着您的ssh看到了星号而无法处理它。你有没有试过像这样直截了当地称呼你的shell

/home/kit.ho/folder/*: No such file or directory
Killed by signal 1.
(也许你需要省略单引号)

编辑:
使用\“而不是“

Expect是Tcl的一个扩展,而且Tcl本身不讲shell文件名globbing。与其在您的框架中寻找Tcl解决方案,不如尝试一下

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

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

更多内容与shell尝试扩展通配符的内容类似。请尝试转义
*
,因此它是
\*
(甚至
\\*
,具体取决于解析的级别)。我尝试了
\*
\*
\\*
但都不起作用。:(我知道有一种方法,但由于服务器端的安全问题,我无法做到。太好了!您的答案有点不正确,让我帮您编辑
\”
而不是
。顺便说一句,我明白你的意思了,我想expect不会将my*识别为通配符,使用sh-c是一个不错的选择\“听起来有点奇怪,因为$IP应该在调用expect之前通过/your/shell进行扩展。但是,请随意编辑,我看不出有什么不好的地方。设置--/home/kit.ho/folder/*这实际上意味着什么?我对设置位置参数($1、$2、$3等)的Linux非常陌生。”。当我在参数中使用$*以获得密码时,它将扩展到该文件夹中文件/子目录的所有名称
set -- /home/kit.ho/folder/* 
expect_password "scp $* root@$IP:/usr/bin"