openlava/LSF 用戶組管理腳本

背景

在openlava運維中經常需要自動化一些常規操作,比如增加用戶組以及組成員、刪除用戶組成員、刪除用戶組等。而openlava的配置文件需要手動修改,然后再通過badmin ?reconfig激活配置。因此開發腳本將手工操作自動化就很有必要。

通過將腳本中的UserGroup替換為HostGroup,就可以對主機組進行操作。

此腳本也適用于 LSF 用戶組管理;不過LSF支持通過bconf修改配置,不再需要badmin reconfig激活。

功能

下面的腳本就可以對openlava中的用戶組進行操作:

* 增加用戶組成員,如果組不存在則自動創建用戶組;

* 刪除用戶組成員,如果組內已沒有成員則自動刪除用戶組;

* 刪除用戶組

* 檢查用戶組是否包含成員;

參數

在使用之前需要設置以下參數:

LSF_PROFILE="/openlava/etc/openlava.sh"
GROUP_FILE="/openlava/etc/lsb.users"
LOG_FILE="/openlava/log/lavaug.log"
ADMIN="lsfadmin"

使用方法

1. 檢查用戶組是否包含成員

lavaug checkmember <group> <member>

返回碼:0 包含 非0 不包含

2. 增加用戶組成員

lavaug addmember <group> <member>

返回碼:0 添加成功 非0 添加失敗

3. 刪除用戶組成員

lavaug rmmember <group> <member>

返回碼:0 刪除成功 非0?刪除失敗

4. 刪除用戶組

lavaug rmgroup?<group>?

返回碼:0 刪除成功 非0?刪除失敗

注:腳本會將操作以及錯誤寫入日志文件,方便審記和排查錯誤。

源代碼

