SCP命令中空格和选项处理的讨论

0x01 从注意到一个问题开始

scp是一个方便的远程-本地文件传输工具,但是最近遇到了一个情况,当远程或者本地路径存在空格的时候,scp命令往往失败。于是对解决方案和原理进行了一系列探讨。

先上解决方案:

scp somebody@172.16.1.1:'/path/to/filename\ that\ contains\ space' ./

这个解决方案直观又符合逻辑。即整个路径需要使用引号包围起来,而且路径内部的空格前也要加上 \ 转义字符。

究其原理,其实也挺简单。即引号这一块当作一个参数,然后scp将这个参数交给远端主机解析,远端主机却将路径中空格以后的部分当作参数了,所以才会返回 “Syntax Error”。

所以根据以上逻辑,我又测试了以下命令,发现均能正确传输文件:

scp 'somebody@172.16.1.1:/path/to/filename\ that\ contains\ space' ./
scp somebody@172.16.1.1:/path/to/filename'\ that\ contains\ space' ./

甚至根据这个逻辑,只要你不怕麻烦,以下指令依然可以运行:

scp root@172.16.1.1:/path/to/filename'\ 'that'\ 'contains'\ 'space' ./

总而言之,打引号的目的其实只是骗过shell,将这一整个路径当作一个参数看待。

发表评论