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

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

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

beta> exit; sudo su - alpha

或者

beta> exit && sudo su - alpha

但它仅注销并不切换用户。

如何实现这一点?

答案1

exit退出正在运行的 shell。但此 shell 将运行任何后续命令。因此下一个命令不会运行。

对于交互式使用,当您启动的 shell 是初始登录 shell 时,您可能应该只注销并重新登录,分两个步骤。

对于脚本以及除初始登录 shell 之外的交互式使用,最好的做法取决于具体情况。想要实现从 shell 注销并重新登录的效果不是初始登录 shell(无论是在脚本中还是其他方式中)并不常见。即使您设法做到了这一点,它也可能不是解决您所要解决的任何潜在问题的最佳方法。

你可以代替使用以其他用户身份运行的新 shell 模拟初始登录 shell,从而替换当前 shell。当当前 shell 是初始登录 shell 时,此操作的效果与注销并重新登录大致相同。它也不比注销并重新登录容易得多,我建议改为注销并重新登录。

但是如果您想这样做,那么目标用户就alpha如您的示例所示:

exec su - alpha  # enter alpha's password

默认情况下,使用 时,su您只有一次机会输入目标用户的密码。如果输入错误,您将得到su: Authentication failuresu退出。但您的 shell 不再等待命令的结果su;事实上它根本不再运行。所以这就像您使用了 一样exit。但如果您正确输入密码,它就会起作用。

如果您想要使用sudo来进行切换,那么您输入的是您的密码而不是目标用户的密码(并且您必须是 sudoer):

exec sudo -iu alpha  # enter your password

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

如果你确实想同时使用sudosu,尽管没有必要:

exec sudo su - alpha  # enter your password

先放exec会导致你的外壳取代自身使用新运行的命令,而不是等待该命令完成。

相关内容