Ruby和Sinatra:这个额外字符串来自何处以及如何消除它?

时间:2013-11-28 20:02:27

标签: ruby-on-rails ruby sinatra

“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
...

感谢。

1 个答案:

答案 0 :(得分:0)

最有可能的,你的罪魁祸首是这一行:

text = `more #{csr_file}`

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

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

text = `cat #{csr_file}`

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

现在,那就是说,没有理由为什么你的Ruby程序只需要运行一个单独的程序来读取文件的内容 - Ruby支持直接读取文件。因此,最好的解决方法是将该行更改为:

text = File.read(csr_file)

这将更快,更便携。