在perl中更改egid时,设备的ioctl不合适

时间:2012-02-03 09:07:42

标签: perl

我有一个由Jenkins CI执行的perl脚本,但是当它尝试执行以下代码时,我收到“不适当的ioctl for device”错误。

$) = $new_group;

if($!){
   print STDERR $! . "\n";
   print STDERR "Failure to change permissions to: Gid: $new_group \n";
   next;
}   

$> = $new_user;

if($!){
   print STDERR $! . "\n";
   print STDERR "Failure to change permissions to: Uid: $new_user \n";
   next;
}

但是如果像这样手动做同样的事情,我没有收到任何错误

perl -e '$) = 99; if($!){print $! ."\n";} $> = 99; if($!){print $!."\n";}print     `whoami`;'

发生此错误的原因,以及我的意思?我在网上搜索,但是当文件处理程序打开时,似乎发生了这种情况,在更改用户时看到任何关于它的例子。

所有脚本都以root身份执行。

2 个答案:

答案 0 :(得分:1)

$!只有在系统调用失败后才能直接使用。当设置组或用户成功时,您实际上并不知道$!中的内容,并且不能依赖它是假值。在设置用户和组时,您可能会尝试使用'或die',或者只是比较$)和$>尝试设置后再次使用$ new_group和$ new_user。

答案 1 :(得分:0)

要调试代码,请使用此方法,并查看最新情况。收到错误时打印出每个变量内容。请使用严格和警告,他们会帮助你很多!

如果使用此方法无法解决此问题,请输入输出。

use strict;
use warnings;
use Data::Dumper;

$) = $new_group;
warn "\$), \$new_group: ".Dumper($),$new_group);
...