设置Perl脚本的有效组ID

时间:2009-05-28 20:15:48

标签: perl bash

我有文件权限问题,我想解决这个问题,而不是让所有东西都可写。

我正在将文件写入NetApp SAN。我正在写的目录由devel用户拥有,并且有一组devel具有组可写权限(0775)。我写的用户名是usernamedevel组。

问题似乎是SAN只检查第一组,因此我被拒绝了许可。如果我使用newgrpsg命令将我的组更改为devel,那么我可以写入目录。

尝试编写的脚本是用Perl编写的,但它是通过ssh和一些bash脚本从另一台机器远程启动的。

我无法将目标目录更改为username组,因为还有其他开发人员,他们位于不同的组中(但我们都共享devel组)。

我无法使Perl脚本本身设置为setgid,因为我们使用适当的组运行不同的环境(devel,test,qa,production等),我不想在该级别管理文件权限位。

我无法在Perl脚本中使用POSIX setgid函数,因为它不是以root身份启动的(我无法获得root权限),因此我被拒绝了。分配到$)$(会得到相同的结果。

我无法使用bash中的newgrp命令,因为newgrp不接受任何参数,它只是启动一个新的交互式shell(在新shell退出后执行以下任何命令)。 / p>

我也无法使用newgrp启动新shell并从那里生成Perl脚本,因为Perl脚本是通过ssh连接在远程计算机上执行的。该脚本将在我的默认组下的远程计算机上获得“新鲜”shell,而不是通过本地计算机上的newgrp设置的组。

我无法使用sg命令,因为它只需要一个参数。我引用完整的命令行,包括已知的参数。但是,我们通过ssh启动远程进程的方式包括在"$@" bash变量中传递本地参数。换句话说,我可以执行process startprocess stopprocess脚本处理ssh命令并传递我使用{{{I}}输入的任何本地参数1}}。我已经尝试过编写一个包装器,但发现我们使用了各种有趣的本地参数形式,并且犹豫是否想要深入研究必要的引用和逃避噩梦。

所以,我的问题是:是否有人知道从Perl或bash为正在运行的进程设置有效组ID的其他方法?是否存在"$@"的多参数形式?

1 个答案:

答案 0 :(得分:3)

在Perl脚本的顶部,你不能放这个:

if ( 0+$( != DEVEL_GROUP_ID ) { # primary group isn't devel
  my(@reinvoke) = ($0, map {quotemeta} @ARGV);
  exec('/usr/bin/sg', 'devel', "@reinvoke");
  die("/usr/bin/sg not found!  Can't change group!");
}

也就是说,让Perl做必要的调用sg。