PHP Class Passwd

Posted by Tully on Fri 05 February 2010

Just for fun, I wrote a short simple class to parse the Linux passwd file. The class has methods to return the content in either html or text for the command line. The difference being one has <br /> statements and the other has \n statements for new lines. The class also contains a method to search for a user as well as a method to delete a user.

PHP Class to Read and Manipulate /etc/passwd

/**  
 * Class is used to read, search, and manipulate linux passwd file.  
 *   
 * @author  Tully Rankin  
 * @website www.tullyrankin.com  
 */  
class ReadPasswd {  
    private $file;  
    private $fileData;  
    private $error;

    /*  
     * Initialize the class and add contents of  
     * the password file into the variable file.  
     */  
    function __construct($file) {  
        try{  
            if (is_file($file))   
            {  
                $this->fileData = file($file);  
                $this->file = $file;  
            }  
            else   
            {  
                throw new Exception("Couldn't open file.");  
            }  
        } catch (Exception $e) {  
            $this->error[] = $e->getMessage();  
        }  
    }  
      
    /*  
     * Returns string of all rows of data from the passwd file.   
     * Use this file if your trying to display in the browser.  
     *   
     * @type Public  
     * @return String  
     */   
    public function getAllHTML() {  
        foreach ($this->fileData as $content)  
        {  
            $temp = explode(':', $content);  
            $output .= "<b>Username:  {$temp[0]} </b><br />";  
            $output .= "Validation: {$temp[1]} <br />";  
            $output .= "User Identifier: {$temp[2]} <br />";  
            $output .= "Group Identifier: {$temp[3]} <br />";  
            $output .= "Gecos Field: {$temp[4]} <br />";  
            $output .= "Home Directory: {$temp[5]} <br />";  
            $output .= "Shell: {$temp[6]} <br />";  
            $output .= "<br />";  
        }  
        return $output;  
    }  
      
    /*  
     * Returns string of all rows of data from the passwd file. This is  
     * used if running the command from the command line.  
     *   
     * @type Public  
     * @return String  
     */   
    public function getAllCLI() {  
        foreach ($this->fileData as $content)  
        {  
            $temp = explode(':', $content);  
            $output .= "Username: {$temp[0]} n";  
            $output .= "Validation: {$temp[1]} n";  
            $output .= "User Identifier: {$temp[2]} n";  
            $output .= "Group Identifier: {$temp[3]} n";  
            $output .= "Gecos Field: {$temp[4]} n";  
            $output .= "Home Directory: {$temp[5]} n";  
            $output .= "Shell: {$temp[6]} n";  
            $output .= "n";  
        }  
        return $output;  
    }  
      
    /*  
     * Searches for a user. Will return an array with  
     * the users credentials unless the second param is set.  
     * If true is set on the second parameter then the function  
     * will withold add the the user information to the returned
array.  
     *   
     * @type Public  
     * @params String, Boolean  
     * @return Array  
     */  
    public function searchUser($user,$data=0) {  
        try{  
            $data = array();  
            if (is_string($user))   
            {  
                foreach($this->fileData as $line)  
                {  
                    $temp = explode(':', $line);  
                    if (in_array($user,$temp))  
                    {  
                        if ($data) return 1;  
                        $data['username'] = $temp[0];  
                        $data['validation'] = $temp[1];  
                        $data['user_identifier'] = $temp[2];  
                        $data['group_identifier'] = $temp[3];  
                        $data['gecos'] = $temp[4];  
                        $data['home_directory'] = $temp[5];  
                        $data['shell'] = $temp[6];  
                    }  
                }
            }  
            else  
            {  
                throw new Exception('A search error has occured.');  
            }  
        } catch (Exception $e) {  
            $this->error[] = $e->getMessage();  
        }  
        return $data;  
    }  
      
    /*  
     * Getter for Error Exception Array  
     * @type Public  
     * @return Array  
     */  
    public function getError() {  
        return $this->error;  
    }  
      
    /*  
     * Removes user from passwd file  
     * @type public  
     * @return Boolean  
     */  
    public function deleteUser($user) {  
        try{  
            if ($this->searchUser($user,1))  
            {   
                foreach ($this->fileData as $line)   
                {  
                    $lines = explode(":",$line);  
                    if (!in_array($user,$lines))  
                    {  
                        $final .= $line;  
                    }  
                }  
                if(!file_put_contents($this->file,$final))  
                {  
                    throw new Exception("Could not delete user.");  
                }  
            }  
            else   
            {  
                throw new Exception("User doesn't exist.");  
            }   
        } catch (Exception $e) {  
            echo $this->error[] = $e->getMessage();  
        }  
    }      
}