【发布时间】:2015-07-18 10:41:57
【问题描述】:
我有一个 hello world C example ./a.out
现在我使用time 测量以下命令的执行时间
time ./a.out
Hello World
real 0m0.001s
user 0m0.000s
sys 0m0.002s
time runuser -l root -c './a.out'
real 0m0.017s
user 0m0.004s
sys 0m0.011s
time su -s /bin/bash -c "./a.out" root
Hello World
real 0m0.080s ---> 80 times slower
user 0m0.005s
sys 0m0.071s
为什么第三条命令80比第一条命令慢几倍?
环境——Redhat 7
【问题讨论】:
-
您为什么希望启动一个新的帐户会话,并且在第二种情况下,该会话中的一个 bash 实例不需要时间?
-
另外,runuser 已经启动
/bin/sh来调用通过-c传递的命令。您测量的部分内容是/bin/sh和bash之间的性能差异。 -
顺便说一句,我希望
sudo -u root ./a.out可能会好一些——仍然有所有的 PAM 开销,但至少它没有运行任何 shell。不过,这取决于配置——如果sudo在评估其配置时正在执行一堆目录查找,那么所有的赌注都没有了。 -
将命令“作为字符串”传递是需要 shell 来解释的,这就是它变慢的原因。 (同样不安全,如果该字符串的任何部分是用户驱动的;考虑运行
./setpasswd "$user" "$password"-- 如果password包含$(rm -rf /*)并且您在扩展后通过shell 传递命令,您就可以不好的一天)。所以...是的,您可以将sudo与字符串一起使用,方法是使用-i之类的参数或在命令行上显式命名shell,但不能不放弃性能优势。