Ruby中使用curl进行系统调用的正确语法是什么?

7
为了刷新Redmine,我需要在post-commit钩子中使用SVN来ping我们的Redmine安装。我们的post-commit钩子是一个生成电子邮件的Ruby脚本。我想插入一个调用来执行以下操作: curl --insecure https://redmineserver+webappkey 这个调用在命令行中可以正常工作,但当我尝试执行以下操作时:
#!/usr/bin/ruby -w

REFRESH_DRADIS_URL = "https://redmineserver+webappkey"
system("/usr/bin/curl", "--insecure", "#{REFRESH_DRADIS_URL}")

它不起作用。我该如何在Ruby中实现这个功能?我搜索了“ruby system curl”,但只得到了一堆链接,这些链接是将curl集成到Ruby中(这不是我感兴趣的内容)。


1
顺便说一下:字符串插值的无用使用。 - Jörg W Mittag
4个回答

7

许多方法

来进行IT技术方面的操作。

REFRESH_DRADIS_URL = "https://redmineserver+webappkey"
result = `/usr/bin/curl --insecure #{REFRESH_DRADIS_URL}`

但我认为您不必使用curl。试试这个

require 'open-uri'
open(REFRESH_DRADIS_URL)

如果证书无效,则情况会变得更加复杂。
require 'net/https'
http = Net::HTTP.new("amazon.com", 443)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
resp, data = http.get("/")

我遇到了一个错误。(StackOverflow不允许我打印整个错误信息,所以这里只有“重要部分”)。警告:提交后钩子失败(退出代码1),输出如下: /usr/lib/ruby/1.8/net/http.rb:586:in `connect': SSL_connect返回=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError) - Son of the Wai-Pan
open("#{REFRESH_DRADIS_URL}") 可以简化为 open(REFRESH_DRADIS_URL) - eric
谢谢,那就是你复制粘贴的后果。 - Jonas Elfström

6
system ("curl --insecure #{url}")

你如何存储 curl 调用的结果?我只对 HTTP 状态码感兴趣。 - dialex

4

对于这样一个简单的问题,我不会费心去使用 curl 命令,而是直接执行以下操作:

require 'net/https'

http = Net::HTTP.new('redmineserver+webappkey', 443)

http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

http.get('/')

对于更复杂的问题,我仍然不会使用curl,而是使用众多的Ruby libcurl绑定之一。


选择这个作为答案,因为它是最接近我所使用的解决方案。对于新手来说,Ruby中HTTP.new()的第一个参数是服务器的URI。http.get()将以/as开头的URL作为参数。 - Son of the Wai-Pan

1

最近我也遇到了同样的问题,尝试了以下方法,成功解决:

test.rb

class CurlTest
   def initialize()
   end
   def dumpCurl
      test = `curl -v https://google.com 2>&1`
      puts test
   end
end

curlTest = CurlTest.new()
curlTest.dumpCurl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接