【问题标题】:Parameter from udev rule not passing into perl scriptudev 规则中的参数未传递到 perl 脚本
【发布时间】:2015-01-09 22:38:13
【问题描述】:

我正在尝试创建一个隐藏大小小于 64 GB 的块设备(即 USB 驱动器)的 udev 规则

规则如下:

BUS=="usb", SUBSYSTEM=="block", ACTION=="add", PROGRAM="/data/diskSizeCheck.pl %k", RESULT!="ok", ENV{UDISKS_PRESENTATION_HIDE}="1", GOTO="usb_mount_end"

usb_mount_end 只是我的规则文件末尾的一个标签。 %k 应该是设备内核(即 sdb)。但即使我将“sdb”硬编码为参数,该参数也不会出现在我的 perl 脚本中,并且即使磁盘足够大,磁盘也总是无法通过大小检查。但是,当我通过命令行传入 sdb 时,它可以工作。

这是我正在使用的 perl 脚本:

#!/usr/bin/perl
use strict;
my $MINIMUM_DISK_SIZE = 64000000000;
my $kernel = $ARGV[0];
my $diskSize = `blockdev --getsize64 /dev/$kernel`;
chomp($diskSize);

if ($diskSize > $MINIMUM_DISK_SIZE) {
    print "ok";
} else {
    print "no";
}

脚本被标记为可执行和所有内容,但是当我将$kernel 写入文本文件时,文本文件出现空白,让我相信变量从未传入。

如何将%k 传递给我的 perl 脚本?

编辑添加:我以 root 身份运行所有内容。

编辑以进一步补充:我认为真正的问题是 RESULT 由于某种原因没有正确捕获我的脚本的输出。

【问题讨论】:

  • 经过一番玩弄(设置$kernel = "sdb" 并更改规则,因此如果RESULT=="ok" 则驱动器被隐藏)我发现真正的问题是我的脚本的输出似乎没有由于某种原因被 RESULT 捕获。我只是通过命令行调用脚本./diskSizeCheck.pl sdb

标签: linux perl udev


【解决方案1】:

使用

KERNEL=="sdc", SUBSYSTEMS=="block", ACTION=="add", PROGRAM="/usr/local/diskSizeCheck.pl %k", RESULT!="ok", ENV{UDISKS_PRESENTATION_HIDE}="1"

使用diskSizeCheck.pl:

#!/usr/bin/perl
use strict;
use warnings;
open FH,">/tmp/diskSizeCheck";
print FH "Disk Size Check\n"; 

my $MINIMUM_DISK_SIZE = 64000000000;
my $kernel = $ARGV[0];
my $diskSize = `sudo blockdev --getsize64 /dev/$kernel`;
chomp($diskSize);

print FH "kernel = $kernel, $diskSize\n";

if ($diskSize > $MINIMUM_DISK_SIZE) {
    print FH "ok\n";
} else {
   print FH "no\n";
}

在插入 U 盘时,我得到了 /tmp/diskSpaceSize:

Disk Size Check
sdc, 2005925888
no

【讨论】:

  • 谢谢!该输出让我知道了真正的问题:在我的 udev 版本中,它需要 blockdev (/sbin/blockdev) 的完整路径才能正常工作!
猜你喜欢
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 2012-09-30
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多