如何通过sudo(或作为另一个用户)打开Perl文件句柄来写入数据

如何通过sudo(或作为另一个用户)打开Perl文件句柄来写入数据,perl,permissions,posix,sudo,filehandle,Perl,Permissions,Posix,Sudo,Filehandle,我想将数据写入文件,但文件句柄应以特定用户的访问权限打开 因此,以下声明: open (FH, "> $filename") or die "$@\n"; 将允许以该特定用户的身份写入文件 有没有一种方法可以在Perl脚本中实现这一点,而不必使用sudo-u$username运行整个脚本?有两种方法。Stackers,请您编辑此答案,以填写每个答案的缺点 使用sudo运行程序。在程序中,您要做的第一件事是打开所需的文件并保留句柄,然后立即打开。任何进一步的处理都必须以低权限进行。apac

我想将数据写入文件,但文件句柄应以特定用户的访问权限打开

因此,以下声明:

open (FH, "> $filename") or die "$@\n";
将允许以该特定用户的身份写入文件


有没有一种方法可以在Perl脚本中实现这一点,而不必使用
sudo-u$username运行整个脚本?

有两种方法。Stackers,请您编辑此答案,以填写每个答案的缺点

使用
sudo
运行程序。在程序中,您要做的第一件事是打开所需的文件并保留句柄,然后立即打开。任何进一步的处理都必须以低权限进行。apachehttpd的工作原理是这样的,它以
root
的身份打开日志文件,但继续以
nobody
或类似的身份运行


如果您不喜欢这种方式,请正常运行程序,当您需要提升时,创建一个新进程,并让它在用户配置的
sudo
su-
kdesu
/
gksu
或诸如此类的情况下运行。CPAN客户端是这样工作的,它以普通用户的身份获取、解包、构建和测试模块,但是在安装时调用
sudo make install
等。

daxim建议的替代方法是让脚本由特定用户拥有,并且脚本权限包括setuid和/或setgid位。

要更改有效UID
$>
您需要以root用户身份运行,您的脚本运行的是setuid root还是root用户?我不知道是否可以打开使用
sudo
的可写文件句柄。我真的试图避免
sudo
,除非我可以使该文件句柄为该用户可写。至于第二个选项,我需要向sudo程序传递一个Perl哈希引用,这似乎并不简单。这是否有助于问题变得更有意义?…但是,请注意,这可能是长期更新/维护的一大难题,因为每次编辑文件时,大多数(如果不是全部)*nices都会清除suid/sgid位。