当我想通过ssh远程创建目录时,我遇到了scala问题。
通过scala的ssh命令,例如date或ls,运行正常。
然而,当我跑步时
"ssh user@Main.local 'mkdir Desktop/test'".!
我得到:bash: mkdir Desktop/test: No such file or directory
res7: Int = 127
当我将命令复制粘贴到我的shell中时,它会毫无问题地执行。
有人知道发生了什么吗?
修改
我发现了这篇文章:sbt (Scala) via SSH results in command not found, but works if I do it myself
然而,我唯一可以从中获取的是使用要创建的目录的完整路径。但是,它仍然不起作用:(
谢谢!
答案 0 :(得分:3)
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")).!
使用带有Process.apply
的{{1}}形式可以消除关于参数之间边界位置的一定程度的歧义。但请注意,一旦命令到达远程主机,它将由远程shell处理,它将自己决定将参数中断放置在何处。因此,例如,如果您想创建名称中包含空格的目录,则可在本地使用:
Seq
但如果你远程尝试同样的事情:
Process(Seq("mkdir", "foo bar")).!
您将获得两个名为Process(Seq("ssh", "user@Main.local", "mkdir", "foo bar")).!
和foo
的目录,因为远程shell会插入一个参数break。