我有两台运行最新版cygwin的Windows机器。我在两者上都配置了OpenSSH,并且已为远程计算机设置了无密码身份验证。我可以毫无问题地进入任何一台机器。 以下所有命令都在cmd.exe中执行。
系统规格(两台机器相同):
我的问题的基本形式是这个。我必须在远程计算机上启动可执行文件。我必须通过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\(\)
或者,可以理解对此行为的解释。
答案 0 :(得分:0)
我想你想要:
ssh remoteHost "c:/Path/script.exe -e \"parallel:::.slaveRSOCK()\""
老实说,我无法完全解释引用背后的原因(或者如果它是一个错误,那么它会搞砸了),但我认为这对您有用:
ssh remoteHost "c:/Path/script.exe -e \"parallel:::.slaveRSOCK\(\)\""
复杂化似乎是解析命令行的以下序列: