Python使用subprocess模塊檢測(cè)Linux用戶是否存在
一、背景說(shuō)明
在 Linux 服務(wù)器自動(dòng)化運(yùn)維、初始化腳本或容器環(huán)境中,經(jīng)常需要判斷某個(gè)系統(tǒng)用戶是否存在:
- 如果存在:直接使用
- 如果不存在:自動(dòng)創(chuàng)建用戶
本文介紹如何使用 Python 的 subprocess 模塊,調(diào)用系統(tǒng)命令 id 和 adduser,實(shí)現(xiàn) 檢測(cè) Unix 用戶是否存在,不存在則創(chuàng)建 的功能。
適用于:
- Ubuntu / Debian 系統(tǒng)
- Python 運(yùn)維腳本
- 自動(dòng)化部署場(chǎng)景
二、實(shí)現(xiàn)思路
整體邏輯非常簡(jiǎn)單:
1.使用 id username
- 如果用戶存在,命令返回 0
- 如果用戶不存在,命令返回非 0
2.通過(guò) subprocess.run(..., check=True):命令失敗會(huì)拋出 CalledProcessError
3.捕獲異常后,調(diào)用 adduser 創(chuàng)建用戶
流程圖如下:
檢測(cè)用戶是否存在
│
├── 存在 → 輸出 User exists
│
└── 不存在 → 創(chuàng)建用戶 → 輸出創(chuàng)建成功
三、完整代碼示例
import subprocess
# 替換為你要檢測(cè)/創(chuàng)建的用戶名
unix_username = "username"
try:
# 1. 檢測(cè)用戶是否存在
subprocess.run(
["id", unix_username],
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
print("User exists")
except subprocess.CalledProcessError:
try:
# 2. 用戶不存在,創(chuàng)建用戶
subprocess.run(
["adduser", "-m", "-s", "/bin/bash", unix_username],
check=True
)
print(f"User {unix_username} created successfully.")
except subprocess.CalledProcessError as e:
print(f"Error creating user: {e}")
print("User does not exist")
四、代碼說(shuō)明
id username
id username
- 用戶存在:返回 UID、GID 等信息
- 用戶不存在:返回錯(cuò)誤碼(非 0)
Python 中用來(lái)判斷用戶是否存在非常合適。
subprocess.run參數(shù)說(shuō)明
subprocess.run(
["id", unix_username],
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
關(guān)鍵參數(shù)說(shuō)明:
| 參數(shù) | 作用 |
|---|---|
| check=True | 命令失敗時(shí)拋出異常 |
| stdout=subprocess.PIPE | 捕獲標(biāo)準(zhǔn)輸出 |
| stderr=subprocess.PIPE | 捕獲錯(cuò)誤輸出 |
創(chuàng)建用戶命令
["adduser", "-m", "-s", "/bin/bash", unix_username]
參數(shù)含義:
| 參數(shù) | 說(shuō)明 |
|---|---|
| -m | 創(chuàng)建 home 目錄 |
| -s /bin/bash | 設(shè)置默認(rèn) shell |
| username | 用戶名 |
五、運(yùn)行注意事項(xiàng)(很重要)
必須使用 root 權(quán)限
adduser 需要 root 權(quán)限,否則會(huì)失?。?/p>
sudo python3 create_user.py
或者腳本本身運(yùn)行在 root 用戶下。
適用系統(tǒng)
- Ubuntu / Debian(使用
adduser) - CentOS / RHEL(需改為
useradd)
CentOS 示例:
["useradd", "-m", "-s", "/bin/bash", unix_username]
避免交互式創(chuàng)建(推薦)
adduser 默認(rèn)可能會(huì)進(jìn)入交互模式,生產(chǎn)環(huán)境建議使用非交互方式:
adduser --disabled-password --gecos "" username
對(duì)應(yīng) Python:
["adduser", "--disabled-password", "--gecos", "", unix_username]
六、常見(jiàn)錯(cuò)誤
Permission denied
原因:沒(méi)有 root 權(quán)限
解決:
sudo python3 script.py
adduser: command not found
原因:系統(tǒng)是 CentOS / Alpine
解決:改用 useradd
到此這篇關(guān)于Python使用subprocess模塊檢測(cè)Linux用戶是否存在的文章就介紹到這了,更多相關(guān)Python subprocess檢測(cè)Linux用戶是否存在內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 包含漢字的文件讀寫(xiě)之每行末尾加上特定字符
這篇文章主要介紹了Python 包含漢字的文件讀寫(xiě)之每行末尾加上特定字符的相關(guān)資料,需非常不錯(cuò),具有參考借鑒價(jià)值,要的朋友可以參考下2016-12-12
python SQLAlchemy 數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn)
SSQLAlchemy提供了強(qiáng)大的連接池和連接管理功能,可以有效地管理數(shù)據(jù)庫(kù)連接,本文主要介紹了python SQLAlchemy 數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03
opencv 獲取rtsp流媒體視頻的實(shí)現(xiàn)方法
這篇文章主要介紹了opencv 獲取rtsp流媒體視頻的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
python numpy實(shí)現(xiàn)rolling滾動(dòng)案例
這篇文章主要介紹了python numpy實(shí)現(xiàn)rolling滾動(dòng)案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
Python中functools模塊的常用函數(shù)解析
這篇文章主要介紹了Python中functools模塊的常用函數(shù)解析,分別講解了partial、update_wrapper、wraps、total_ordering的用法,需要的朋友可以參考下2016-06-06
一個(gè)基于flask的web應(yīng)用誕生 bootstrap框架美化(3)
一個(gè)基于flask的web應(yīng)用誕生第三篇,這篇文章主要介紹了前端框架bootstrap與flask框架進(jìn)行整合,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Python爬蟲(chóng)簡(jiǎn)單運(yùn)用爬取代理IP的實(shí)現(xiàn)
這篇文章主要介紹了Python爬蟲(chóng)簡(jiǎn)單運(yùn)用爬取代理IP的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Python3 實(shí)現(xiàn)隨機(jī)生成一組不重復(fù)數(shù)并按行寫(xiě)入文件
下面小編就為大家分享一篇Python3 實(shí)現(xiàn)隨機(jī)生成一組不重復(fù)數(shù)并按行寫(xiě)入文件的示例。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04

