0

我一直想在远程计算机上运行一些 ruby​​ 脚本(在 bash shell 中)

我可以创建一系列 bash 命令ruby -e "<command>",但其中一些脚本超过 100 行。

ruby -e使用 HEREDOC 或%{}&eval()不适用于单引号和双引号的混合。

有没有更好的方法来尝试这个?

编辑:

使用的协议是 Apple Remote Desktop,它在远程 shell 范围内执行这些命令。

4

4 回答 4

4

如果我理解正确,您想通过 SSH 或类似协议在远程机器上运行本地 ruby​​ 脚本。如果脚本是非交互式的(即不需要任何用户输入),您可以在本地创建它并通过stdin.

换句话说,首先编写脚本并将其保存在本地,例如foo.rb. 然后:

ssh remotehost ruby < foo.rb

启动 SSH 会话并执行远程 ruby​​ 解释器。在没有参数的情况下,ruby 解释器从标准输入执行命令,因此我们在标准输入上为 SSH 提供程序。

于 2012-08-29T18:16:01.363 回答
1

这有效:

cat << 'EOF' > /tmp/myscript.rb

# ruby script contents go here. any syntax is valid, except for your limit string (EOF)

EOF

ruby /tmp/myscript.rb;
rm /tmp/myscript.rb;

由于这不依赖于解释器二进制文件如何处理标准输入样式的命令,因此它也适用于大多数其他语言(python、perl、php)。

于 2012-09-14T18:33:33.980 回答
1

由于我还想通过 ARD 运行 ruby​​ 脚本(我认为它不能嵌入 ctrl-D),所以我首先认为您可以将 joraff 的解决方案(针对他自己的问题)与 Kelvin 的解决方案结合起来:

cat << ENDOFSCRIPT | ruby

#Here be code ...

ENDOFSCRIPT

这可以节省创建/删除文件。

但是还有一个更好的方法:

事实证明 (duh) ARD 嵌入了一个 EOF,或者只是以其他方式终止它发送的内容,您可以简单地执行以下操作:

ruby

#Paste whole script here

至少在 ARD 3.6.1 中有效。赢!

于 2013-01-20T23:58:36.510 回答
0

为什么不先将脚本发送过来?

scp foo.rb remotehost:
ssh remotehost "ruby foo.rb"

您甚至可以在以下情况下清理文件:

ssh remotehost "rm foo.rb"
于 2012-08-29T19:07:40.473 回答