在 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 不合适的主要内容,如果未能解决你的问题,请参考以下文章

《linux设备驱动开发详解》笔记——8阻塞与非阻塞IO

vxworks - ioctl(SIOCGIFCONF) 错误

从 perl 脚本调用 unoconv 时设备的 ioctl 不合适

更改 Perl 中的默认正则表达式行为?

Python 踩坑之旅进程篇其四一次性踩透 uid euid suid gid egid sgid的坑坑洼洼

在perl的反引号中使用chmod后导致权限的异步更改的原因