在一台CentOS服务器上,我以root身份通过SSH进行login,我这样做:
su otherusername
其中'otherusername'是另一个用户的用户名,它存在。
它什么都不做。 之后,我仍然是根。 whoami返回根目录,我创build的任何文件都属于根目录,也就是说su不是su。
但是它不会给出任何错误信息。 如果我尝试使用无效的用户名su,它会发出错误消息。
我在想什么?
otherusername是否在/etc/passwd有一个有效的shell?
su做的是以另一个用户身份执行一个进程。 它默认select的进程是/etc/passwd最后一个字段的内容。 这通常是一个诸如/bin/sh或/bin/bash的shell。 当这个过程结束时,你被转储回你开始的原来的shell,由root拥有。
就su而言,它已成功切换到正确的用户,因此不需要任何错误消息。 然后通过执行它将控制权交给configuration的shell。 如果这个shell是/bin/false ,它会直接执行/bin/false总是执行的操作,这个操作会以1( false )的状态退出,然后回到root用户拥有的父shell。 /bin/true做同样的事情,但状态为0( 真 )。
其他伪贝壳可能performance出不同的行为。 例如, /usr/sbin/nologin回声
此帐户目前不可用。
之前退出1。
您可以使用usermod -s /bin/bash otherusername作为root用户更改configuration的shell。
如果你使用cd你可能会在sudo周围看到类似的混淆行为。 如果你是一个普通的用户,不能cd进入目录, sudo cd directory将不会打印错误信息,不会改变你的根目录,也不会改变你的目录。
原因是它以root用户身份启动一个新的shell,将目录更改为正确的目录,然后立即退出,并将其留在原始目录中的原始shell中。