在 SCP 中转义用户名空间

cav*_*llo 8 ssh scp

我一直在玩 SCP,我已经能够将文件从一个地方传输到另一个地方。一切都很好,直到我需要将文件从 Ubuntu 复制到用户名中有空格的 Windows 用户 (* groan *)

虽然我让它像这样为 SSH 工作:

ssh "User Name Spaces"@192.168.0.42
Run Code Online (Sandbox Code Playgroud)

它不适用于 SCP:

scp "myfile.txt" "User Name Spaces"@192.168.0.42:folder
Run Code Online (Sandbox Code Playgroud)

当它返回时:

User Name Spaces: invalid user name
Run Code Online (Sandbox Code Playgroud)

我尝试了各种方法:

scp "myfile.txt" "User Name Spaces"@192.168.0.42:folder
scp "myfile.txt" "User\ Name\ Spaces"@192.168.0.42:folder
scp "myfile.txt" "User\\ Name\\ Spaces"@192.168.0.42:folder
scp "myfile.txt" "User\\\ Name\\\ Spaces"@192.168.0.42:folder
scp "myfile.txt" "'User Name Spaces'"@192.168.0.42:folder
scp "myfile.txt" "'User\ Name\ Spaces'"@192.168.0.42:folder
scp "myfile.txt" "'User\\ Name\\ Spaces'"@192.168.0.42:folder
scp "myfile.txt" "'User\\\ Name\\\ Spaces'"@192.168.0.42:folder
scp "myfile.txt" "'User Name Spaces'@192.168.0.42":folder
Run Code Online (Sandbox Code Playgroud)

等等......但似乎没有任何效果

有没有人有任何想法?

mur*_*uru 8

你可以使用~/.ssh/config. 它是 SSH 的每用户配置文件(以及基于 SSH 的命令,如scpsftp)。创建它,如果它不存在,并添加:

Host 192.168.0.42
    User "User Name Spaces"
Run Code Online (Sandbox Code Playgroud)

例如:

Host localhost
    User "foo bar"
Run Code Online (Sandbox Code Playgroud)

然后:

$ scp test.txt  localhost:
foo bar@localhost's password: 
Run Code Online (Sandbox Code Playgroud)

(我实际上没有名为 的用户foo bar,所以我无法完成测试。)


您还可以在.ssh/config以下位置创建别名:

Host foo
    Hostname 192.168.0.42
    User "User Name Spaces"
Run Code Online (Sandbox Code Playgroud)

然后您可以方便地执行以下操作:

ssh foo
scp file foo:
Run Code Online (Sandbox Code Playgroud)

并避免必须键入整个 IP 地址。


另一种选择,如果你有tar两端可用:

tar c myfile.txt | ssh "User Name Spaces"@192.168.0.42 tar x
Run Code Online (Sandbox Code Playgroud)

tar创建一个 tar 存档,保存到标准输出并通过管道传输到 SSH,在那里它成为 的输入tar x,它提取存档。您可以使用诸如-C更改目录之类的选项(或在tar:之前作为 shell 命令执行此操作ssh … 'cd foo; tar x)。您还可以使用压缩并在网络带宽上节省一点:

tar zc myfile.txt | ssh "User Name Spaces"@192.168.0.42 tar zx
Run Code Online (Sandbox Code Playgroud)