【问题标题】:Bash: expect + scp : Problem on multiple filesBash:expect + scp:多个文件的问题
【发布时间】:2011-11-21 05:23:44
【问题描述】:
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 有一个可能的答案,但我不能使用它。

【问题讨论】:

  • 更多沿着 shell 试图扩展通配符。尝试转义*,因此改为\*(甚至\\*,取决于发生了多少级别的解析)。
  • 我试过\*\\*\\\*都不起作用。 :(

标签: bash file-upload expect scp


【解决方案1】:

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

【讨论】:

  • 我知道有办法,但由于服务器端的安全问题,我不能这样做。
【解决方案2】:

expect 的手册页说“如果由于 exec(2) 失败而无法成功生成程序”,所以我假设 expect 在内部使用 exec。 exec 不会调用任何 shell 来执行通配符扩展和这样的魔法,这意味着您的 ssh 看到星号并且无法处理它。你有没有试过像这样明确地调用你的 shell

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

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

编辑: 使用 \" 而不是 '

【讨论】:

  • 太棒了!你的回答有点不正确,让我帮你编辑\" 而不是'。顺便说一句,我明白了你的意思,我认为 expect 不会将我的 * 识别为通配符,使用 sh -c 是一个不错的选择!
  • The \" 对我来说听起来有点奇怪,因为 $IP 应该在调用期望之前由 /your/ shell 扩展。但是,请随意编辑,我看不出有什么不好在那。
【解决方案3】:

Expect 是 Tcl 的扩展,而 Tcl 本身并不使用 shell-filename-globbing。与其在你的框架中硬装 Tcl 解决方案,不如尝试

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

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

【讨论】:

  • set -- /home/kit.ho/folder/* 这实际上是什么意思?我是 linux 新手
  • 设置位置参数($1、$2、$3 等)。当我在 expect_password 的参数中使用 $* 时,它会扩展为该文件夹中文件/子目录的所有名称
猜你喜欢
  • 2018-09-04
  • 1970-01-01
  • 2014-02-19
  • 2013-01-17
  • 2019-01-07
  • 2016-05-23
  • 1970-01-01
  • 2015-06-01
  • 2013-12-16
相关资源
最近更新 更多