ssh 不需要您将要运行的整个命令行作为单个参数传递。您可以向它传递多个参数,一个用于您要运行的命令,另一个用于您要传递该命令的任何参数。
所以,这应该可以正常工作,没有单引号:
"ssh user@Main.local mkdir Desktop/test"
这显示了如何在普通 bash shell 中获得相同的错误消息,而不涉及 ssh 或 Scala:
bash-3.2$ ls -d Desktop
Desktop
bash-3.2$ 'mkdir Desktop/test'
bash: mkdir Desktop/test: No such file or directory
bash-3.2$ mkdir Desktop/test
bash-3.2$
为了您的娱乐,还请注意:
bash-3.2$ mkdir 'mkdir Desktop'
bash-3.2$ echo echo foo > 'mkdir Desktop'/test
bash-3.2$ chmod +x 'mkdir Desktop'/test
bash-3.2$ 'mkdir Desktop/test'
foo
更新:
请注意,这两种方法也都有效:
Process(Seq("ssh", "user@Main.local", "mkdir Desktop/test")).!
Process(Seq("ssh", "user@Main.local", "mkdir", "Desktop/test")).!
使用带有Seq 的Process.apply 的形式消除了关于参数之间边界所在位置的一层歧义。但请注意,一旦命令到达远程主机,它将由远程 shell 处理,远程 shell 将自行决定将参数中断的位置。因此,例如,如果您想创建一个名称中带有空格的目录,则可以在本地使用:
Process(Seq("mkdir", "foo bar")).!
但如果你远程尝试同样的事情:
Process(Seq("ssh", "user@Main.local", "mkdir", "foo bar")).!
您将获得两个名为 foo 和 bar 的目录,因为远程 shell 插入了一个参数中断。