3

定期,我喜欢将文件放在我的网络服务器的 /tmp 目录中以进行分享。令人讨厌的是,每当我 scp 文件时,我都必须设置权限。按照另一个问题的建议,我编写了一个脚本,将文件复制过来,设置权限,然后打印 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 时,一切都按预期工作......直到我使用包含空格的参数执行脚本。虽然我怀疑解决方案可能是使用 $@ ,但我还没有弄清楚如何让间隔文件名起作用。

4

3 回答 3

5

事实证明,需要的是转义将发送到远程服务器的路径。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"
于 2010-03-08T07:12:44.600 回答
0

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

scp-chmod.sh "filename with spaces"

或转义空格:

scp-chmod.sh filename\ with\ spaces
于 2010-03-08T06:54:21.757 回答
-4

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

于 2010-03-08T07:28:44.653 回答