运行# su - oliver --command bash
提供了一个外壳,但也打印了警告bash: no job control in this shell
,实际上 Ctrl+Z 和fg
/bg
在该外壳中不起作用。
运行# su - oliver --session-command bash
会给出一个外壳而不打印警告,并且作业控制确实有效。
使用的建议--session-command
来自使用 su 从脚本启动 shell 导致“此 shell 中没有作业控制”,其中指出“[su 的安全修复] 更改了 -c 选项的行为并禁用被调用 shell 内的作业控制” .
但我还是不太明白这一点。什么时候应该使用--command
,什么时候应该使用--session-command
?--command
(又名-c
)更安全吗?还是应该始终使用--session-command
, 并且--command
只是为了向后兼容而保留?
FWIW,我使用的是 RHEL 6.4。
通常,您应该更喜欢
--command
(-c) 到--session-command
. 您不应该将 -c 与交互式 shell 一起使用(也许您想要--shell /bin/bash
?),但您应该将它与后台进程一起使用。--session-command 不调用 setsid() 来分配新会话(正如您所发现的,它的效果是允许继续使用控制 tty,因此 bash 将为您提供作为交互式 shell 的进程控制)。这意味着它的子进程可以分配给父会话的任何进程组,可能是会话前台 pg 或避免 killpg() 或其他基于进程组 ID 的分类。它还保留了向会话中的任何进程发送 SIGCONT 的能力,尽管我不确定这有多大的可滥用性。
考虑到
--session-command
不在我听说过的任何主要发行版的手册页上,它可能是自定义 RHEL 的东西(谷歌也没有帮助)。-c
使用为指定用户su
定义的任何 shell 执行您指定的命令。/etc/passwd
这使它很像sudo
,但与您选择并知道密码的任何用户一样。-c
不提供交互式外壳,因此任何需要 tty 的东西都不起作用。我还发现使用 -c 不会创建 tty: