终端告诉 perl 脚本有问题

Posted

技术标签:

【中文标题】终端告诉 perl 脚本有问题【英文标题】:Terminal tells there is an issue with perl script 【发布时间】:2021-07-29 20:38:59 【问题描述】:

我开始遇到我们的一个 perl 脚本的问题,该脚本直到上个月都运行良好。有人可以帮我解决这个问题吗?

malformed JSON string, neither array, object, number, string or atom, at character offset 0
(before "<!doctype html><html...") at ad_lib.pm line 985.

下面是我的台词

my $response = from_json(qx$BASE_HASHCURL -X GET -H "Content-Type: application/json" -H "Authorization:Basic $encoded" "https://localhost:9090/nwrestapi/v2/global/protectiongroups/" -k -1 2>/dev/null);

编码使用如下

    my %BASE_HASH = ();
    read_config(\%BASE_HASH);
    my $encoded = MIME::Base64::encode($BASE_HASHNW_USER . ":" . $BASE_HASHNW_PW);

【问题讨论】:

查看它返回的 HTML,看看它是否告诉您一些有用的信息,例如错误消息。 【参考方案1】:

看起来您从 HTTP 请求中获得的响应以前是 JSON 字符串,现在是 HTML 文档。

from_json 试图将其解码为 JSON 字符串但失败了,因为它找到的既不是数组、对象、数字、字符串或原子:它是 HTML。

因此,与您使用的 Perl 脚本相比,您的外部服务(您正在与之交谈的那个)更有可能出现问题。这也可以解释为什么它突然开始失败。

【讨论】:

确实如此。并且运行打印 readpipe (qx...) 的结果可能会揭示服务响应发生变化的原因。 感谢您的提示。设法找到了原因。【参考方案2】:

似乎较新版本的应用程序几乎没有高级版本的 SSL,并且无法解码用户名/密码。而不是 $encoded 我已经将分块/解码的值传递给文件并且脚本工作正常。 我在执行脚本时发现新旧版本的唯一区别是 SSL 版本。 在具有旧应用程序版本的系统上:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 在具有新应用版本的系统上:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

需要弄清楚 $encoded 有什么问题以及如何传递值,可能是引号等。

【讨论】:

以上是关于终端告诉 perl 脚本有问题的主要内容,如果未能解决你的问题,请参考以下文章

Perl - 我如何将完整的目录路径名传递给 perl 脚本

Perl 和 CopSSH

bash脚本中的Perl哈希等效? [复制]

我可以告诉 Perl 一些数据是不可变的以加快速度吗?

perl第一弹-perl的特点

perl语言