终端告诉 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 脚本有问题的主要内容,如果未能解决你的问题,请参考以下文章