2014-09-22 88 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