我使用suidperl来运行一些需要root权限的程序。 但是,运行时链接程序不会扩展包含$ ORIGIN条目的库path,所以我要运行的程序(来自java的jstack)将不会运行。
更多信息在这里
build议大量使用$ ORIGIN有一个例外。 运行时链接程序不会像$ ORIGIN那样为安全(setuid)应用程序扩展令牌。 在绝大多数情况下这不应该是一个问题。
我的程序看起来像这样:
#!/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");
有没有办法以某种方式分离subprocess,以便链接程序能够正常工作。
不要使用setuidperl,请考虑使用sudo来启动脚本?
sudo -u <targetuser> /path/to/not-setuid-script
如果目标是让用户运行这个提升的权限,则可能需要编写一个执行脚本“-helper”版本的退回脚本。