我有两台运行最新版本的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\(\)
另外,此行为的解释,将不胜感激。
你能说清楚以下哪些版本在本地机器和远程机器上运行:OS,shell(bash或cmd.exe),cygwin。另外,什么是'script.exe'?它是一个你编译的实际编译的可执行文件(以及什么工具链)? “bash”在什么地方出现?基本上,什么版本运行在哪里?此外,尝试远程编译和运行这个简单的C程序来回显正在传递的参数:http://snipplr.com/view/22593/ – 2014-09-22 19:01:03
@MichaelBurr当然,我会尽快回复。 – DMT 2014-09-22 19:05:29
@MichaelBurr我想我已经添加了所有你需要的信息。我现在要去做C程序。让我知道我是否错过了任何东西。至于bash来自哪里,我认为这是因为,虽然我从Windows cmd ssh,我连接到远程,通过cygwin运行一个bash shell运行的OpenSSH。可能是问题的一部分,使cmd.exe调用,然后由bash处理 – DMT 2014-09-22 19:20:39