【发布时间】:2014-11-16 18:02:14
【问题描述】:
我有两台运行最新版本 cygwin 的 Windows 机器。我在它们上都配置了 OpenSSH,并且已经为远程机器设置了无密码身份验证。我可以毫无问题地通过 ssh 进入任何一台机器。 以下所有命令均在 cmd.exe 中执行。
系统规格(两台机器相同):
- Cygwin 版本 1.7.32
- Windows 7
- 来自 cmd 的版本返回“Microsoft Windows [版本 6.1.7601]”
- R 2.14.1
我的问题的基本形式是这样的。我必须在我的远程机器上启动一个可执行文件。我必须通过 ssh 通过 windows 命令行启动这个可执行文件,而不是 cygwin。该可执行文件有几个参数。其中一个参数需要用双引号封装(因为我正在使用 R 中的第三方包,它调用 system(),并且一个参数需要一个字符串)。实际参数是-e "parallel:::.slaveRSSOCK()"
下面调用的 script.exe 是文件 Rscript.exe。这伴随着 R 的任何(据我所知)安装。我没有创建、编译它或任何东西。它只是由我尝试调试的包使用,因为它允许您在 R 控制台 gui 之外执行 R 命令。我要调试的包是“并行”的,我用它在远程机器上运行并行进程。我也没有参与创建或编译此代码。
也许不需要额外的信息,但我试图调试的包部分是在远程机器上启动进程的函数。这个函数开发一个命令,给定一些参数,并在 cmd.exe 中执行这个命令。我正在尝试复制命令并手动执行,因为在运行实际包时,该过程只是挂起。
如果我在 my 机器上启动可执行文件,我会在 windows cmd 中执行以下操作。
C:\Path\script.exe -e "parallel:::.slaveRSOCK()"
这很好用。建立与远程机器的 ssh 连接并随后运行此命令(将 C 更改为 c)也可以。
但是,当我在 remote 机器上从我的机器上启动此脚本时进行以下调用
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\(\)
或者,对此行为的解释将不胜感激。
【问题讨论】:
-
你能说清楚以下哪些版本在本地机器和远程机器上运行:OS、shell(bash 或 cmd.exe)、cygwin。另外,
script.exe是什么?它是您编译的实际编译的可执行文件(以及使用什么工具链)?bash出现在哪里?基本上,什么版本在哪里运行?另外,尝试远程编译和运行这个简单的 C 程序来回显正在传递的参数:snipplr.com/view/22593 -
@MichaelBurr 没问题,我会尽快回复。
-
@MichaelBurr 我想我已经添加了您要求的所有信息。我现在要做C程序。如果我错过了什么,请告诉我。至于 bash 的来源,我认为这是因为,当我从 windows cmd ssh 时,我连接到远程上的 OpenSSH,它通过运行 bash shell 的 cygwin 运行。可能是问题的一部分,进行 cmd.exe 调用,然后由 bash 处理
标签: windows bash ssh cmd cygwin