Linux login & non-login shell 以及su, sudo相關概念,linuxlogin
1.login & non-login shell
Linux系統自舉時,核心會建立init進程,來進行一系列的系統初始化操作。每一個使用者登入shell時,無論以偽終端登入:ssh,X11下控制台,還是tty控制台終端,都會讀取相關相關的登入設定檔。linux 有兩種登入shell:login和nologin:
- login shell:登入shell時需要完整的登入流程,稱為 login shell。何為完整:輸入使用者名稱和密碼。例如:走tty1-tty6控制終端,或走ssh等偽終端遠程登入
- non-login shell:登入shell時不需要輸入帳號資訊。例如在X11下,開啟偽終端,或者在shell下,進入shell子進程。
這兩種登入shell的區別是:在登入shell是,讀取的設定檔不同。這裡先介紹兩個設定檔/etc/profile和~/.bashrc,在unix系統中,這兩個shell環境的設定檔,是我們接觸最多的兩個檔案:
- /etc/profile,處在shell設定檔的最頂端。這是系統shell環境的全域設定,例如PATH,MAIL很多環境變數。對它的修改,會影響到所有使用者。
- ~/.bashrc,處在shell設定檔的最低端。這是針對每個使用者shell環境的設定檔,我們的大部分個人化的定製,都可以直接修改在這個檔案中。
login shell(bash)在登入時,會讀取的設定檔:
- /etc/profile,全域配置
- ~/.bash_profile 或~/.bash_login 或 ~/.profile,個人配置。之所以有三個檔案,是因為不同的shell有可能命名不同,只會按順序讀取其中的一個。
其實登入時不僅僅讀取這兩個檔案,其中在/etc/profile檔案中,還會攝入其他的設定檔,例如我的ubuntu機器上該檔案的內容如下:
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).if [ "$PS1" ]; then #如果shell環境存在且不為sh,就讀取/etc/bash.bashrc if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then # The file bash.bashrc already sets the default PS1. # PS1='\h:\w\$ ' if [ -f /etc/bash.bashrc ]; then . /etc/bash.bashrc fi else if [ "`id -u`" -eq 0 ]; then PS1='# ' else PS1='$ ' fi fifi# The default umask is now handled by pam_umask.# See pam_umask(8) and /etc/login.defs.#讀取/etc/profile.d目錄下所有的sh檔案if [ -d /etc/profile.d ]; then for i in /etc/profile.d/*.sh; do if [ -r $i ]; then . $i fi done unset ifi
對於我的ubuntu機器中~/.profile檔案內容如下:
最後shell會讀取~/.bashrc檔案。
# ~/.profile: executed by the command interpreter for login shells.# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login# exists.# see /usr/share/doc/bash/examples/startup-files for examples.# the files are located in the bash-doc package.# the default umask is set in /etc/profile; for setting the umask# for ssh logins, install and configure the libpam-umask package.#umask 022# if running bashif [ -n "$BASH_VERSION" ]; then # include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fifi# set PATH so it includes user's private bin if it existsif [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH"fi
login shell讀取配置的流程如(來自:<鳥哥>):
non-login shell(bash)在登入時,只會讀取的設定檔:~/.bashrc。bashrc這個檔案有時候不存在,需要自己建立,裡面可以進行個人化的定製,不會影響到其他使用者。
2.su &sudo
在我接觸的Linux 發行版中,ubuntu在安裝過程中不會提示root密碼的設定,只有進入系統後才能在shell下通過passwd來設定root的密碼,fedora,centos安裝過程中多會要求設定root密碼和建立一個常用的使用者。可以看出linux的設計者們本身就期望使用者以較低的許可權來進行平時的操作,這是基于于安全的考慮。
但在shell環境下,由於各種工作的需要,我們經常需要進行使用者權限的切換,最常用的就是擷取root使用者的許可權。最常用的命令有su和sudo。
su [-lc] [username]- , -l, --login : 表示使用以login shell的方式登入username,若username為空白,則預設登入root。 如果沒有該參數,則以nonlogin的方式登入-c, 僅執行一次命令 ,命令需要用引號括起來
這裡要強調的就是
su 和su -的區別,就是前面撤了一大串的
login 和non-login的區別。
sudo命令的存在我覺得有兩個原因:
- 使用su切換到root,需要是所有使用者都知道root密碼,不安全;
- 很多時候我們切換到root使用者只是需要執行一條語句,儘管su -c可以完成,但每次都要敲個空格-c,而且每次都要輸入root密碼;
上面兩個原因,就是sudo存在的理由。sudo可以讓使用者通過驗證自己的密碼來獲得其他使用者的許可權,只需要root對/etc/sudoers進行相關的配置,我的sudoers檔案的內容如下:
# User privilege specificationroot ALL=(ALL:ALL) ALL# admin群組成員可以切換到任何使用者執行任何命令%admin ALL=(ALL) ALL# Allow members of group sudo to execute any command%sudo ALL=(ALL:ALL) ALL#users群組不要求輸入密碼進行切換%users ALL=(ALL) NOPASSWD:ALL#允許guest切換到samba_group組中的所有使用者guest ALL=(%samba_group:ALL) ALL
sudoers中設定一個使用者具有sudo許可權的方式如下:
登入者帳號 登入者的來源主機名稱=(可切換身份)可執行檔命令
登入者帳號可以為:個人,群組,別名。群組需要在前面加%來標誌
對於別名,sudoers結構的四個組成部分都可以用別名表示:User_Alias , Runas_Alias, Host_Alias, Cmnd_Alias
每個別名的命名格式:Alias_Type NAME = item1, item2, ...,別名NAME必須由大寫字母,數字,底線組成,開頭為大寫字母。
例如:
User_Alias SBGROUP = user1, user2, user3
SBGROUP ALL=(ALL) ALL
為了保證/etc/sudoers文法的正確,我們一般通過visudo來編輯該檔案。