Perls系统中的不同退出状态比Bash中的不同

时间:2017-07-20 07:51:30

标签: bash perl samba

我想检查一下,如果用户拥有某个samba-share的访问权限。我目前正在使用smbclient中的Version 4.3.11-Ubuntu命令执行此操作。

显然,使用exit状态评估成功并不是一个好主意,如此问题中所述:Exit codes of smbclient

但是我有一些奇怪的行为。使用Perls system函数调用程序时,我得到不同的退出状态。

perldoc -f system告诉我:

  

返回值是由程序返回的程序的退出状态   “等待”电话。

从命令行调用时,我得到EXIT 1

user@host:~$ smbclient //server/share MyFalsePassword --user=any.user -c "cd somefolder;"; echo "EXIT $?"
WARNING: The "syslog" option is deprecated
session setup failed: NT_STATUS_LOGON_FAILURE
EXIT 1

调用相同的whitin Perl我得到EXIT 256

user@host:~$ perl -E 'say "EXIT " . system("smbclient //server/share MyFalsePassword --user=any.user -c \"cd somefolder;\"");'
WARNING: The "syslog" option is deprecated
session setup failed: NT_STATUS_LOGON_FAILURE
EXIT 256

我在变量256 whitin Perl中也有值$?

注意:如果我使用正确的凭据,我会在(Bash和Perl)中获得EXIT 0

我的问题:如果我使用错误的凭据,为什么我会从Bash和Perl获得不同的退出状态?我该如何正确检查?

我在Ubuntu 16.04上使用Perl v5.22。

2 个答案:

答案 0 :(得分:3)

system返回的退出状态是一个双字节数字,它将程序返回的退出代码打包为高位,而如果进程则设置低8位被信号杀死了低7位是信号编号,第8位表示核心是否被转储。

因此,要获得程序的实际退出,请按照您引用的文档中的下一句话

  

要获得实际退出值,请向右移动

256 >> 8给了我们1

system的{​​{1}}返回已在variable $?

中详细说明。
if ($? == -1) {
    print "failed to execute: $!\n";
}
elsif ($? & 127) {
    printf "child died with signal %d, %s coredump\n",
        ($? & 127),  ($? & 128) ? 'with' : 'without';
}
else {
    printf "child exited with value %d\n", $? >> 8;
}

在清除之前,最好保存或$?检查返回。

system可以避免位移,它直接返回程序的退出值。感谢using IPC::System::Simple的评论。要调查我们仍然需要$?的信号,但这种情况的发生频率要低得多。该模块简化了systemqx使用和错误检查。

答案 1 :(得分:2)

这个文档记录不完整,最有用的信息是 perldoc perlvar说明了这个

  
      
  • $ CHILD_ERROR
  •   
  • $?

         

    上次管道关闭,反引号命令,成功调用wait()waitpid()system()运算符返回的状态。这只是传统的Unix wait()系统调用返回的16位状态字(或者看起来像是这样)。因此,子进程的退出值实际上是($? >> 8),$? & 127给出了进程死亡的信号(如果有的话),$? & 128报告是否存在核心转储。

  •   

因此,system的返回值256对应于退出值256>> 8,这是你期待的1