2010-03-08 74 views
3

定期地,我喜欢将文件放在我的web服务器的/ tmp目录中以便共享。令人讨厌的是,我必须在每次scp文件时设置权限。继从another question的意见,我已经写了一个脚本,将文件复制过来,将权限设置,然后打印的网址:在bash中使用带有scp和chmod空格的文件名

#!/bin/bash 

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

当我与我的实际主机更换服务器,一切正常......直到我用包含空格的参数执行脚本。虽然我怀疑这个解决方案可能是使用$ @,但我还没有弄清楚如何获得间隔文件名。

回答

4

事实证明,我们需要的是逃跑的路径,其将被发送到远程服务器。 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" 
0

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

scp-chmod.sh "filename with spaces" 

或逃生的空间:

scp-chmod.sh filename\ with\ spaces 
-5

更简单的方法是不用担心文件名中的空格,(除了引用之外)是重命名文件以在转移之前清除空格。或者当您创建文件时,请勿使用空格。无论何时您命名文件,您都可以将其设置为“最佳实践”。

相关问题