#!/bin/bashlogger() {echo `date` $@ >>  $LOG_FILE
}# 判斷配置文件中組名是否存在
is_group_defined() {local group=$1local file=$2# 使用 awk 查找在 "Begin UserGroup" 和 "End UserGroup" 之間的組名local group=$(awk -v group="$group" '/Begin UserGroup/,/End UserGroup/ { if ($1 == group) print $1 }' "$file")if [ -n "$group" ]; thenreturn 0elsereturn 1fi
}# 判斷配置文件中的組中是否包含指定成員
is_member_in_group() {local group=$1local member=$2local file=$3# 使用 awk 查找在 "Begin UserGroup" 和 "End UserGroup" 之間的組名用用戶名local result=$(awk -v group="$group" -v member="$member" '/Begin UserGroup/,/End UserGroup/ {if ($1 == group && index($0, member)) {print member}}' "$file")if [ -n "$result" ]; thenreturn 0elsereturn 1fi
}# 在配置文件中添加新成員到組中
add_group_member() {local group=$1local member=$2local file=$3# 創建臨時文件local tmp_file=$(mktemp)# 使用 awk 處理文件,找到組名并添加新成員,其他行保持不變,輸出到臨時文件awk -v group="$group" -v member="$member" '/Begin UserGroup/,/End UserGroup/ {# 在組名后的括號內添加新成員,確保不重復添加if ($1 == group && !index($0, member)) {sub(/)/, " " member ")")}}{ print }' "$file" > "$tmp_file"# 替換原文件mv "$tmp_file" "$file"chown "$ADMIN":"$ADMIN" "$file"is_member_in_group "$group" "$member" "$file"return $?
}# 在配置文件中刪除組成員, 成員列表為空時刪除組
rm_group_member() {local group=$1local member=$2local file=$3# 創建臨時文件local tmp_file=$(mktemp)# 使用 awk 處理文件,找到組名并刪除成員,其他行保持不變,輸出到臨時文件awk -v group="$group" -v member="$member" '/Begin UserGroup/,/End UserGroup/ {# 在成員列表中刪除指定成員, 若成員為空則刪除組if ($1 == group && index($0, member)) {gsub(" *" member " *", " ")if ($2 == "(" && $3 == ")") {next}}}{ print }' "$file" > "$tmp_file"# 替換原文件mv "$tmp_file" "$file"chown "$ADMIN":"$ADMIN" "$file"if ! is_member_in_group "$group" "$member" "$file" ; thenreturn 0elsereturn 1fi
}# 在配置文件中創建新組并添加新成員
create_group() {local group=$1local member=$2local file=$3# 創建臨時文件local tmp_file=$(mktemp)    # 使用 awk 處理文件,在 "End UserGroup" 前添加新組,如果 "Begin UserGroup" 和 "End UserGroup" 存在awk -v group="$group" -v member="$member" 'BEGIN { group_added = 0 }/Begin UserGroup/ {in_group = 1}/End UserGroup/ {if (!group_added) {print group " (" member ")"group_added = 1}in_group = 0}in_group { print }!in_group { print }' "$file" > "$tmp_file"# 如果沒有找到 "Begin UserGroup" 和 "End UserGroup",則直接在文件末尾添加if ! is_group_defined "$group" "$tmp_file"; thenecho -e "\nBegin UserGroup\n"$group" ("$member")\nEnd UserGroup" >> "$tmp_file"fi# 替換原文件mv "$tmp_file" "$file"chown "$ADMIN":"$ADMIN" "$file"is_member_in_group "$group" "$member" "$file"return $?
}# 在配置文件中刪除組
rm_group() {local group=$1local file=$2# 創建臨時文件local tmp_file=$(mktemp)# 使用 awk 處理文件,找到組名并添加新成員,其他行保持不變,輸出到臨時文件awk -v group="$group" '/Begin UserGroup/,/End UserGroup/ {# 在組名后的列表中刪除成員if ($1 == group) {next}}{ print }' "$file" > "$tmp_file"# 替換原文件mv "$tmp_file" "$file"chown "$ADMIN":"$ADMIN" "$file"if ! is_group_defined "$group" "$file"; thenreturn 0elsereturn 1fi
}# 檢查系統內組是否存在
group_exist() {local group=$1bugroup $group > /dev/null 2>>$LOG_FILEreturn $?
}# 檢查系統內組是否存在
group_missing() {local group=$1bugroup $group > /dev/null 2>>$LOG_FILEif [ $? -eq 0 ]; thenreturn 1elsereturn 0fi
}# 檢查系統內用戶是否存在于指定組
member_exist() {local group=$1local member=$2bugroup $group 2>>$LOG_FILE| grep -w $member >/dev/nullreturn $?
}# 檢查系統內用戶是否存在于指定組
member_missing() {local group=$1local member=$2bugroup $group 2>>$LOG_FILE| grep -w $member >/dev/nullif [ $? -eq 0 ]; thenreturn 1elsereturn 0fi
}# 激活配置文件中的變更
activate_change() {echo -e "y\nn\n" | badmin reconfig  >> $LOG_FILE 2>&1return $?
}run() {# 檢查 LSF 環境變量是否已加載if [ ! -f "$LSF_PROFILE" ]; thenlogger [ERRO] "LSF_PROFILE not found: $LSF_PROFILE"exit 1fi# 檢查用戶文件是否存在if [ ! -f "$GROUP_FILE" ]; thenlogger [ERROR] "User file not found: $GROUP_FILE"exit 1fi# 加載 LSF 環境變量. $LSF_PROFILEgroupfile="$GROUP_FILE"action="$1"group="$2"member="$3"logger [INFO] request: $@case "$action" in"checkmember")member_exist "$group" "$member"ret=$?[ $ret -eq 0 ] && logger [INFO] "Found $member in $group" || logger [WARN] "Not found $member in $group"exit $ret;;"addmember")# 檢查組名是否在指定范圍內if is_group_defined "$group" "$groupfile"; thenif is_member_in_group "$group" "$member" "$groupfile"; thenmember_exist "$group" "$member"if [ $? -eq 0 ]; thenlogger [INFO] $member already in group $groupexit 0elseactivate_change && sleep 5 && member_exist "$group" "$member"ret=$?[ $ret -eq 0 ] && logger [INFO] "Add $member into $group succeeded" || logger [WARN] "Add $member into $group failed"exit $retfielse# 組名存在,但成員不存在,添加新成員add_group_member "$group" "$member" "$groupfile" && activate_change && sleep 5 && member_exist "$group" "$member"ret=$?[ $ret -eq 0 ] && logger [INFO] "Add $member into $group succeeded" || logger [WARN] "Add $member into $group failed"exit $retfielse# 組名不存在,創建新組并添加新成員create_group "$group" "$member" "$groupfile" && activate_change && sleep 5 && member_exist "$group" "$member"ret=$?[ $ret -eq 0 ] && logger [INFO] "Add $member into $group succeeded" || logger [WARN] "Add $member into $group failed"exit $retfi;;"rmmember")# 檢查組名是否在指定范圍內if is_group_defined "$group" "$groupfile"; thenif is_member_in_group "$group" "$member" "$groupfile"; thenmember_exist "$group" "$member"if [ $? -eq 0 ]; thenrm_group_member  "$group" "$member" "$groupfile" && activate_change && sleep 5 && member_missing "$group" "$member"ret=$?[ $ret -eq 0 ] && logger [INFO] "Remove $member from $group succeeded" || logger [WARN] "Remove $member from $group failed"exit $retelse# 組名存在,但成員不存在logger [INFO] "$member is not in $group"exit 0fielse# 組名存在,但成員不存在logger [WARN] "Not found $group"exit 0fielse# 組名不存在logger [WARN] "Not found $group"exit 0fi;;"rmgroup")if is_group_defined "$group" "$groupfile"; thenrm_group "$group" "$groupfile" && activate_change && sleep 5 && group_missing "$group"ret=$?[ $ret -eq 0 ] && logger [INFO] "Remove $group succeeded" || logger [WARN] "Remove $group failed"exit $retelif group_exist "$group"; then# 文件中沒有組名,但系統中還有activate_change && sleep 5 && group_missing "$group"ret=$?[ $ret -eq 0 ] && logger [INFO] "Remove $group succeeded" || logger [WARN] "Remove $group failed"exit $retelselogger [WARN] "Not found $group"exit 0fi;;*)logger [WARN] "Invalid action: $action"exit 1;;esac
}##########################
#### Main Entry Start ####
########################### Please modify the LSF_PROFILE, GROUP_FILE, ADMIN accordingly
LSF_PROFILE="/openlava/etc/openlava.sh"
GROUP_FILE="/openlava/etc/lsb.users"
LOG_FILE="/openlava/log/lavaug.log"
ADMIN="lsfadmin"run $@

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66998.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66998.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66998.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LLMs的星辰大海:大語言模型的前世今生

