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

spe*_*ool 3 ssh bash scp

我想定期将文件放在我的网络服务器的/ 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"
Run Code Online (Sandbox Code Playgroud)

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

spe*_*ool 5

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

tmp-scp.sh Screen\ shot\ 2010-02-18\ at\ 9.38.35\ AM.png
Run Code Online (Sandbox Code Playgroud)

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

scp SERVER:/var/www/tmp/Screen shot 2010-02-18 at 9.38.35 AM.png
Run Code Online (Sandbox Code Playgroud)

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

scp SERVER:"/var/www/tmp/Screen shot 2010-02-18 at 9.38.35 AM.png"
Run Code Online (Sandbox Code Playgroud)

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

#!/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"
Run Code Online (Sandbox Code Playgroud)