使用scala通过ssh远程发出命令的问题

时间:2013-11-12 23:47:17

标签: bash scala ssh scala-2.10

当我想通过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

然而,我唯一可以从中获取的是使用要创建的目录的完整路径。但是,它仍然不起作用:(

谢谢!

1 个答案:

答案 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。