【问题标题】:How to copy using scp on shell script to folders space named?如何在 shell 脚本上使用 scp 复制到命名的文件夹空间?
【发布时间】:2015-08-03 14:08:30
【问题描述】:

大家好,我正在开发这个通过 SSH 连接到 Raspberry Pi 的应用程序。我使用 NSTask 和 NSPipe 以及 shell 脚本通过 Mac 应用程序 GUI 执行 shell 命令。

问题是,当我想使用“scp”命令进行复制时,我得到“没有这样的文件或目录”错误,文件夹名称上有空格。如果路径是“/Users/home/Desktop/New Files/”就不行,但是如果“/Users/home/Desktop/New Files/”就可以了。

该应用程序必须能够使用两者,分开的命名文件夹而不是分开的,但我只是不知道该怎么做。

这是我的 shell 脚本命令:

#!/bin/bash
/usr/bin/ssh pi@192.168.25.144 \
/usr/bin/scp /home/pi/"${1}" home@192.X.X.X:/Users/home/Documents/New Files/

ip上的“X”是故意去掉的,不在真实代码上。

那么,有人可以帮忙吗????

【问题讨论】:

  • 您意识到 192.168.0.0/16 是一个私有的、不可公开路由的范围,那么混淆它没有意义吧?
  • 用您尝试过的相关代码更新您的问题。
  • @JonathonReinhart 抱歉,我不明白您的评论。
  • @rmaddy 我试过的代码已经在问题范围内了吗?
  • 我在您的问题中没有看到任何 Objective-C 代码。另外,您是否尝试在路径中的任何空格前加上反斜杠?

标签: shell directory scp


【解决方案1】:

这很棘手,因为它需要多级转义。

首先,从实际路径开始:

home@192.X.X.X:/Users/home/Documents/New Files/

现在为 shell 转义它:

"home@192.X.X.X:/Users/home/Documents/New Files/"

现在为 scp 转义它,因为 scp 接受 shell glob 模式而不是文件名:

/usr/bin/scp /home/pi/"${1}" "home@192.X.X.X:/Users/home/Documents/New\\ Files/"

现在为 ssh 转义它,因为 ssh 将在 shell 中评估它:

/usr/bin/ssh pi@192.168.25.144 \
    /usr/bin/scp /home/pi/"${1}"  \
      '"home@192.X.X.X:/Users/home/Documents/New\\ Files/"'

这会处理“新文件”部分,但我们也尝试对“${1}”参数做一些事情:

/usr/bin/ssh pi@192.168.25.144 \
    /usr/bin/scp /home/pi/"$(printf "%q" "$1")"  \
      '"home@192.X.X.X:/Users/home/Documents/New\\ Files/"'

这是一个完整的、自包含的上述示例,通过 localhost 两次:

#!/bin/bash
cd ~
mkdir "New Files"
touch "my file"
set -- "my file"  # Assign $1="my file"
/usr/bin/ssh localhost \
      /usr/bin/scp "$(printf "%q" "$1")"  \
        '"localhost:New\\ Files/"'

find "New Files" -type f

输出显示它实际上确实将带有空格的文件通过 scp 通过 ssh 复制到带有空格的目录:

New Files/my file

由于多级转义很棘手,如果您遇到任何问题,请务必先尝试这个自包含的示例而不进行修改,然后再断定它不起作用。

【讨论】:

    【解决方案2】:

    在路径周围加上“”。

    $ mkdir 1 1
    mkdir: 1: File exists
    $ mkdir "1 1"
    $ ll
    drwxr-xr-x  2 mikael  staff  68 May 21 22:35 1
    drwxr-xr-x  2 mikael  staff  68 May 21 22:36 1 1
    

    【讨论】:

    • 在路径周围使用引号不起作用。使用引号和反斜杠给了我这个错误: scp: "ambiguous target".
    • 如果它不适用于引号和单个反斜杠,请尝试使用双斜杠,如下所示:scp testfile remote.host:"~/test\\ test/"
    • 对此进行了测试:home@192.XXX:"/Users/home/Documents/New\\ Files/" 和 home@192.XXX:/Users/home/Documents/"New\\ Files "/ 两者都不起作用。
    • 我测试了我上面的建议,它对我有用。你得到哪个错误?尝试为详细模式添加 -v。
    • 我得到:“scp: ambiguous target”
    【解决方案3】:

    尝试使用反斜杠转义空格:

    home@192.X.X.X:/Users/home/Documents/New\ Files/
    

    【讨论】:

      猜你喜欢
      • 2016-09-27
      • 2013-11-25
      • 2015-07-13
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      • 2012-07-03
      相关资源
      最近更新 更多