“su --command”和“su --session-command”有什么区别?

“su --command”和“su --session-command”有什么区别?

运行# su - oliver --command bash会产生一个 shell 但也会打印警告bash: no job control in this shell,并且 Ctrl+Z 和fg/确实bg在该 shell 中不起作用。

运行后# su - oliver --session-command bash会出现一个 shell 但不打印警告,作业控制确实有效。

使用建议--session-command来自使用 su 从脚本启动 shell 会导致“此 shell 中没有作业控制”其中指出“[su 的安全修复程序] 改变了 -c 选项的行为并禁用了被调用 shell 内的作业控制”。

但我还是不太明白这一点。什么时候应该使用--command,什么时候应该使用--session-command--command(又名)是否-c更安全?还是应该始终使用--session-command,而--command只是为了向后兼容而保留 ?

值得一提的是,我正在使用 RHEL 6.4。

答案1

通常,您应该更喜欢--command(-c) 而不是--session-command。您不应该在交互式 shell 中使用 -c (也许您想要--shell /bin/bash?),但您应该在后台进程中使用它。

--session-command 不会调用 setsid() 来分配新会话(正如您所发现的,这样做的效果是允许继续使用控制 tty,因此 bash 将为您提供作为交互式 shell 的进程控制权)。这意味着可以将其子进程分配给父会话的任何进程组,可能是会话前台 pg,或者避免 killpg() 或基于进程组 id 的其他分类。它还保留了向会话中的任何进程发送 SIGCONT 的能力,尽管我不确定这有多容易被滥用。

答案2

考虑到--session-command它不在我听说过的任何主要发行版的手册页上,它很可能是自定义的 RHEL 的东西(谷歌也没有帮助)。

-c使用为指定用户su定义的任何 shell 执行您指定的命令。这使其非常类似于,但作为您选择的任何用户并知道其密码。/etc/passwdsudo-c不是提供一个交互式 shell,因此任何需要 tty 的东西都无法工作。

答案3

我还发现使用 -c 不会创建 tty:

# su nobody -s /bin/bash -c "echo hi >/dev/tty"
bash: /dev/tty: No such device or address
#
# su nobody -s /bin/bash --session-command="echo hi >/dev/tty"
hi
#

相关内容