【问题标题】:Convert sh+perl script to php script将 sh+perl 脚本转换为 php 脚本
【发布时间】:2019-06-23 10:12:44
【问题描述】:

我找到了一个用于检索 CA 证书的编码。问题是脚本是.sh格式的:

wget -O - https://eidas.agid.gov.it/TL/TSL-IT.xml | perl -ne 'if (/<X509Certificate>/) {
s/^\s+//; s/\s+$//;
s/<\/*X509Certificate>//g;
print "-----BEGIN CERTIFICATE-----\n";
while (length($_)>64) {
print substr($_,0,64)."\n";
$_=substr($_,64);
}
print $_."\n";
print "-----END CERTIFICATE-----\n";
}' >CA.pem

我想在 PHP 上使用它,但我不知道它在 .sh 中是如何工作的(我使用 windows,我无法在 .sh 中查看输出)所以我不知道如何开始转换:(

更新:经过一番尝试,我已经到了这一点:

$xmlDoc = simplexml_load_file('https://eidas.agid.gov.it/TL/TSL-IT.xml');

$content = "";

foreach ($xmlDoc->SchemeInformation->PointersToOtherTSL->OtherTSLPointer->ServiceDigitalIdentities->ServiceDigitalIdentity as $key)
{
    $content .= "-----BEGIN CERTIFICATE-----" . PHP_EOL;
    $content .= wordwrap($key->DigitalId->X509Certificate, 64, PHP_EOL, true);
    $content .= PHP_EOL;
    $content .= "-----END CERTIFICATE-----" . PHP_EOL;

}

file_put_contents("test.txt",$content);

问题是“X509Certificate”在 XML 中的其他块中,所以我必须为每个块创建一个循环。有没有办法仅通过元素名称 =“X509Certificate”提取值而不知道正确的树 gerarchy?

【问题讨论】:

  • 您发布的不是问题,而是请人做您的工作。尝试perldoc.perl.org/index-language.html 并从那里开始。
  • 为什么不正确地使用 XML 解析器呢? curl --silent https://applicazioni.cnipa.gov.it/TSL/_IT_TSL_signed.xml | perl -MXML::LibXML -e '@nodes=XML::LibXML-&gt;load_xml(IO =&gt; \*STDIN)-&gt;getElementsByTagName("X509Certificate"); print "-----BEGIN CERTIFICATE-----\n", join("\n", $nodes[0]-&gt;textContent =~ /(.{0,64})/g), "-----END CERTIFICATE-----\n";'
  • 我已经更新了部分解决方案。但我不知道如何简化它。如果有一种方法可以通过它的名称只检索一个元素。顺便说一句,正确的网址是:eidas.agid.gov.it/TL/TSL-IT.xml
  • @StefanBecker 嗨,我想使用纯 PHP,因为脚本可以在 windows 或 linux 系统上运行。所以 perl 无法在无法安装 3 方软件的托管 Windows 服务器中执行

标签: php perl


【解决方案1】:

xpath() 方法与XPath 一起用于您要查找的节点:

编辑:为了安全起见,我添加了命名空间处理

# default namespace for elements without namespace prefix
$xmlDoc->registerXPathNamespace('default', 'http://uri.etsi.org/02231/v2#');

foreach ($xmlDoc->xpath("//default:X509Certificate") as $element) {

如果你对$element进行字符串化,你应该得到节点的文本内容,即你正在寻找的Base64字符串。

【讨论】:

    猜你喜欢
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2015-10-16
    • 1970-01-01
    相关资源
    最近更新 更多