在bash中使用带有scp和chmod空格的文件名

时间:2010-03-08 06:46:47

标签: bash ssh scp

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

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分:0)

脚本看起来正确。我猜你需要在将文件名传递到脚本时引用文件名:

scp-chmod.sh "filename with spaces"

或逃避空间:

scp-chmod.sh filename\ with\ spaces

答案 2 :(得分:-4)

更简单的方法而不用担心文件名中的空格(除了引用之外)是重命名文件以在传输之前去掉空格。或者,在创建文件时,请勿使用空格。只要您命名文件,就可以将其作为“最佳实践”。