运行# 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/passwd
sudo
-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
#