当我想通过 ssh 远程创建目录时,我遇到了 scala 问题。
通过 scala 的 ssh 命令,例如 date 或 ls,可以正常工作。
但是,当我运行时,例如
"ssh <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b1c4c2d4c3f1fcd0d8df9fddded2d0dd" rel="noreferrer noopener nofollow">[email protected]</a> 'mkdir Desktop/test'".!
我得到:bash: mkdir Desktop/test: 没有这样的文件或目录
res7: Int = 127
当我将命令复制粘贴到 shell 中时,它执行时没有任何问题。
有人知道这是怎么回事吗?
编辑:
我找到了这篇文章:sbt (Scala) via SSH results in command not found, but works if I do it myself
但是,我唯一能从中得到的就是使用要创建的目录的完整路径。然而,它仍然不起作用:(
谢谢!
最佳答案
ssh
不需要您将要运行的整个命令行作为单个参数传递。您可以向其传递多个参数,一个用于您要运行的命令,另一个用于您想要传递该命令的任何参数。
所以,如果没有单引号,这应该可以正常工作:
"ssh <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7b0e081e093b361a1215551714181a17" rel="noreferrer noopener nofollow">[email protected]</a> 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", "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="9aefe9ffe8dad7fbf3f4b4f6f5f9fbf6" rel="noreferrer noopener nofollow">[email protected]</a>", "mkdir Desktop/test")).!
Process(Seq("ssh", "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7207011700323f131b1c5c1e1d11131e" rel="noreferrer noopener nofollow">[email protected]</a>", "mkdir", "Desktop/test")).!
使用带有 Seq
的 Process.apply
形式可以消除参数之间边界的一层模糊性。但请注意,一旦命令到达远程主机,它将由远程 shell 处理,远程 shell 将自行决定将参数中断放在哪里。例如,如果您想创建一个名称中包含空格的目录,则可以在本地运行:
Process(Seq("mkdir", "foo bar")).!
但是如果你远程尝试同样的事情:
Process(Seq("ssh", "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1762647265575a767e79397b7874767b" rel="noreferrer noopener nofollow">[email protected]</a>", "mkdir", "foo bar")).!
您将获得两个名为 foo
和 bar
的目录,因为远程 shell 插入了一个参数中断。
关于bash - 使用scala通过ssh远程发出命令的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19942386/