簡體   English   中英

通過Windows cmd的cygwin ssh刪除雙引號

[英]cygwin ssh via windows cmd removes double quotes

我有兩台運行最新版cygwin的Windows機器。 我在兩者上都配置了OpenSSH,並且為遠程計算機設置了無密碼身份驗證。 我可以毫無問題地插入任何一台機器。 下面的所有命令都在cmd.exe中執行

系統規格(兩台機器相同):

  • Cygwin版本1.7.32
  • Windows 7的
  • 來自cmd的ver返回“ Microsoft Windows [Version 6.1.7601]”
  • R 2.14.1

我的問題的基本形式是這樣。 我必須在遠程計算機上啟動一個可執行文件。 我必須通過Windows命令行而不是cygwin通過ssh啟動此可執行文件。 該可執行文件有兩個參數。 這些參數之一需要封裝在雙引號中(因為我正在使用R中的第三方程序包,這會調用system(),而一個參數需要一個字符串)。 實際參數是-e“ parallel :::。slaveRSOCK()”

下面調用的script.exe是文件Rscript.exe。 這隨R的任何安裝(據我所知)一起提供。我沒有創建,編譯或任何東西。 我正嘗試調試的軟件包僅使用它,因為它允許您在R控制台gui之外執行R命令。 我要調試的程序包是“並行”程序,用於在遠程計算機上運行並行進程。 在創建或編譯此代碼時,我也沒有任何幫助。

也許不需要其他信息,但是我要調試的程序包部分是在遠程計算機上啟動進程的功能。 該函數將在給定一些參數的情況下開發一個命令,並在cmd.exe中執行此命令。 我正在嘗試復制命令並手動執行,因為在實際包中運行時,過程只是掛起了。

如果我開始在我的機器上的可執行文件,我將做到以下幾點,在windows 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之后,我還嘗試在整個命令周圍使用雙引號(單引號)進行各種組合,並使用^進行轉義,但是現在它幾乎變成了在黑暗中拍照,因此我認為這可能是求助於比我知識淵博的人的好主意。

可以提供的任何幫助或見解均深表感謝。 如有任何問題,請通知我。

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

呼叫:

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

返回:

"hello()"

呼叫:

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

返回:

hello\(\)

替代地,將理解該行為的解釋。

我想你要:

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

老實說,我無法完全解釋該報價背后的原因(如果是錯誤,又有什么原因呢?),但我認為這對您有用:

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

復雜的情況似乎是解析命令行的以下順序:

  1. 本地計算機上的Windows cmd.exe獲取並解析整個內容
  2. ssh將“ c:/Path/script.exe -e \\” parallel :::。slaveRSOCK()\\“部分發送到遠程Windows主機上的sshd。 我不確定sshd以哪種形式獲取此命令行,或者究竟可以對其進行哪些轉換。
  3. sshd顯然會調用bash來運行命令(通過某種cygwin機制?)。 同樣,我不確定bash的命令行的確切格式。
  4. 除非逃脫括號,否則bash會感到困惑,並且反斜線似乎已經通過此過程的裝配線走得足夠遠,以使遠程Windows-cygwin機器上的bash滿意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM