我一直想在远程计算机上运行一些 ruby 脚本(在 bash shell 中)
我可以创建一系列 bash 命令ruby -e "<command>"
,但其中一些脚本超过 100 行。
ruby -e
使用 HEREDOC 或%{}
&eval()
不适用于单引号和双引号的混合。
有没有更好的方法来尝试这个?
编辑:
使用的协议是 Apple Remote Desktop,它在远程 shell 范围内执行这些命令。
如果我理解正确,您想通过 SSH 或类似协议在远程机器上运行本地 ruby 脚本。如果脚本是非交互式的(即不需要任何用户输入),您可以在本地创建它并通过stdin
.
换句话说,首先编写脚本并将其保存在本地,例如foo.rb
. 然后:
ssh remotehost ruby < foo.rb
启动 SSH 会话并执行远程 ruby 解释器。在没有参数的情况下,ruby 解释器从标准输入执行命令,因此我们在标准输入上为 SSH 提供程序。
这有效:
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)。
由于我还想通过 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 中有效。赢!
为什么不先将脚本发送过来?
scp foo.rb remotehost:
ssh remotehost "ruby foo.rb"
您甚至可以在以下情况下清理文件:
ssh remotehost "rm foo.rb"