【问题标题】:When I use scp command through expect, asterisk can not recognized当我通过期望使用 scp 命令时,无法识别星号
【发布时间】:2017-11-17 10:57:42
【问题描述】:

您好,我在 linux shell 中遇到了一个问题

我用expect写了一个scp脚本,脚本是这样的。

#!/bin/sh

expect -c "spawn scp /tmp/data/*2017-06-14*.log2 id@localhost:~/"\
       -c "expect -re \"password\" "/
       -c "sleep 1" \
       -c "send \"password\r\""\
       -c "interact"

执行结果显示错误信息。

/tmp/data/*2017-06-14*.log2 : No such file or directory

但是不使用expect的时候scp执行成功

[user@localhost]# scp /tmp/data/*2017-06-14*.log2 id@localhost:~/"\

我该如何解决这个问题?

【问题讨论】:

    标签: linux shell tcl sh expect


    【解决方案1】:

    Expect 不理解 shell 的语法。你可以:

    spawn sh -c "scp /tmp/data/*2017-06-14*.log2 id@localhost:~/"
    

    spawn sh -c {scp /tmp/data/*2017-06-14*.log2 id@localhost:~/}
    

    komar's answer 使用 glob 并不总是有效。请参见以下示例:

    bash-4.4# expect
    expect1.1> system pwd
    /root/tmp/tcl
    expect1.2> system ls -l
    total 0
    -rw-r--r-- 1 root root 0 Jun 16 10:55 a  b
    -rw-r--r-- 1 root root 0 Jun 16 10:55 c  d
    expect1.3> spawn ls -l [glob *]; expect eof
    spawn ls -l {a  b} {c  d}
    ls: cannot access {a  b} {c  d}: No such file or directory
    expect1.4> spawn sh -c "ls -l *"; expect eof
    spawn sh -c ls -l *
    -rw-r--r-- 1 root root 0 Jun 16 10:55 a  b
    -rw-r--r-- 1 root root 0 Jun 16 10:55 c  d
    expect1.5>
    

    【讨论】:

    • 那么,如何在您的解决方案中不输入密码进行 scp?
    • 只需更新您的spawn(在第一个-c ...)命令并保持其他-c ...不变。
    • 评论来不及了。谢谢你的帮助。
    【解决方案2】:

    您需要以 expect/tcl 样式进行通配:

    expect -c "spawn scp [glob /tmp/data/*2017-06-14*.log2] id@localhost:~/"
    

    【讨论】:

    • glob 方式并不总是有效。刚刚通过添加示例更新了我的答案。
    猜你喜欢
    • 2017-06-11
    • 2011-10-25
    • 2016-07-21
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    相关资源
    最近更新 更多