У меня есть две машины для окон, на которых установлена последняя версия 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\(\)
В качестве альтернативы, объяснение такого поведения была бы оценена.
Вы можете прояснить, какие версии следующих выполняются на локальном компьютере и удаленной машине: ОС, оболочка (bash или cmd.exe), cygwin. Кроме того, что такое 'script.exe'? Это фактический скомпилированный исполняемый файл, который вы скомпилировали (и с какой инструментальной цепочкой)? Где «bash» входит в картину? В принципе, какая версия того, что работает где? Кроме того, попробуйте выполнить компиляцию и запустить эту простую программу на удаленном компьютере для повторения переданных аргументов: http://snipplr.com/view/22593/ –
@MichaelBurr Конечно, я отвечу в ближайшее время. – DMT
@MichaelBurr Я думаю, что добавил всю вашу запрошенную информацию. Я собираюсь сделать программу на C сейчас. Дай мне знать, если я пропустил что-нибудь. Что касается того, откуда исходит bash, я думаю, что это потому, что, хотя я ssh из windows cmd, я подключаюсь к OpenSSH на удаленном компьютере, который проходит через cygwin, который запускает оболочку bash. Возможно, это часть проблемы, создавая вызовы cmd.exe, которые затем обрабатываются bash. – DMT