2014-09-22 2 views
1

У меня есть две машины для окон, на которых установлена ​​последняя версия cygwin. У меня есть OpenSSH, настроенный на обоих из них, и для удаленного компьютера была настроена аутентификация без пароля. Я без проблем смогу ssh в любую машину. Все команды, приведенные ниже, выполняются в cmd.exe.cygwin ssh через windows cmd удаляет двойные кавычки

Спецификация системы (одинакова для обеих машин):

  • Cygwin версия 1.7.32
  • Windows 7
  • версии из CMD возвращает "Microsoft Windows [Version 6.1.7601]"
  • R 2.14.1

Основная форма моей проблемы заключается в следующем. Я должен запустить исполняемый файл на моей удаленной машине. Я должен запустить этот исполняемый файл через командную строку ssh через windows, а не cygwin. Этот исполняемый файл имеет пару параметров. Один из этих параметров должен быть инкапсулирован в двойные кавычки (потому что я работаю с сторонним пакетом в R, что делает вызов system(), и один параметр ожидает строку). Фактический параметр -e "parallel :::. SlaveRSOCK()"

Файл сценария.exe, называемый ниже, является файлом Rscript.exe. Это связано с любыми (насколько мне известно) установкой R. Я его не создавал, не компилировал, ни что-либо. Он просто используется пакетом, который я пытаюсь отлаживать, так как он позволяет выполнять команды R вне консоли консоли R. Пакет, который я пытаюсь отлаживать, является «параллельным», который я использую для запуска параллельных процессов на удаленных машинах. У меня также не было никакой руки при создании или компиляции этого кода.

Возможно, ненужная дополнительная информация, но часть пакета, который я пытаюсь отлаживать, - это функция, которая закручивает процесс на удаленной машине. Эта функция создает команду с заданными параметрами и выполняет эту команду в cmd.exe. Я пытаюсь реплицировать команду и выполнять вручную, так как при запуске реального пакета процесс просто зависает.

Если бы я начинал исполняемый на моей машины, я хотел бы сделать следующее, в окнах CMD.

C:\Path\script.exe -e "parallel:::.slaveRSOCK()" 

И это прекрасно работает. Также работает установка ssh-соединения на удаленную машину и последующее выполнение этой команды (смена C на c).

Но, когда я делаю следующий вызов для запуска этого сценария на дистанционного машины от моей машины

ssh remoteHost c:/Path/script.exe -e "parallel:::.slaveRSOCK()" 

Я получаю следующую ошибку

bash: -c: line 0: syntax error near unexpected token '(' 
bash: -c: line 0: 'c:/Path/script.exe -e parallel:::.slaveRSOCK()' 

Так что я имею потерял двойные кавычки, очевидно, что я не убегаю их правильно. Я попробовал следующий вызов.который был близок

ssh remoteHost c:/Path/script.exe -e \"parallel:::.slaveRSOCK()\" 

но вторая линия ошибки дала мне

bash: -c: line 0: 'c:/Path/script.exe -e \parallel:::.slaveRSOCK()"' 

не делает много смысла для меня, так как мне удалось избежать второй цитаты, но первый исчезает , и я остался с a \ перед параллелью.

EDIT

Это один, как это было предложено в одном из ответов

ssh remoteHost "c:/Path/script.exe -e \"parallel:::.slaveRSOCK()\"" 

дал мне следующую ошибку

bash: -c: line 0: 'c:/Path/script.exe -e \parallel:::.slaveRSOCK()\' 

также довольно странный результат, мы теряем и дважды котировки, но сохраняют ограничения

Я также пробовал различные комбинации двойных кавычек (одиночные кавычки) вокруг всей команды после ssh remoteHost и используя^для выхода, но теперь он довольно сильно превратился в съемку в темноте, поэтому я подумал, что это может быть хорошая идея обратиться к людям, более осведомленным, чем я.

Любая помощь или понимание, которые могут быть предоставлены, очень ценятся. Если есть какие-либо вопросы, дайте мне знать.

EDIT 2

Вот несколько простых примеров нечетным миновать, что происходит.

вызовов:

ssh otherhost echo \"hello()\" 

Возвращает:

bash: -c: line 0: unexpected EOF while looking for matching '"' 
bash: -c: line 0: syntax error: unexpected end of file 

вызовов:

ssh otherhost echo \"hello()" 

Возвращает:

hello() 

Ca ЛЛ:

ssh otherhost echo '\"hello()\" ' 

Возвращает:

"hello()" 

Вызов:

ssh otherhost echo "\"hello()\"" 

Возвращает:

hello\(\) 

В качестве альтернативы, объяснение такого поведения была бы оценена.

+0

Вы можете прояснить, какие версии следующих выполняются на локальном компьютере и удаленной машине: ОС, оболочка (bash или cmd.exe), cygwin. Кроме того, что такое 'script.exe'? Это фактический скомпилированный исполняемый файл, который вы скомпилировали (и с какой инструментальной цепочкой)? Где «bash» входит в картину? В принципе, какая версия того, что работает где? Кроме того, попробуйте выполнить компиляцию и запустить эту простую программу на удаленном компьютере для повторения переданных аргументов: http://snipplr.com/view/22593/ –

+0

@MichaelBurr Конечно, я отвечу в ближайшее время. – DMT

+0

@MichaelBurr Я думаю, что добавил всю вашу запрошенную информацию. Я собираюсь сделать программу на C сейчас. Дай мне знать, если я пропустил что-нибудь. Что касается того, откуда исходит bash, я думаю, что это потому, что, хотя я ssh из windows cmd, я подключаюсь к OpenSSH на удаленном компьютере, который проходит через cygwin, который запускает оболочку bash. Возможно, это часть проблемы, создавая вызовы cmd.exe, которые затем обрабатываются bash. – DMT

ответ

0

Я думаю, что вы хотите:

ssh remoteHost "c:/Path/script.exe -e \"parallel:::.slaveRSOCK()\"" 

Я честно не могу полностью объяснить причины, лежащие в кавычки (или то, что он все испортил, если это ошибка), но я думаю, что это будет работать для вас:

ssh remoteHost "c:/Path/script.exe -e \"parallel:::.slaveRSOCK\(\)\"" 

усложнение кажется следующая последовательность вещей разборе командной строки (ы):

  1. Window s cmd.exe на локальном компьютере получает и анализирует все это.
  2. ssh отправляет параллельную часть :: c: /Path/script.exe -e \ "параллельной :::. slaveRSOCK() \" "на sshd на пульте дистанционного управления Хост Windows. Я не уверен, в какой форме sshd получает эту командную строку или какие именно преобразования она может с ней поделать.
  3. sshd, по-видимому, вызывает bash для запуска команды (тщательный механизм cygwin?). Опять же, я не уверен в точной форме командной строки, которая попадает в bash.
  4. bash запутывается, если только параны не сбегают, а обратные косые черты, похоже, достаточно далеко продвигаются по этой линии сборки процессов, чтобы сделать удачу на удаленной машине windows-with-cygwin счастливой.
+0

. Я отредактировал свой ответ, чтобы показать результат этого вызова, а также довольно странный результат. – DMT

+0

Теперь я получаю R-ошибку, которая хороша (другая), поэтому мне нужно будет обработать это, прежде чем я смогу проверить ваш ответ. Тем временем я добавил простые примеры в нижнюю часть моего вопроса о различном стиле экранирования, используя эхо, возможно, это обеспечит небольшую проницательность – DMT

Смежные вопросы