使用sudo在Perl中打开文件

3

我想把数据写入文件,但是文件句柄需要用sudo打开,否则就会得到拒绝访问的错误。但似乎在Perl中不可能像下面这样做?

sudo open (FH, "> $filename") or die "$!\n";

3
当使用sudo以另一个用户身份运行时,Perl系统调用如何工作? - fugu
这个问题类似于如何通过sudo(或其他用户)打开Perl文件句柄以写入数据,但我无法运行作为sudo打开文件的脚本。 - user1060517
然后退一步,帮助我们理解您实际想要实现什么,以及为什么那不是一个足够的解决方案。 - tripleee
我正在尝试从Perl脚本中打开一个安全位置的文件。Perl脚本无法以“sudo”方式运行,因此我正在尝试在Perl脚本尝试打开文件/写入文件时提升用户权限。有哪些可能的方法可以实现这一点? - user1060517
2个回答

5

sudo是一个Linux命令,它不是Perl函数。你可以使用sudo运行整个Perl脚本(sudo perl script.pl),或者你可以通过分配给$<$>特殊变量来在Perl中更改你的用户ID(参见perlvar-Perl预定义变量),这将需要额外的权限。

顺便说一句,open在失败时会设置$!而不是$@


0
open(my $pipe_fh, '-|', 'sudo', 'cat', $filename) or die "Unable to open pipe: $!\n";

它创建另一个进程来解决您的问题,可能通过以正确的权限运行脚本来更好地解决。


好的,那么如果我需要在文件不存在时创建一个文件或附加到现有文件中,应该使用什么命令?我的尝试类似于- my $table_mapping = '/opt/temp'; 除非(-e $table_mapping) { open (my $TBLFILE, '-|', 'sudo', '>> $table_mapping') or die "无法打开'$table_mapping':$!\ n"; close $TBLFILE; } - user1060517
“-|” 就像文件中的 “<” 一样,是管道的一种表示方式。相反,“|-” 允许您向管道写入数据,但如果您需要使用外部程序代理大量的 IO 操作,那么您真的需要重新审视运行脚本的权限。另外,不要指望通过外部命令 “sudo >> $table_mapping” 来实现您想要的功能。 - tjd
谢谢,我已经成功从文件中读取了内容。然而,向文件写入一个简单的字符串似乎很复杂。你能给我一个追加一行到文件的例子吗?我也在尝试重新检查用户权限问题。 - user1060517
就像我之前使用cat读取文件一样,你可能会滥用tee来写文件。当然,这将导致将你写的所有内容也发送到STDOUT。这条路充满了疯狂...... - tjd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接