Using a filename with spaces with scp and chmod in bash

12,766

It turns out that what is needed is to escape the path which will be sent to the remote server. Bash thinks the quotes in SERVER:"/var/www/tmp/$1" are related to the $1 and removes them from the final output. If I try to run:

tmp-scp.sh Screen\ shot\ 2010-02-18\ at\ 9.38.35\ AM.png

Echoing we see it is trying to execute:

scp SERVER:/var/www/tmp/Screen shot 2010-02-18 at 9.38.35 AM.png

If instead the quotes are escaped literals then the scp command looks more like you'd expect:

scp SERVER:"/var/www/tmp/Screen shot 2010-02-18 at 9.38.35 AM.png"

With the addition of some code to truncate the path the final script becomes:

#!/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"
Share:
12,766
IkeMtz
Author by

IkeMtz

Updated on June 08, 2022

Comments

  • IkeMtz
    IkeMtz almost 2 years

    Periodically, I like to put files in the /tmp directory of my webserver to share out. What is annoying is that I must set the permissions whenever I scp the files. Following the advice from another question I've written a script which copies the file over, sets the permissions and then prints the 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"
    

    When I replace SERVER with my actual host, everything works as expected...until I execute the script with an argument including spaces. Although I suspect the solution might be to use $@ I've not yet figured out how to get a spaced filename to work.