在Linux的操做中常常會用到su 命令進行用戶的切換和sudo命令獲取root權限,su su- sudo三個命令常常弄混,下面簡單的講解下。
1、查看su的命令幫助信息:
pipci@openSUSE:~> su --help
用法:
su [選項] [-] [<用戶> [<參數>...]]
將有效用戶 id 和組 id 更改成<用戶>的 id。
單個 - 視爲 -l。若是未指定<用戶>,將假定爲 root。
選項:
-m, -p, --preserve-environment 不重置環境變量
-g, --group <組> 指定主組
-G, --supp-group <組> 指定一個輔助組
-, -l, --login 使 shell 成爲登陸 shell
-c, --command <命令> 使用 -c 向 shell 傳遞一條命令
--session-command <命令> 使用 -c 向 shell 傳遞一條命令
而不建立新會話
-f, --fast 向shell 傳遞 -f 選項(csh 或 tcsh)
-s, --shell <shell> 若 /etc/shells 容許,運行<shell>
-h, --help 顯示此幫助並退出
-V, --version 輸出版本信息並退出
pipci@openSUSE:~>
su(switch user)命令用於變動爲其餘使用者的身份,須要鍵入該使用者的密碼。若是後面不加帳戶時系統默認爲root帳戶,密碼也root帳戶的密碼。沒有時間限制。經過上面的幫助信息能夠知道su - 是命令su -l的簡寫。su -l的意思是使shell 成爲登陸shell,那麼什麼是登陸shell那?
2、shell
一、什麼是shell
shell簡單的理解就是命令解釋器,他將咱們發出的指令轉化爲計算機可以理解的命令,只有經過他咱們才能和計算機進行溝通,提供人機交互的接口。
二、什麼是Bash shell
Unix的發展過程當中出現了不少版本的shell,Linux默認使用的Bash shell就是其中的一個版本,Bash(Bourne-Again SHell )shell是Bourne shell(sh)的加強版
也是GUN計劃的一部分,其餘比較著名的shell好比C shell,這裏就不作介紹了。
二、查看系統支持的shell (openSUSE系統下)
pipci@openSUSE:~> cat /etc/shells
/bin/ash
/bin/bash #Bash shell
/bin/csh #C Shell
/bin/dash
/bin/false
/bin/ksh
/bin/ksh93
/bin/mksh
/bin/pdksh
/bin/sh
/bin/tcsh
/bin/true
/bin/zsh
.......
pipci@openSUSE:~>
三、查看登陸用戶使用的shell
pipci@openSUSE:~> cat /etc/passwd
........
uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
vnc:x:487:486:user for VNC:/var/lib/empty:/sbin/nologin
wwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false
pipci:x:1000:100:Pipci:/home/pipci:/bin/bash
pipci@openSUSE:~>
能夠看出登陸用戶pipci使用的是/bin/bash 既Bash shell
四、登陸shell (login shell)
獲取bash shell的時候須要完整的登陸流程,輸入用戶名和密碼,就稱爲登陸shell,好比經過ssh方式鏈接,或者由tty1 ~ tty6 登錄,須要輸入用戶的帳號與密碼,此時取得的 bash 就稱爲login shell
五、非登錄shell (non-login shell):
取得 bash 接口的方法不須要重複登錄的舉動
好比你以 X window(圖形界面) 登錄 Linux 後, 再以 X 的圖形化接口啓動終端機,此時該終端接口無需輸入帳號與密碼,則爲non-login shell
再好比你在本來的 bash 環境下再次執行 bash 這個命令,一樣的也沒有輸入帳號密碼, 這個新的 bash (子程序) 也是 non-login shell
六、登陸shell與非登錄shell的區別
執行logout命令,退出登陸shell(不能退出非登陸shell,能夠判斷當前是否爲登陸shell)。
pipci@openSUSE:~> logout #假設爲登陸shell,嘗試退出
bash: logout: 不是登陸 shell: 使用 `exit' #能夠判斷當下不是登陸shell
pipci@openSUSE:~> su #切換用戶,若是su後面不指定用戶,默認指定爲root
密碼: #輸入root密碼
openSUSE:/home/pipci # logout #判斷切換root用戶後是不是登陸用戶
bash: logout: 不是登陸 shell: 使用 `exit' #能夠判斷不是登陸用戶
openSUSE:/home/pipci # exit
exit
pipci@openSUSE:~> su - #經過su -命令使 shell 成爲登陸 shell
密碼:
openSUSE:~ # logout #能夠判斷su -後是登陸shell
pipci@openSUSE:~>
上面只是經過命令演示了登陸和非登陸,真正的區別在於登陸shell會重新加載環境變量的,當使用su -命令切換爲root用戶時shell環境也會一同切換爲root shell環境,非登陸shell不會重新加載環境變量,經過su命令切換爲root用戶時shell環境不會一同切換爲root shell環境,仍是在普通用戶環境,只有切換了Shell環境纔不會出現PATH環境變量錯誤,也就是找不的命令的錯誤,由於在命令行下輸入的每一個命令都會從PATH環境變量對應的目錄搜索相應命令的執行文件,不一樣的用戶有不一樣的環境對應不一樣的PATH環境變量,也就是不一樣的命令搜索目錄,這樣就會形成有的命令普通環境沒法找到,並且su切換成root用戶之後,pwd一下,發現工做目錄仍然是普通用戶的工做目錄;而用su -命令切換之後,工做目錄變成root的工做目錄了。
舉例說明:
pipci@ubuntu:~$ pwd #查看工做目錄
/home/pipci
pipci@ubuntu:~$ echo $PATH #產品普通用戶PATH環境變量值
/usr/local/java/jre1.8.0_161/bin:/home/pipci/bin:/home/pipci/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
pipci@ubuntu:~$ su -
密碼:
root@ubuntu:~# pwd #查看工做目錄
/root
root@ubuntu:~# echo $PATH #產品root用戶PATH環境變量值
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
root@ubuntu:~#
3、sudo
sudo是linux系統管理指令,是容許系統管理員讓普通用戶執行一些或者所有的root命令的一個工具,如halt,reboot,su等等。這樣不只減小了root用戶的登陸 和管理時間,一樣也提升了安全性。sudo不是對shell的一個代替,它是面向每一個命令的。
在sudo於1980年先後被寫出以前,通常用戶管理系統的方式是利用su切換爲超級用戶。可是使用su的缺點之一在於必需要先告知超級用戶的密碼。這樣用戶得到root權限後就能夠肆無忌憚的作任何操做,這樣萬一用戶設置的不當就有可能讓整個系統癱瘓。
sudo使通常用戶不須要知道超級用戶的密碼便可得到權限。首先超級用戶將普通用戶的名字、能夠執行的特定命令、按照哪一種用戶或用戶組的身份執行等信息,記錄在特殊的文件中(一般是/etc/sudoers),即完成對該用戶的受權(此時該用戶稱爲「sudoer」);在通常用戶須要取得特殊權限時,其可在命令前加上「sudo」,此時sudo將會詢問該用戶本身的密碼(以確認終端機前的是該用戶本人),回答後系統即會將該命令的進程以超級用戶的權限運行。以後的一段時間內(默認爲5分鐘,不一樣的發行版可能不同,可在/etc/sudoers自定義),使用sudo不須要再次輸入密碼。
因爲不須要超級用戶的密碼,部分Unix系統甚至利用sudo使通常用戶取代超級用戶做爲管理賬號,例如Ubuntu、Mac OS X等。
sudo也有點相似Windows下面的以管理員身份運行這樣的功能。可是sudo可配置性會更多些。
編輯sudo的配置文件/etc/sudoers通常不要直接使用vi(vi /etc/sudoers)去編輯,由於sudoers配置有必定的語法,直接用vi編輯保存系統不會檢查語法,若有錯也保存了可能致使沒法使用sudo工具,最好使用visudo命令去配置。雖然visudo也是調用vi去編輯,可是保存時會進行語法檢查,有錯會有提示
一、查看sudo的命令幫助信息:
pipci@openSUSE:~> sudo -h
sudo - 以其餘用戶身份執行一條命令
usage: sudo -h | -K | -k | -V
usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] [VAR=value] [-i|-s] [<command>]
usage: sudo -e [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] file ...
選項:
-A, --askpass 使用助手程序進行密碼提示
-b, --background 在後臺運行命令
-C, --close-from=num 關閉全部 >= num 的文件描述符
-E, --preserve-env 在執行命令時保留用戶環境
-e, --edit 編輯文件而非執行命令
-g, --group=group 以指定的用戶組或 ID 執行命令
-H, --set-home 將 HOME 變量設爲目標用戶的主目錄。
-h, --help 顯示幫助消息並退出
-h, --host=host 在主機上運行命令(若是插件支持)
-i, --login 以目標用戶身份運行一個登陸 shell;可同時指定一條命令 #至關於su -
-K, --remove-timestamp 徹底移除時間戳文件
-k, --reset-timestamp 無效的時間戳文件
-l, --list 列出用戶權限或檢查某個特定命令;對於長格式,使用兩次
-n, --non-interactive 非交互模式,不提示
-P, --preserve-groups 保留組向量,而非設置爲目標的組向量
-p, --prompt=prompt 使用指定的密碼提示
-r, --role=role 以指定的角色建立 SELinux 安全環境
-S, --stdin 從標準輸入讀取密碼
-s, --shell 以目標用戶運行 shell;可同時指定一條命令 #至關於su
-t, --type=type 以指定的類型建立 SELinux 安全環境
-T, --command-timeout=timeout 在達到指定時間限制後終止命令
-U, --other-user=user 在列表模式中顯示用戶的權限
-u, --user=user 以指定用戶或 ID 運行命令(或編輯文件)
-V, --version 顯示版本信息並退出
-v, --validate 更新用戶的時間戳而不執行命令
-- 中止處理命令行參數
pipci@openSUSE:~>
java