【问题标题】:why drastic performance degradation when running a command as different user为什么以不同用户身份运行命令时性能会急剧下降
【发布时间】: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/shbash 之间的性能差异。
  • 顺便说一句,我希望sudo -u root ./a.out 可能会好一些——仍然有所有的 PAM 开销,但至少它没有运行任何 shell。不过,这取决于配置——如果 sudo 在评估其配置时正在执行一堆目录查找,那么所有的赌注都没有了。
  • 将命令“作为字符串”传递是需要 shell 来解释的,这就是它变慢的原因。 (同样不安全,如果该字符串的任何部分是用户驱动的;考虑运行./setpasswd "$user" "$password" -- 如果password 包含$(rm -rf /*) 并且您在扩展后通过shell 传递命令,您就可以不好的一天)。所以...是的,您可以将sudo 与字符串一起使用,方法是使用-i 之类的参数或在命令行上显式命名shell,但不能不放弃性能优势。

标签: c linux bash redhat su


【解决方案1】:

使用第二条和第三条命令,time 命令还会对runusersubash 的启动进行计时,这也需要一些时间。

如果你这样做,应该不会有太大的不同:

$ runuser -l root -c 'time ./a.out'

和:

$ su -s /bin/bash -c "time ./a.out" root

【讨论】:

    猜你喜欢
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    相关资源
    最近更新 更多