【问题标题】:Ruby and Sinatra: where does this extra string come from and how to eliminate it?Ruby 和 Sinatra:这个额外的字符串是从哪里来的以及如何消除它?
【发布时间】:2013-11-29 11:54:31
【问题描述】:

“routes.rb”中的部分代码,

...
post '/csr' do
  text = PkiSupport::display_csr('/etc/pki/subordinate_ca.csr')
  erb :download_csr, :locals => { :csr => text }
end

在“PkiSupport.rb”中

...
def display_csr(csr_file)
  text = `more #{csr_file}`
  return text
end

在“download_csr.erb”中

...
<form id="csr-form" action="<%= url "/subordinate_ca/csr" %>" method="post">
  <h4>csr</h4>
  <textarea cols="80" rows="36" name="csr">
    <%= csr %>
  </textarea>
</form>

思路很简单,当用户选择“/csr”时,shell命令“more ...”会被执行,输出字符串会显示在表单的textarea中。

它确实显示正确,但包含额外的前置字符串(如下),它是“-----BEGIN...”之前的任何内容。那么如何预防呢?

      ::::::::::::::
/etc/pki/subordinate_ca.csr
::::::::::::::
-----BEGIN CERTIFICATE REQUEST-----
MIIFATCCAukCAQAwaDETMBEGCgmSJomT8ixkARkWA2NvbTETMBEGCgmSJomT8ixk
ARkWA3h5ejEQMA4GA1UECgwHWFlaIEluYzESMBAGA1UECwwJTWFya2V0aW5nMRYw
FAYDVQQDDA0xMC4xMC4xMzAuMTU4MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
CgKCAgEAruWYRn7mjZkHeD+PPLpMSBRoYnLKNvYMte9XneFDh1TItLolYhM4bmWX
gewKOO9+kNY21CoVu1jYZ3q9WitgJlS3tMHPhc6IjuY9DfQ58aeJaZHO8+ISE3Op
l6xNcaxOeHXMlVgdeX4ouyzB2ykJVhu1KtE+XTKilUu6nIrH6ETHrxelBs36Hu1q
...

谢谢。

【问题讨论】:

  • 你认为字符串的哪一部分是多余的?
  • 可能不相关,但是......您使用more #{file}的任何具体原因? cat #{file} 不是更好吗?更好的是,File.read(file)?另外 - 为什么不尝试记录您的字符串以查看它们在将它们转储到网页之前是什么,以查看它们在每个步骤中的确切内容?

标签: ruby-on-rails ruby sinatra


【解决方案1】:

很可能,你的罪魁祸首是这行代码:

text = `more #{csr_file}`

该代码分叉并运行标准的 Unix more 程序。 more 的某些版本会检测它们是否是从另一个程序运行的,并且输出的内容会略有不同。这就是你在这里看到的。

最快的解决方法是将该行更改为

text = `cat #{csr_file}`

cat 不会像more 那样聪明,只会给你文件的内容。

现在,也就是说,您的 Ruby 程序没有理由只需要运行一个单独的程序来读取文件的内容 - Ruby 支持直接读取文件。所以最好的解决办法是将该行更改为:

text = File.read(csr_file)

这样会更快、更便携。

【讨论】:

  • 小心使用read“啜饮”数据。尝试读取大于可用内存的文件将使代码和机器陷入困境。 File.foreach 速度很快,完全可以避免这个问题。
  • 它在使用“File.read”时有效,谢谢。我认为缓冲区溢出在这里应该不是什么大问题,因为它是一个标准的 csr 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多