“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
...
感谢。
答案 0 :(得分:0)
最有可能的,你的罪魁祸首是这一行:
text = `more #{csr_file}`
该代码分叉并运行标准的Unix more
程序。某些版本的more
会检测他们是否从其他程序运行,并输出的内容略有不同。这就是你在这里看到的。
最快的解决方法是将该行更改为
text = `cat #{csr_file}`
cat
并不像more
那样聪明,只会给你文件的内容。
现在,那就是说,没有理由为什么你的Ruby程序只需要运行一个单独的程序来读取文件的内容 - Ruby支持直接读取文件。因此,最好的解决方法是将该行更改为:
text = File.read(csr_file)
这将更快,更便携。