Linux为每个进程设置了3个ID:实践用户id,有用和用户id和保存的设置id。
关于这3个id,需求留意以下几个方面:
1.只要root才干改动进程的实践用户id。例如,用户从终端login程序登陆,此刻login程序的3个id都是root。然后正确输入用户名暗码之后,login程序所以setuid到注册的id。所以3个id都被改成了注册的用户id。然后exec shell程序。非root用户注册进入shell之后,他的实践用户id是绝对不会被更改的。除非logout之后,从头注册shell。一些su改动用户的操作实践上都是改动shell进程的有用用户id,并不是shell进程的实践用户id。
2.exec程序时,可履行文件有一个设置id位,该位的设置与否与进程的有用用户id和保存的设置id有很大联系。可以用ll指令检查,如果有s符号的话阐明设置了,不然没有。首要没有设置的状况,3个id均不会改动和调用者的进程的id相同。现在是设置了的状况,实践用户id依然不会改动,有用用户id则设置为可履行文件的属主用户,保存的设置id设置成有用用户id相同。这样的程序有许多,比方passwd,su等。例如,passwd程序,一个普通用户foo经过shell履行passwd,首要shell进程fork发生一个子进程,然后子进程exec passwd程序。因为passwd设置了设置id位,而且passwd是归于root用户。所以子进程设置有用用户id位为root,保存的设置用户id也设置成了root。passwd履行结束时,再改动有用用户id和保存的设置用户id为曾经的实践用户id的值。
3.保存的设置-用户- ID 是由exec从有用用户I D仿制的。在exec按文件用户I D设置了有用用户I D后,即进行这种仿制,并将此副本保存起来。