据解释,如果我们使用su
with-c
参数,它将把命令传递到用户的 shell 并执行它。
但在我的环境中,它完全忽略该-c
选项并更改用户的外壳。
[root@mftf~]# su - demo -c "ls -la"
[demo@mftf~]$
但如果我在没有任何命令的情况下使用,它将显示需要参数-c
的错误,因此它不会被忽略。我使用的是 RHEL 7。-c
答案1
使用-
(或-l
) 时,您可以为指定用户调用交互式登录 shell。
根据 shell 初始化文件对给定用户执行的操作,该命令可能不会被执行。例如,如果他们使用exec
(不从调用 shell 传递命令行参数)直接或通过类似tmux
或 的方式重新执行 shell ssh-agent
,则命令字符串将丢失。
例如:我有
if tmux has-session; then
exec tmux attach-session
else
exec tmux
fi
...在 my 中~/.profile
,这就是为什么su -l me some_command
不会执行some_command
(相反,在 内部启动了一个交互式 shell tmux
)。
要以另一个用户身份执行命令,su
只需使用 do
# su -c some_command username
来自 Ubuntusu(1)
手册:
-
,-l
,--login
提供类似于用户直接登录时所期望的环境。
或者设置sudo
并使用
$ sudo -u user some_command
答案2
不要在 su 之后使用 -(连字符)。只需运行su demo -c 'ls -la'
当您使用 su 调用“-”时,它会初始化用户配置文件和环境。配置文件中必须有一些脚本不允许用户 shell 到达末尾。