Проблемы с использованием Scala для удаленного ввода команд через SSH
У меня проблема со scala, когда я хочу создать каталог удаленно через ssh.
Команды ssh через scala, такие как date или ls, работают нормально.
Тем не менее, когда я бегу, например,
"ssh user@Main.local 'mkdir Desktop/test'".!
Я получил: bash: mkdir Desktop/test: No such file or directory
res7: Int = 127
Когда я копирую и вставляю команду в свою оболочку, она выполняется без проблем.
Кто-нибудь знает, что происходит?
РЕДАКТИРОВАТЬ:
Я нашел этот пост: sbt (Scala) через SSH приводит к тому, что команда не найдена, но работает, если я делаю это сам
Тем не менее, единственное, что я могу от него убрать - это использовать полный путь для создаваемого каталога. Тем не менее, это все еще не работает:(
Спасибо!
1 ответ
ssh
не требует, чтобы вы передавали всю командную строку, которую хотите запустить, как один аргумент. Вам разрешено передавать ему несколько аргументов, один для команды, которую вы хотите запустить, и больше для любых аргументов, которые вы хотите передать этой команде.
Таким образом, это должно работать нормально, без одинарных кавычек:
"ssh user@Main.local mkdir Desktop/test"
Здесь показано, как получить то же сообщение об ошибке в обычной оболочке bash, без использования 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
это занимает Seq
устраняет один уровень неопределенности относительно того, где лежат границы между аргументами. Но обратите внимание, что как только команда достигнет удаленного хоста, она будет обработана удаленной оболочкой, которая примет собственное решение о том, куда поместить аргументы break. Так, например, если вы хотите создать каталог с пробелом в имени, это работает локально:
Process(Seq("mkdir", "foo bar")).!
но если вы попробуете то же самое удаленно:
Process(Seq("ssh", "user@Main.local", "mkdir", "foo bar")).!
Вы получите две директории с именем foo
а также bar
, поскольку удаленная оболочка вставляет аргумент break.