【问题标题】:SCP command ClarificationSCP 命令说明
【发布时间】:2013-10-30 18:51:54
【问题描述】:

我正在使用 scp 命令从远程服务器中提取一些文件,但该命令的一种变体不起作用。

我在远程服务器中有 2 个文件名 one.xml 和 two.xml,我正在使用以下命令将这两个文件拉入当前目录:

scp stuadmin@10.44.220.112:/student/class/Intermediate/one.xml .
scp stuadmin@10.44.220.112:/student/class/Intermediate/two.xml .

上述命令工作正常,但如果我使用通配符一次性提取所有 xml 文件,如下所示,它将返回 scp: No match.

scp stuadmin@10.44.220.112:/student/class/Intermediate/*.xml .

为什么如果我单独提取文件会起作用,而如果我尝试使用通配符提取则不起作用。

【问题讨论】:

  • 这可能更适合向超级用户询问。

标签: linux unix scp


【解决方案1】:

是的,这是给超级用户的。答案是因为星号在命令运行之前首先进行了通配符扩展。它由您的 SHELL 扩展。 echo *.xml 将真正运行 echo file1.xml file2.xml,这就是 echo 看到的,而 bash 看到的是 *.xml

由于您将多个文件和路径传递给 SCP,它会因为第一个参数(或第二个参数)不是主机:/路径而感到困惑。

将'echo'放在你的命令前面,看看真正执行了什么。您不能在远程主机上使用通配符(除非您先将它们转义)。

【讨论】:

  • 例如,如果我在本地有 file1.xml 和 file2.xml,那么如果我使用命令而不转义,它们会被覆盖。当您提到“星号在命令运行之前首先进行通配符扩展”时,扩展 echo *.xml 返回echo: No match.,但您提到它扩展为echo file1.xml file2.xml。你能详细说明一下吗?
  • 在您的情况下,没有 scp 不会覆盖,因为它会首先给出错误。您的本地 shell 将查找以 stuadmin... 开头并以 xml 结尾的文件名。如果 echo 显示“不匹配”,则表示没有与 *.xml 匹配的本地文件。 file1 & file2 是示例。
  • 在什么情况下会覆盖。
【解决方案2】:

你可以从这些结果中澄清

您可以通过在其他 ssh 连接上建立隧道 ssh 连接来大大简化此过程(请参阅这个先前的答案)。我这样做的方法是在 LOCAL 系统上创建一个 .ssh/config 文件,其中包含以下条目:

Host SYSTEM3
        ProxyCommand    ssh -e none SYSTEM2 exec /usr/bin/nc %h %p 2>/dev/null
        HostName        SYSTEM3.full.domain
        User            system3user

Host SYSTEM2
        ProxyCommand    ssh -e none SYSTEM1 exec /usr/bin/nc %h %p 2>/dev/null
        HostName        SYSTEM2.full.domain
        User            system2user

Host SYSTEM1
        HostName        SYSTEM1.full.domain
        User            system1user

(假设两个中间主机都将 netcat 安装为 /usr/bin/nc ——如果没有,您可能必须找到/安装一些等效的方式将 stdin&stdout 网关连接到 TCP 会话中。)

通过此设置,您可以在 LOCAL 上使用 scp SYSTEM3:/data /data,它会自动通过 SYSTEM1 和 SYSTEM2 隧道(并按顺序询问三个 SYSTEMn 的密码 - 这可能有点令人困惑,尤其是如果您输入错误)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 2011-09-13
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多