2014-09-22 93 views
1

我有兩臺運行最新版本的cygwin的Windows機器。我在他們兩個上配置了OpenSSH,並且爲遠程機器設置了無密碼驗證。我可以在沒有任何問題的情況下進入任一機器以下所有命令都在cmd.exe中執行。通過Windows CMD cygwin ssh刪除雙引號

系統規範(用於兩個機器相同):

  • Cygwin的版本32年7月1日
  • 視窗7
  • 版本從CMD返回 「的Microsoft Windows [版本6.1.7601]」
  • ř 2.14.1

我的問題的基本形式是這樣的。我必須在遠程機器上啓動一個可執行文件。我必須通過Windows命令行通過ssh啓動此可執行文件,而不是cygwin。該可執行文件有幾個參數。其中一個參數需要封裝在雙引號內(因爲我正在使用R中的第三方軟件包,它調用system(),並且一個參數需要一個字符串)。實際參數是-e「parallel :::.orderRSOCK()」

下面調用的script.exe是文件Rscript.exe。這與任何(據我所知)R安裝。我沒有創建它,編譯它,或任何東西。它只是被我試圖調試的軟件包所利用,因爲它允許你在R控制檯gui之外執行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()"' 

不作一大堆的道理給我,因爲我設法逃脫第二個引號,但第一消失,而我在平行之前留下了一個「\」。

編輯

這其中,作爲答案

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() 

鈣LL:

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

返回:

"hello()" 

電話:

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

返回:

hello\(\) 

另外,此行爲的解釋,將不勝感激。

+0

你能說清楚以下哪些版本在本地機器和遠程機器上運行:OS,shell(bash或cmd.exe),cygwin。另外,什麼是'script.exe'?它是一個你編譯的實際編譯的可執行文件(以及什麼工具鏈)? 「bash」在什麼地方出現?基本上,什麼版本運行在哪裏?此外,嘗試遠程編譯和運行這個簡單的C程序來回顯正在傳遞的參數:http://snipplr.com/view/22593/ – 2014-09-22 19:01:03

+0

@MichaelBurr當然,我會盡快回復。 – DMT 2014-09-22 19:05:29

+0

@MichaelBurr我想我已經添加了所有你需要的信息。我現在要去做C程序。讓我知道我是否錯過了任何東西。至於bash來自哪裏,我認爲這是因爲,雖然我從Windows cmd ssh,我連接到遠程,通過cygwin運行一個bash shell運行的OpenSSH。可能是問題的一部分,使cmd.exe調用,然後由bash處理 – DMT 2014-09-22 19:20:39

回答

0

我想你想:

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

老實說,我不能完全解釋引用的理由(或什麼的擰它,如果它是一個錯誤),但我認爲這會爲你工作:

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

併發症似乎是事物解析命令線(S)的步驟如下:

  1. 窗口s cmd.exe獲取並解析整個東西
  2. ssh發送「c:/Path/script.exe -e \」並行:::。slaveRSOCK()\「」部分到遠程的sshd Windows主機。我不確定sshd以何種形式獲取此命令行,或者確切地說它可能會對其執行哪些轉換。
  3. sshd明顯調用bash來運行命令(通過一些cygwin機制?)。同樣,我不確定命令行的確切形式是什麼。
  4. bash會感到困惑,除非parens被轉義,並且反斜槓似乎已經足夠遠了,通過這個流程的流水線可以使遠程windows-cygwin機器上的bash變得快樂起來。
+0

我編輯我的答案,顯示該調用的結果,這也是一個非常奇怪的結果。 – DMT 2014-09-22 18:13:12

+0

現在我得到一個R錯誤,這是很好的(不同的),所以我需要處理,然後才能測試出答案。同時,我在使用echo的不同轉義行爲問題的底部添加了簡單的示例,這可能會提供一些有價值的見解 – DMT 2014-09-22 20:43:28