cygwin ssh通过windows cmd删除双引号

时间:2014-09-22 17:20:57

标签: windows bash ssh cmd cygwin

我有两台运行最新版cygwin的Windows机器。我在两者上都配置了OpenSSH,并且已为远程计算机设置了无密码身份验证。我可以毫无问题地进入任何一台机器。 以下所有命令都在cmd.exe中执行

系统规格(两台机器相同):

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

我的问题的基本形式是这个。我必须在远程计算机上启动可执行文件。我必须通过Windows命令行通过ssh启动此可执行文件,而不是cygwin。该可执行文件有几个参数。其中一个参数需要封装在双引号内(因为我正在使用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\(\)

或者,可以理解对此行为的解释。

1 个答案:

答案 0 :(得分:0)

我想你想要:

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变得困惑,除非parens被转义,并且反斜杠似乎通过这个流程组装线足够远,以便在远程windows-with-cygwin机器上进行bash快乐。