文章目錄 一. LLM 的演進&#xff1a;從規則到智能的躍遷 &#x1f4ab;1.1 語言模型的蹣跚起步 &#x1f476;1.2 RNN 與 LSTM&#xff1a;序列建模的嘗試 &#x1f9d0;1.3 Transformer 的橫空出世&#xff1a;自注意力機制的革命 &#x1f4a5;1.4 LLM &#xff1a;從預測到…

7-Zip高危漏洞CVE-2025-0411:解析與修復

7-Zip高危漏洞CVE-2025-0411&#xff1a;解析與修復 免責聲明 本系列工具僅供安全專業人員進行已授權環境使用&#xff0c;此工具所提供的功能只為網絡安全人員對自己所負責的網站、服務器等&#xff08;包括但不限于&#xff09;進行檢測或維護參考&#xff0c;未經授權請勿利…

數據結構(精講)----樹(應用篇)

特性&#xff1a; 什么是樹&#xff1a; 樹(Tree)是(n>0)個節點的有限集合T&#xff0c;它滿足兩個條件&#xff1a; (1) 有且僅有一個特定的稱為根&#xff08;Root&#xff09;的節點。 (2) 其余的節點可以分為m&#xff08;m≥0&#xff09;個互不相交的有限集合T1、…

【動態規劃】--- 斐波那契數模型

Welcome to 9ilks Code World (??? ? ???) 個人主頁: 9ilk (??? ? ???) 文章專欄&#xff1a; 算法Journey &#x1f3e0; 第N個泰波那契數模型 &#x1f4cc; 題目解析 第N個泰波那契數 題目要求的是泰波那契數&#xff0c;并非斐波那契數。 &…

如何確保Spring單例Bean在高并發環境下的安全性?

在Spring中&#xff0c;單例Bean就像是一個“公共的水杯”&#xff0c;整個應用程序中的所有線程都會共享這一個實例。在大部分情況下&#xff0c;這沒什么問題&#xff0c;但如果多個線程同時想要修改這個“水杯”里的內容&#xff0c;就可能會出現問題了。 想象一下&#xff…

期刊審稿意見回復的LaTeX模板分享

下載網址 https://github.com/NeuroDong/Latex_for_review_comments 效果展示 分享內容 在學術寫作過程中&#xff0c;回復審稿意見是一個重要且繁瑣的環節。由于審稿人眾多&#xff0c;使用Word進行排版往往效率低下。為了提高效率&#xff0c;我在網上找到了一個LaTeX模板…

Vue 3 30天精進之旅:Day 03 - Vue實例

引言 在前兩天的學習中&#xff0c;我們成功搭建了Vue.js的開發環境&#xff0c;并創建了我們的第一個Vue項目。今天&#xff0c;我們將深入了解Vue的核心概念之一——Vue實例。通過學習Vue實例&#xff0c;你將理解Vue的基礎架構&#xff0c;掌握數據綁定、模板語法和指令的使…

在Vue中,<img> 標簽的 src 值

1. 直接指定 src 的值&#xff08;適用于網絡圖片&#xff09; 如果你使用的是網絡圖片&#xff08;即圖片的URL是完整的HTTP或HTTPS鏈接&#xff09;&#xff0c;可以直接指定 src 的值&#xff1a; vue 復制 <template><div><img src"https://exampl…

Spring Boot/MVC

一、Spring Boot的創建 1.Spring Boot簡化Spring程序的開發,使用注解和配置的方式開發 springboot內置了tomact服務器 tomact:web服務器,默認端口號8080,所以訪問程序使用8080 src/main/java:Java源代碼 src/main/resource:靜態資源或配置文件,存放前端代碼(js,css,html) s…

Spring--SpringMVC的調用流程

