我正在使用 suidperl 来运行一些需要 root 权限的程序。但是,运行时链接器不会扩展包含 $ORIGIN 条目的库路径,因此我想要运行的程序(来自 java 的 jstack)将无法运行。
建议大量使用 $ORIGIN,但有一个例外。运行时链接器不会为安全 (setuid) 应用程序扩展像 $ORIGIN 这样的标记。在大多数情况下,这应该不是问题。
我的程序看起来像这样:
#!/usr/bin/perl
$ENV{PATH} = "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/java/jdk1.6.0_12/bin:/root/bin";
$ENV{JAVA_HOME} = "/usr/java/jdk1.6.0_12";
open(FILE, '/var/run/kil.pid');
$pid = <FILE>;
close(FILE);
chomp($pid);
if ($pid =~ /^(\d+)/) {
$pid = $1;
} else {
die 'nopid';
}
system( "/usr/java/jdk1.6.0_12/bin/jstack", "$pid");
有没有什么方法可以分叉一个子进程以使链接器能够正常工作。
答案1
不要使用 setuidperl,而是考虑使用 sudo 来启动脚本?
sudo -u <targetuser> /path/to/not-setuid-script
如果目标是让用户以提升的权限运行此程序,则可能需要编写一个执行脚本“-helper”版本的弹跳脚本。