在 perl 中更改 egid 时设备的 ioctl 不合适
Posted
技术标签:
【中文标题】在 perl 中更改 egid 时设备的 ioctl 不合适【英文标题】:Inappropriate ioctl for device when changing egid in perl 【发布时间】:2012-02-03 09:07:41 【问题描述】:我有一个由 Jenkins CI 执行的 perl 脚本,但是当它尝试执行以下代码时,我收到“不适合设备的 ioctl”错误。
$) = $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 身份执行。
【问题讨论】:
【参考方案1】:$!仅在系统调用失败后直接有用。当设置组或用户成功时,您并不真正知道 $! 中会包含什么,并且不能依赖它是一个错误的值。您可以在设置用户和组时尝试使用 'or die ',或者在尝试设置后再次将 $) 和 $> 与 $new_group 和 $new_user 进行比较。
【讨论】:
谢谢,好点。所以基本上 perl 文档有点不对劲,因为它声明你必须检查 $!对于错误。如果命令成功,则该变量($!)可能包含其他内容。然后没有必要检查它是否有故障【参考方案2】:要调试代码,请使用此方法,看看发生了什么。收到错误时打印出每个变量内容。请使用严格和警告,它们对您有很大帮助!
如果您无法使用此方法解决此问题,请包含输出。
use strict;
use warnings;
use Data::Dumper;
$) = $new_group;
warn "\$), \$new_group: ".Dumper($),$new_group);
...
【讨论】:
我知道 $new_group 的内容是什么,它是一个有效的组 ID。我可以从 if 内的打印输出中看到。 但是如果 $new_group 最后包含一个 '/r' 或类似的东西怎么办?用 Data::Dumper 打印出来并证明它:-)以上是关于在 perl 中更改 egid 时设备的 ioctl 不合适的主要内容,如果未能解决你的问题,请参考以下文章
vxworks - ioctl(SIOCGIFCONF) 错误
从 perl 脚本调用 unoconv 时设备的 ioctl 不合适