3

I have a bash script that uses scp to copy a file from my machine to another. The script keeps on exiting after I enter the SSH password with the error:

<filename>: No such file or directory 

Yet, in the script, I check the file, and it is just fine. I did set -o verbose at the beginning and here's what I get at the end of the script:

scp /Volumes/FX4\ HDD/Users/matthewdavies/Downloads/NCIS.S11E01.HDTV.x264-LOL.mp4 [email protected]:"/media/3TB/TV\ Shows/NCIS" [email protected]'s password: /Volumes/FX4\ HDD/Users/matthewdavies/Downloads/NCIS.S11E01.HDTV.x264-LOL.mp4: No such file or directory 

So, I tried executing the scp command as outputted and it was fine; it copied. What's going wrong???

12
  • try with scp /Volumes/FX4\ HDD/Users/matthewdavies/Downloads/NCIS.S11E01.HDTV.x264-LOL.mp4 [email protected]:"/media/3TB/TV Shows/NCIS" Commented Oct 2, 2013 at 5:59
  • What's the difference between that and what I pasted there? And it says "scp: ambiguous target" because it's missing a ``, but I added that in, and it works just fine… Commented Oct 2, 2013 at 6:06
  • you don't have to escape the whitespace ` ` in double-quotes. actually, I think it had to be scp /Volumes/FX4\ HDD/Users/matthewdavies/Downloads/NCIS.S11E01.HDTV.x264-LOL.mp4 "[email protected]:/media/3TB/TV Shows/NCIS" because the last part(destination) is counted as a whole argument. Commented Oct 2, 2013 at 6:12
  • Sorry…I meant it's missing a \ in the remote dir. Commented Oct 2, 2013 at 6:22
  • @thkang see my updated question… Commented Oct 2, 2013 at 6:26

1 Answer 1

4

I'm not entirely sure what you're doing, but when I try the command you have in your example I get the following:

$ scp /home/saml/projects/Cooks.com\ -\ Recipe\ -\ Coconut\ Chicken.mht \ root@remotey:"/root/some spaced out file.mht" scp: ambiguous target 

This is because you're quoting the target path and it also includes backslashes which are escaping the spaces. However when the current shell peels off the double quote, it will also peel off the single backslash, leaving the target path as a bare string with spaces. You need to do one of the following to nest it further, so that the spaces are correctly escaped:

Examples

method #1 - double quote, single quote

$ scp /path/with\ spaces/file\ with\ spaces.txt \ user@remotey:"'/home/user/some spaced out file.txt'" 

method #2 - single quote, double quote

$ scp /path/with\ spaces/file\ with\ spaces.txt \ user@remotey:'"/home/user/some spaced out file.txt"' 

method #3 - single quote, backslash

$ scp /path/with\ spaces/file\ with\ spaces.txt \ user@remotey:'/home/user/some\ spaced\ out\ file.txt' 

method #4 - double quote, backslash

$ scp /path/with\ spaces/file\ with\ spaces.txt \ user@remotey:"/home/user/some\ spaced\ out\ file.txt" 

method #5 - triple backslashes

$ scp /path/with\ spaces/file\ with\ spaces.txt \ user@remotey:/home/user/some\\\ spaced\\\ out\\\ file.txt 
1
  • No, the destination is correct. "foo\ bar" is equivalent to 'foo\ bar', not 'foo bar' — a backslash between double quotes is only erased if it's followed by \"$, backquote or newline. Commented Oct 2, 2013 at 23:56

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.