【问题标题】:Using a filename with spaces with scp and chmod in bash在 bash 中使用带空格的文件名和 scp 和 chmod
【发布时间】:2011-01-24 21:03:20
【问题描述】:

我喜欢定期将文件放在我的网络服务器的 /tmp 目录中以进行共享。令人讨厌的是,每当我 scp 文件时,我都必须设置权限。按照another question 的建议,我编写了一个脚本,将文件复制过来,设置权限,然后打印 URL:

#!/bin/bash

scp "$1" SERVER:"/var/www/tmp/$1"
ssh SERVER chmod 644 "/var/www/tmp/$1"
echo "URL is: http://SERVER/tmp/$1"

当我用我的实际主机替换 SERVER 时,一切都按预期工作......直到我使用包含空格的参数执行脚本。虽然我怀疑解决方案可能是使用 $@ ,但我还没有弄清楚如何让间隔文件名起作用。

【问题讨论】:

    标签: bash ssh scp


    【解决方案1】:

    脚本看起来不错。我的猜测是,您需要在将文件名传递到脚本时引用它:

    scp-chmod.sh "filename with spaces"
    

    或者转义空格:

    scp-chmod.sh filename\ with\ spaces
    

    【讨论】:

      【解决方案2】:

      事实证明,我们需要的是转义将发送到远程服务器的路径。 Bash 认为 SERVER:"/var/www/tmp/$1" 中的引号与 $1 相关,并将它们从最终输出中删除。如果我尝试运行:

      tmp-scp.sh Screen\ shot\ 2010-02-18\ at\ 9.38.35\ AM.png
      

      我们看到它正在尝试执行:

      scp SERVER:/var/www/tmp/Screen shot 2010-02-18 at 9.38.35 AM.png
      

      如果引号是转义文字,那么 scp 命令看起来更像您所期望的:

      scp SERVER:"/var/www/tmp/Screen shot 2010-02-18 at 9.38.35 AM.png"
      

      通过添加一些代码来截断路径,最终脚本变为:

      #!/bin/bash
      
      # strip path
      filename=${1##*/}
      fullpath="$1"
      
      scp "$fullpath" SERVER:\"/var/www/tmp/"$filename"\"
      echo SERVER:\"/var/www/tmp/"$filename"\"
      ssh SERVER chmod 644 \"/var/www/tmp/"$filename"\"
      echo "URL is: http://SERVER/tmp/$filename"
      

      【讨论】:

        【解决方案3】:

        无需担心文件名中的空格(除了引用)的更简单方法是在传输之前重命名文件以消除空格。或者在创建文件时,不要使用空格。无论何时命名文件,您都可以将此作为“最佳实践”。

        【讨论】:

          猜你喜欢
          • 2010-12-07
          • 2011-04-27
          • 2014-05-08
          • 1970-01-01
          • 2018-04-08
          • 2015-07-23
          • 2020-05-21
          • 2014-08-18
          相关资源
          最近更新 更多