一.簡介 1.1主要作用 SSM框架構建起單的技術棧需求&#xff01;其中的SpringMVC負責表述層&#xff08;控制層&#xff09;實現簡化&#xff01; 最終總結&#xff1a; 1. 簡化前端參數接收( 形參列表 )2. 端數據響應(返回值)1.2核心組件和調用流程 Spring MVC與許多其他Web…

C#集合排序的三種方法(List<T>.Sort、LINQ 的 OrderBy、IComparable<T> 接口)

見過不少人、經過不少事、也吃過不少苦&#xff0c;感悟世事無常、人心多變&#xff0c;靠著回憶將往事串珠成鏈&#xff0c;聊聊感情、談談發展&#xff0c;我慢慢寫、你一點一點看...... 1、使用 List<T>.Sort 方法與自定義比較器 public class Person{public string …

從ChatGPT熱潮看智算崛起

2025年1月7日&#xff0c;科智咨詢發布《2025年IDC產業七大發展趨勢》&#xff0c;其中提到“ChatGPT開啟生成式AI熱潮&#xff0c;智能算力需求暴漲&#xff0c;算力供給結構發生轉變”。 【圖片來源于網絡&#xff0c;侵刪】 為何會以ChatGPT發布為節點呢&#xff1f;咱們一起…

Frida使用指南(三)- Frida-Native-Hook

1.Process、Module、Memory基礎 1.Process Process 對象代表當前被Hook的進程,能獲取進程的信息,枚舉模塊,枚舉范圍等 2.Module Module 對象代表一個加載到進程的模塊(例如,在 Windows 上的 DLL,或在 Linux/Android 上的 .so 文件), 能查詢模塊的信息,如模塊的基址、名…

Electron學習筆記,安裝環境(1)

1、支持win7的Electron 的版本是18&#xff0c;這里node.js用的是14版本&#xff08;node-v14.21.3-x86.msi&#xff09;云盤有安裝包 Electron 18.x (截至2023年仍在維護中): Chromium: 96 Node.js: 14.17.0 2、安裝node環境&#xff0c;node-v14.21.3-x86.msi雙擊運行選擇安…

漏洞修復:Apache Tomcat 安全漏洞(CVE-2024-50379) | Apache Tomcat 安全漏洞(CVE-2024-52318)

文章目錄 引言I Apache Tomcat 安全漏洞(CVE-2024-50379)漏洞描述修復建議升級Tomcat教程II Apache Tomcat 安全漏洞(CVE-2024-52318)漏洞描述修復建議III 安全警告引言 解決方案:升級到最新版Tomcat https://blog.csdn.net/z929118967/article/details/142934649 service in…

提示詞的藝術 ---- AI Prompt 進階(提示詞框架)

提示詞的藝術 ---- AI Prompt 進階&#xff08;提示詞框架&#xff09; 寫在前面 上周發布了一篇《提示詞的藝術----AI Prompt撰寫指南》&#xff0c;旨在幫助讀者理解提示詞的作用&#xff0c;以及簡單的提示詞撰寫指南。本篇作為進階內容&#xff0c;將給出常用的提示詞框架…

PyQt4 的圖片切割編輯器

一、 編輯器功能明確 允許用戶加載圖片、選擇切割模式、對切割后的圖片片段進行操作&#xff08;如移動、復制、粘貼、刪除等&#xff09;&#xff0c;并支持撤銷和重做操作。 環境&#xff1a;Py2.7 PyQt 4.11 二、導入模塊介紹 sys: 用于訪問與 Python 解釋器強相關的變…

[MySQL]數據庫表內容的增刪查改操作大全

目錄 一、增加表數據 1.全列插入與指定列插入 2.多行數據插入 3.更新與替換插入 二、查看表數據 1.全列查詢與指定列查詢 2.查詢表達式字段 3.為查詢結果起別名 4.結果去重 5.WHERE條件 6.結果排序 7.篩選分頁結果 8.插入查詢的結果 9.group by子句 三、修改表數…

在 Windows 11 中為 SMB 3.x 文件共享協議提供 RDMA 支持

注&#xff1a;機翻&#xff0c;未校。 Enable SMB Direct in Windows 11 在 Windows 11 中啟用 SMB Direct Provides RDMA support for the SMB 3.x file sharing protocol 為 SMB 3.x 文件共享協議提供 RDMA 支持 Vigneshwaran Vijayakumar November 3, 2024 Last Updat…

electron打包客戶端在rk3588上支持h265硬解

目錄 前言 chromium是如何支持h265硬解 electron/chromium第一次編譯 electron/chromium第二次編譯 前言 我們的客戶端程序是用electron打包的前端程序&#xff0c;其在rk3588主機上的linux環境運行。之前使用客戶端查看h264編碼的視頻直播是沒有問題的&#xff0c;但視頻源…