; 或 && 与 exit 一起使用时不执行下一个命令

Dis*_*sha 0 bash user-management

当从 1 个非 root 用户切换到另一个并运行如下命令时 -

beta> exit; sudo su - alpha
Run Code Online (Sandbox Code Playgroud)

或者

beta> exit && sudo su - alpha
Run Code Online (Sandbox Code Playgroud)

但它只注销而不切换用户。

如何做到这一点?

Eli*_*gan 10

exit退出正在运行的 shell。但是这个 shell 将运行任何后续命令。所以下一个命令不会运行。

对于交互式使用,当您开始使用的 shell 是初始登录 shell 时,您可能只需注销并重新登录,分两步即可。

对于脚本,以及在初始登录 shell 之外的交互式使用,最好的做法取决于具体情况。希望实现注销和背部在从壳是的效果初始登录shell(无论在脚本或以其他方式)是不寻常的。即使您设法做到了,它也可能不是解决您正在解决的任何潜在问题的最佳方法。

您可以使用以其他用户身份运行并模拟初始登录 shell 的新 shell替换当前 shell。当您当前的 shell 是初始登录 shell 时,这与注销和重新登录的效果大致相同。它也没有比仅注销和重新登录容易得多,我建议改为这样做。

但是,如果您想这样做,那么目标用户alpha在您的示例中的位置:

exec su - alpha  # enter alpha's password
Run Code Online (Sandbox Code Playgroud)

默认情况下,su您只能尝试输入目标用户的密码一次。如果您输入错误,您会得到su: Authentication failuresu退出。但是你的 shell 不再等待su命令的结果;事实上,它根本不再运行。所以就好像你已经使用了exit. 但是,如果您正确输入密码,它就可以工作。

如果你想用sudo做切换,那么你输入你的密码而不是目标用户的密码(而且你必须是一个sudoer):

exec sudo -iu alpha  # enter your password
Run Code Online (Sandbox Code Playgroud)

如果您输入错误的密码,您的原始 shell 不再存在的相同问题仍然适用。但默认情况下sudo,您会多次尝试输入密码。

如果你真的想同时使用sudoand su,虽然没有必要:

exec sudo su - alpha  # enter your password
Run Code Online (Sandbox Code Playgroud)

exec首先使你的shell来代替自己与新运行命令,而不是等待该命令完成。