从一个非 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 failure
并su
退出。但您的 shell 不再等待命令的结果su
;事实上它根本不再运行。所以这就像您使用了 一样exit
。但如果您正确输入密码,它就会起作用。
如果您想要使用sudo
来进行切换,那么您输入的是您的密码而不是目标用户的密码(并且您必须是 sudoer):
exec sudo -iu alpha # enter your password
如果您输入密码错误,原来的 shell 不再接管,同样的问题仍然存在。但默认情况下,sudo
您会尝试多次输入密码。
如果你确实想同时使用sudo
和su
,尽管没有必要:
exec sudo su - alpha # enter your password
先放exec
会导致你的外壳取代自身使用新运行的命令,而不是等待该命令完成。