我想定期将文件放在我的网络服务器的/ 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时,一切都按预期工作......直到我用包含空格的参数执行脚本。虽然我怀疑解决方案可能是使用$ @我还没弄明白如何让间隔文件名工作。
答案 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)
更简单的方法而不用担心文件名中的空格(除了引用之外)是重命名文件以在传输之前去掉空格。或者,在创建文件时,请勿使用空格。只要您命名文件,就可以将其作为“最佳实践”。