網站首頁 編程語言 正文
用戶切換相關命令
為什么要進行用戶切換?
在操作過程中需要使用特定的用戶進行特定的操作,多數情況下是因為權限,比如要修改一個文件,只有root用戶有權限修改,那么就要切換到root用戶下進行操作。切換用戶一般有兩個命令:
1. su命令
su命令不加參數,默認切到root用戶,需要輸入root用戶密碼進行驗證,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
exit命令可退出root用戶。
su命令可以加一個“-”再加上用戶名,此時,不但身份變化了,同時也擁有了此用戶的“用戶環境”,比如用戶家目錄以及此用戶的其它個性化設置。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
普通用戶切換其它用戶需要知道其它用戶的密碼,root用戶使用su命令切換其它用戶,不需要知道用戶密碼
2. sudo命令
Linux是多用戶多任務的操作系統, 共享該系統的用戶往往不只一個。
出于安全性考慮, 有必要通過useradd
創建一些非root用戶, 只讓它們擁有不完全的權限; 如有必要,再來提升權限執行。
sudo就是來解決這個需求的: 這些非root用戶不需要知道root的密碼,就可以提權到root,執行一些root才能執行的命令。
執行sudo -u <用戶名> <命令>
, 將允許當前用戶,提權到<用戶名>
的身份,再執行后面的<命令>
, 即使<命令>
原本需要root權限。
提權到<用戶名>
身份時,是以<用戶名>
的身份來執行命令的,因此創建的文件默認屬于<用戶名>
用戶。
因此,當userB執行如下命令時:
sudo -u userA touch /tmp/belong-to-who.tmp
創建的/tmp/belong-to-who.tmp
文件屬于用戶userA。
如果不帶-u
, 則默認使用root用戶,而大多數時候sudo都是要提權到root的,所以-u <用戶名>
可以省略為:
sudo <命令>
需要注意的是: 執行sudo時輸入的密碼是當前用戶的密碼, 并非<用戶名>
的密碼。sudo -u <用戶名>
和su - <用戶名>
相比:
前者需要輸入當前用戶的密碼,提權到<用戶名>
身份執行命令后返回當前用戶;
后者則是輸入目標用戶的密碼,切換到目標用戶。
賦予用戶sudo操作的權限
通過useradd
添加的用戶,并不具備sudo權限。在ubuntu/centos等系統下, 需要將用戶加入admin組或者wheel組或者sudo組。
以root用戶身份執行如下命令, 將用戶加入wheel/admin/sudo組:
usermod -a -G wheel <用戶名>
如果提示wheel組不存在, 則還需要先創建該組:
groupadd wheel
用公式講解/etc/sudoers的內容
sudo的權限控制可以在/etc/sudoers
文件中查看到。
如果想要控制某個用戶(或某個組用戶)只能執行root權限中的一部分命令, 或者允許某些用戶使用sudo時不需要輸入密碼,就需要對該文件有所了解。
一般來說,通過cat /etc/sudoers
指令來查看該文件, 會看到如下幾行代碼:
root ALL=(ALL:ALL) ALL %wheel ALL=(ALL) ALL %sudo ALL=(ALL:ALL) ALL
對/etc/sudoers
文件進行編輯的代碼公式可以概括為:
授權用戶/組 主機=[(切換到哪些用戶或組)] [是否需要輸入密碼驗證] 命令1,命令2,...
凡是[ ]
中的內容, 都能省略; 命令和命令之間用,
號分隔;
為了方便說明, 將公式的各個部分稱呼為字段1 - 字段5:
授權用戶/組 主機 =[(切換到哪些用戶或組)] [是否需要輸入密碼驗證] 命令1,命令2,... 字段1 字段2 =[(字段3)] [字段4] 字段5
字段3、字段4,是可以省略的。
在上面的默認例子中, "字段1"不以%
號開頭的表示"將要授權的用戶", 比如例子中的root
;
以%
號開頭的表示"將要授權的組", 比如例子中的%wheel
組 和 %sudo
組。
"字段2"表示允許登錄的主機, ALL表示所有; 如果該字段不為ALL,表示授權用戶只能在某些機器上登錄本服務器來執行sudo命令. 比如:
jack mycomputer=/usr/sbin/reboot,/usr/sbin/shutdown
表示: 普通用戶jack在主機(或主機組)mycomputer上, 可以通過sudo執行reboot和shutdown兩個命令。"字段3"和"字段4"省略。
"字段3"如果省略, 相當于(root:root)
,表示可以通過sudo
提權到root; 如果為(ALL)
或者(ALL:ALL)
, 表示能夠提權到(任意用戶:任意用戶組)
。
請注意,"字段3"如果沒省略,必須使用( )
雙括號包含起來。這樣才能區分是省略了"字段3"還是省略了"字段4"。
"字段4"的可能取值是NOPASSWD:
。請注意NOPASSWD后面帶有冒號:
。表示執行sudo時可以不需要輸入密碼。比如:
lucy ALL=(ALL) NOPASSWD: /bin/useradd
表示: 普通用戶lucy可以在任何主機上, 通過sudo執行/bin/useradd
命令, 并且不需要輸入密碼.
又比如:
peter ALL=(ALL) NOPASSWD: ALL
表示: 普通用戶peter可以在任何主機上, 通過sudo執行任何命令, 并且不需要輸入密碼。
"字段5"是使用逗號分開一系列命令,這些命令就是授權給用戶的操作; ALL表示允許所有操作。
你可能已經注意到了, 命令都是使用絕對路徑, 這是為了避免目錄下有同名命令被執行,從而造成安全隱患。
如果你將授權寫成如下安全性欠妥的格式:
lucy ALL=(ALL) chown,chmod,useradd
那么用戶就有可能創建一個他自己的程序, 也命名為userad, 然后放在它的本地路徑中, 如此一來他就能夠使用root來執行這個"名為useradd的程序"。這是相當危險的!
命令的絕對路徑可通過which
指令查看到: 比如which useradd
可以查看到命令useradd
的絕對路徑: /usr/sbin/useradd
公式還要擴充
例子1:
papi ALL=(root) NOPASSWD: /bin/chown,/usr/sbin/useradd
表示: 用戶papi能在所有可能出現的主機上, 提權到root下執行/bin/chown, 不必輸入密碼; 但運行/usr/sbin/useradd 命令時需要密碼.
這是因為NOPASSWD:
只影響了其后的第一個命令: 命令1.
上面給出的公式只是簡化版,完整的公式如下:
授權用戶/組 主機=[(切換到哪些用戶或組)] [是否需要輸入密碼驗證] 命令1, [(字段3)] [字段4] 命令2, ...
在具有sudo操作的用戶下, 執行sudo -l
可以查看到該用戶被允許和被禁止運行的命令.
通配符和取消命令
例子2:
papi ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk
用例子2來說明通配符*
的用法, 以及命令前面加上!
號表示取消該命令。
該例子的意思是: 用戶papi在所有可能出現的主機上, 能夠運行目錄/usr/sbin和/sbin下所有的程序, 但fdisk除外.
開始編輯
“你講了這么多,但是在實踐中,我去編輯/etc/sudoers文件,系統提示我沒權限啊,怎么辦?”
這是因為/etc/sudoers
的內容如此敏感,以至于該文件是只讀的。所以,編輯該文件前,請確認清楚你知道自己正在做什么。
強烈建議通過visudo
命令來修改該文件,通過visudo
修改,如果配置出錯,會有提示。
不過,系統文檔推薦的做法,不是直接修改/etc/sudoers
文件,而是將修改寫在/etc/sudoers.d/
目錄下的文件中。
如果使用這種方式修改sudoers,需要在/etc/sudoers
文件的最后行,加上#includedir /etc/sudoers.d
一行(默認已有):
#includedir /etc/sudoers.d
注意了,這里的指令#includedir
是一個整體, 前面的#
號不能丟,并非注釋,也不能在#
號后有空格。
任何在/etc/sudoers.d/
目錄下,不以~
號結尾的文件和不包含.
號的文件,都會被解析成/etc/sudoers
的內容。
文檔中是這么說的:
# This will cause sudo to read and parse any files in the /etc/sudoers.d
# directory that do not end in '~' or contain a '.' character.
# Note that there must be at least one file in the sudoers.d directory (this
# one will do), and all files in this directory should be mode 0440.
# Note also, that because sudoers contents can vary widely, no attempt is
# made to add this directive to existing sudoers files on upgrade.
# Finally, please note that using the visudo command is the recommended way
# to update sudoers content, since it protects against many failure modes.
其他小知識
輸入密碼時有反饋
當使用sudo后輸入密碼,并不會顯示任何東西 —— 甚至連常規的星號都沒有。有個辦法可以解決該問題。
打開/etc/sudoers
文件找到下述一行:
Defaults env_reset
修改成:
Defaults env_reset,pwfeedback
修改sudo會話時間
如果你經常使用sudo 命令,你肯定注意到過當你成功輸入一次密碼后,可以不用再輸入密碼就可以運行幾次sudo命令。
但是一段時間后,sudo 命令會再次要求你輸入密碼。默認是15分鐘,該時間可以調整。添加timestamp_timeout=分鐘數
即可。
時間以分鐘為單位,-1表示永不過期,但強烈不推薦。
比如我希望將時間延長到1小時,還是打開/etc/sudoers
文件找到下述一行:
Defaults env_reset
修改成:
Defaults env_reset,pwfeedback,timestamp_timeout=60
原文鏈接:https://blog.csdn.net/weixin_49421756/article/details/122665564
相關推薦
- 2024-01-08 Spring AOP 切面@Around注解的具體使用
- 2022-07-21 python logging模塊使用介紹
- 2022-04-27 VSCode?IDE?配置環境過程解析_C 語言
- 2022-05-01 docker鏡像與傳統vm虛擬機區別及分析_docker
- 2022-01-30 visibilitychange事件在移動端開發的使用
- 2022-08-10 Pandas?sample隨機抽樣的實現_python
- 2022-11-07 將.py文件轉化為.exe文件的詳細過程_python
- 2021-12-06 樹莓派4B+EdgeX+MQTT的填坑之旅
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支