【问题标题】:cygwin ssh via windows cmd removes double quotes通过 windows cmd 的 cygwin ssh 删除双引号
【发布时间】: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


【解决方案1】:

我想你想要:

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 会感到困惑,并且反斜杠似乎通过这个流程装配线足够远,以使远程 windows-with-cygwin 机器上的 bash 快乐。

【讨论】:

  • 我编辑了答案以显示该调用的结果,这也是一个非常奇怪的结果。
  • 我现在收到一个 R 错误,这很好(不同),所以我需要先处理它,然后才能测试你的答案。同时,我在使用 echo 的不同转义行为的问题的底部添加了简单的示例,也许这会提供一些见解
猜你喜欢
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 2021-12-07
  • 2016-03-05
  • 2019-08-11
  • 2017-11-20
  • 2015-01-01
  • 2019-02-15
相关资源
最近更新 更多