私のマシンから別のマシンにファイルをコピーするために使用する bash スクリプトがありますscp
。SSH パスワードを入力すると、スクリプトはエラーで終了し続けます。
<filename>: No such file or directory
しかし、スクリプトでファイルをチェックすると、問題はありません。set -o verbose
最初に確認したところ、スクリプトの最後に次のような結果が出ました。
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
そこで、出力されたコマンドを実行してみたところscp
、問題なくコピーされました。何が間違っているのでしょうか???
答え1
何をしているのかよく分かりませんが、例にあるコマンドを試してみると、次のようになります。
$ scp /home/saml/projects/Cooks.com\ -\ Recipe\ -\ Coconut\ Chicken.mht \
root@remotey:"/root/some spaced out file.mht"
scp: ambiguous target
これは、ターゲット パスを引用符で囲んでおり、スペースをエスケープするバックスラッシュも含まれているためです。ただし、現在のシェルが二重引用符を剥がすと、単一のバックスラッシュも剥がされ、ターゲット パスはスペースを含む裸の文字列のままになります。スペースが正しくエスケープされるように、さらにネストするには、次のいずれかを実行する必要があります。
例
方法 1 - 二重引用符、一重引用符
$ scp /path/with\ spaces/file\ with\ spaces.txt \
user@remotey:"'/home/user/some spaced out file.txt'"
方法 2 - シングルクォート、ダブルクォート
$ scp /path/with\ spaces/file\ with\ spaces.txt \
user@remotey:'"/home/user/some spaced out file.txt"'
方法3 - シングルクォート、バックスラッシュ
$ scp /path/with\ spaces/file\ with\ spaces.txt \
user@remotey:'/home/user/some\ spaced\ out\ file.txt'
方法 4 - 二重引用符、バックスラッシュ
$ scp /path/with\ spaces/file\ with\ spaces.txt \
user@remotey:"/home/user/some\ spaced\ out\ file.txt"
方法5 - 3つのバックスラッシュ
$ scp /path/with\ spaces/file\ with\ spaces.txt \
user@remotey:/home/user/some\\\ spaced\\\ out\\\ file.txt