Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
帮助将unix命令移植到perl脚本_Perl - Fatal编程技术网

帮助将unix命令移植到perl脚本

帮助将unix命令移植到perl脚本,perl,Perl,我在尝试将这些unix命令转换为perl时遇到一些perl编译错误。 单引号和双引号的使用让我很反感(见下文:my$curlcmd) 以下是按顺序执行的工作unix命令: export CERT=`/dev/bin/util --show dev.testaccnt | awk '{print $2}'` /usr/bin/curl -c /home/foobar/cookee.txt --certify /dev/key.crt \ --header "FooBar-Util:'$

我在尝试将这些unix命令转换为perl时遇到一些perl编译错误。 单引号和双引号的使用让我很反感(见下文:
my$curlcmd

以下是按顺序执行的工作unix命令:

export CERT=`/dev/bin/util --show dev.testaccnt | awk '{print $2}'`

/usr/bin/curl -c /home/foobar/cookee.txt --certify /dev/key.crt \
     --header "FooBar-Util:'${CERT}'" \
     https://devhost.foobar.com:4443/fs/workflow/data/source/productname?val=Summ
我想在Perl中执行同样的操作:

#Build cmd in perl
my $cookie='/home/foobar/cookee.txt';
my $certkey='/dev/key.crt';
my $fsProxyHostPort='devhost.foobar.com:4443';
my $fsPath='workflow/data/source/productname';
my $fsProxyOperation='Summ';
my $fsProxyURL="https://$fsProxyHostPort/fs/$fsPath?val=$fsProxyOperation";

#Get cert
my $cert=qx(/dev/bin/pass-util --show foobar.dev.testaccnt | awk '{print \$2}');
以下是我在执行时遇到的问题:

my $curlcmd = qx(/usr/bin/curl -c $cookie --certify $certkey --header "FooBar-Util:'${" . $cert . "}'". $fsProxyURL);
有人能告诉我如何在Perl中正确设置这些命令吗?

这个
“$cert.”
似乎是其他一些代码的遗留,其中使用了黑引号,而不是
qx
。删除黑引号和连接(
)在我的机器上有效

因此,要执行该命令,请执行以下操作:

my $curlcmd = qx(/usr/bin/curl -c $cookie --certify $certkey --header "FooBar-Util:'${ $cert }'". $fsProxyURL);

在注释之后,如果您只想打印命令,可以执行以下操作:

my $curlcmd = qq(/usr/bin/curl -c $cookie --certify $certkey --header "FooBar-Util:'${ $cert  }'". $fsProxyURL);
print $curlcmd;

您对
$cert
有两种不同的定义是故意的吗

您对
--标题“FooBar Util:'${CERT}'”
的翻译不正确。
${…}
告诉shell插入
CERT
变量,但是由于您已经在从Perl执行此插入操作,因此不需要它,只会混淆

您还缺少
$fsProxyURL
前面的一个空格

由于您显然没有使用curl捕获的输出进行任何处理,因此我建议您使用
system
函数,以避免使用中间shell命令行解析:

system "/usr/bin/curl","-c",$cookie,"--certify",$certTheFirst,
       "--header","FooBar-Util:'$certTheSecond'", $fsProxyURL;
最后,当Perl很好地完成这类工作时,使用辅助awk将pass util值拆分为字段并不是很完美。一旦你解决了眼前的错误,我建议

my @passwordline = split / /, qx(/dev/bin/util --show dev.testaccnt);
my $certTheSecond = $passwordline[1];

在shell脚本中,您有(部分):

这会产生如下结果:

--header FooBar-Util:'data-from-certificate'
其中,
curl
命令可以查看这些单引号。要在Perl中获得相同的结果,您需要:

my $header = "FooBar-Util:'$cert'";
my $out = qx(/usr/bin/curl -c $cookie --certify $certkey --header $header $fsProxyURL);
变化:

  • 丢失了
    ${…}
    符号
  • 丢失了连接操作
在查看发送到命令的参数列表时遇到问题的情况下,我建议使用类似于shell
echo
命令的程序,但它会在自己的行中列出每个参数,而不是在单行中以空格分隔的参数集。我把这个
al
的版本称为“参数列表”。如果通过在整个命令行前面加上
al
来测试命令(例如,shell版本),则可以看到
curl
将看到的参数。然后,您可以在Perl中执行相同的操作,将shell中看到的参数
curl
与Perl给出的参数进行比较。然后,您可以修复问题,通常更容易

对于使用
al
进行调试:

my @lines = qx(al /usr/bin/curl -c $cookie --certify $certkey --header $header $fsProxyURL);
foreach my $line (@lines) { print "$line"; }

如果要用Perl编写
al

#!/usr/bin/env perl
foreach my $arg (@ARGV) { print "$arg\n"; }

验证答案的冒险 幸运的是,我通常会检查我所写的答案——上面所写的大部分都是准确的,除了一个细节;Perl设法在命令上调用shell,在此过程中,shell清除了单引号:

my $cert = 'certificate-info';
my $fsProxyURL = 'https://www.example.com/fsProxy';
my $cookie = 'cookie';
my $certkey = 'cert-key';
my $header = "FooBar-Util:'$cert'";
#my @out = qx(al /usr/bin/curl -c $cookie --certify $certkey --header $header $fsProxyURL);
my @cmdargs = ( 'al', '/usr/bin/curl', '-c', $cookie, '--certify', $certkey, '--header', $header, $fsProxyURL);
print "System:\n";
system @cmdargs;
print "\nQX command:\n";
my @lines = qx(@cmdargs);
foreach my $line (@lines) { print "$line"; }
这将产生:

System:
/usr/bin/curl
-c
cookie
--certify
cert-key
--header
FooBar-Util:'certificate-info'
https://www.example.com/fsProxy

QX command:
/usr/bin/curl
-c
cookie
--certify
cert-key
--header
FooBar-Util:certificate-info
https://www.example.com/fsProxy
注意“FooBar”行中的差异

在这一点上,你开始想知道什么是最不干净的方法来解决这个问题。如果要使用
qx/
运算符,则可能需要执行以下操作:

my $header = "FooBar-Util:\\'$cert\\'";
这将产生变量输出(
system
然后
qx/
):

因此,
qx/
符号现在为执行的命令提供单引号,就像在shell脚本中一样。这达到了目标,所以我建议这对你来说是“好的”;我只是不确定我是否真的会在自己的代码中采用它,但我手头上没有更干净的机制。我希望能够使用
system
plus“array of arguments”机制,同时仍然能够捕获输出,但我还没有检查是否有一种合理的(意味着相对容易的)方法来实现这一点


另一个暂时的评论;如果您的任何参数包含空格,那么您必须非常小心通过shell的内容。让
al
命令可用真的会有回报。您无法识别
echo
输出中的哪些空格是一个参数的一部分,哪些空格是
echo
提供的分隔符,谢谢。如果我想先打印出来查看输出。我能在不实际执行的情况下打印吗?很抱歉造成混淆。我做了编辑。其中一个应该是
$certkey
,而
$cert
将是用于使用cert实用程序的命令。谢谢。在
/dev
下有可执行文件或数据文件是非常常规的;该目录用于设备(如
/dev/null
/dev/tty
),用户通常不应修改该目录,您通常也不会创建子目录并在其中放置命令。它的名字不是
development
的缩写。你说得对。为了发布我的示例,我应该使用
/devel
my $header = "FooBar-Util:\\'$cert\\'";
FooBar-Util:\'certificate-info\'

FooBar-Util:'certificate-info'