我想检查一下,如果用户拥有某个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。
答案 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的评论。要调查我们仍然需要$?
的信号,但这种情况的发生频率要低得多。该模块简化了system
和qx
使用和错误检查。
答案 1 :(得分:2)
这个文档记录不完整,最有用的信息是
perldoc perlvar
说明了这个
- $ CHILD_ERROR
$?
上次管道关闭,反引号命令,成功调用
wait()
或waitpid()
或system()
运算符返回的状态。这只是传统的Unixwait()
系统调用返回的16位状态字(或者看起来像是这样)。因此,子进程的退出值实际上是($? >> 8
),$? & 127
给出了进程死亡的信号(如果有的话),$? & 128
报告是否存在核心转储。
因此,system
的返回值256对应于退出值256>> 8,这是你期待的1