用户管理脚本之删除用户——Delete_user.sh

本文介绍了一个用Shell脚本实现的用户删除流程。脚本通过交互式提问确认要删除的用户名,并验证用户是否存在。接着检查并处理用户所属进程,生成文件报告,并最终删除用户账号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   该脚本非原创,仅发出来做学习参考交流。

   一个删除用户的脚本,思路清晰,构思慎密,考虑方方面面,是学习shell脚本方面的好例子。

  1  #!/bin/bash
  2
  3  function get_answer {
  4  unset ANSWER
  5  ASK_COUNT=0
  6  while [ -z "$ANSWER" ]
  7  do
  8      ASK_COUNT=$[ $ASK_COUNT + 1 ]
  9      case $ASK_COUNT in
 10      2)
 11        echo
 12        echo "Please answer the question."
 13        echo
 14      ;;
 15      3)
 16        echo
 17        echo "One last try ... please answer the question."
 18        echo
 19      ;;
 20      4)
 21        echo
 22        echo "Since you refuse to answer the question..."
 23        echo "exiting program."
 24        echo
 25        #
 26        exit
 27      ;;
 28      esac
 29
 30      echo
 31     
 32      if [ -n "$LINE2" ]
 33      then
 34        echo $LINE1
 35        echo -e $LINE2" \c"
 36      else
 37        echo -e $LINE1" \c"
 38      fi
 39
 40      read -t 60 ANSWER
 41  done
 42  unset LINE1
 43  unset LINE2
 44  }
 45
 46  function process_answer {
 47  case $ANSWER in
 48  y|Y|yes|Yes|yEs|yeS|YEs|YES)
 49  ;;
 50  *)
 51     echo
 52     echo $EXIT_LINE1
 53     echo #EXIT_LINE2
 54     echo
 55     exit
 56  ;;
 57  esac
 58  unset EXIT_LINE1
 59  unset EXIT_LINE2
 60  }
 61
 62
 63  echo "Step #1 - Determine User Account name to Delete "
 64  echo
 65  LINE1="Please enter the username of the user"
 66  LINE2="account you wish to delete from system:"
 67  get_answer
 68  USER_ACCOUNT=$ANSWER
 69
 70  LINE1="IS $USER_ACCOUNT the user account"
 71  LINE2="you wish to delete from the system?[y|n]"
 72  get_answer
 73
 74  EXIT_LINE1="Because the account,$USER_ACCOUNT,is not"
 75  EXIT_LINE2="the one you wish to delete,we are leaving the script..."
 76  process_answer
 77
 78  USER_ACCOUNT_RECORD=$(cat /etc/passwd | grep -w $USER_ACCOUNT)
 79  if [ $? -eq 1 ]
 80  then
 81     echo
 82     echo "Account,$USER_ACCOUNT,not found."
 83     echo "Leaving the script..."
 84     echo
 85     exit
 86  fi
 87
 88  echo
 89  echo "I found this record:"
 90  echo $USER_ACCOUNT_RECORD
 91  echo
 92
 93  LINE1="Is this the correct User Account? [y|n]"
 94  get_answer
 95
 96  EXIT_LINE1="Because the account,$USER_ACCOUNT,is not"
 97  EXIT_LINE2="the one you wish to delete,we are leaving the script..."
 98  process_answer
 99
100  echo
101  echo "Step #2 - Find process on system belonging to user Account"
102  echo
103  echo "$USER_ACCOUNT has the following processes running:"
104  echo
105
106  ps -u $USER_ACCOUNT
107
108  case $? in
109  1)
110     echo "There are no processes for this account currently running."
111     echo
112  ;;
113  0)
114     unset ANSWER
115     LINE1="Would you like me to kill the process(es)?[y|n]"
116     get_answer
117
118     case $ANSWER in
119     y|Y|yes|Yes|yEs|yeS|YEs|YES)
120     echo
121     trap "rm $USER_ACCOUNT_Running_Process.rpt" SIGTERM SIGINT SIGQUIT
122     ps -u $USER_ACCOUNT > $USER_ACCOUNT_Running_Process.rpt
123     exec < $USER_ACCOUNT_Running_Process.rpt
124     read USER_PROCESS_REC
125     read USER_PROCESS_REC
126     while [ $? -eq 0 ]
127        do
128        USER_PID=$(echo $USER_PROCESS_REC | cut -d " " -f1)
129        kill -9 $USER_PID
130        echo "Killed process $USER_PID"
131        read USER_PROCESS_REC
132        done
133
134        echo
135        rm $USER_ACCOUNT_Running_Process.rpt
136     ;;
137     *)
138        echo
139        echo "Will not kill the process(es)"
140        echo
141     ;;
142     esac
143  ;;
144  esac
145
146
147  echo
148  echo "Step #3 - Find files on system belonging to user account"
149  echo
150  echo "Creating a report of all files owned by $USER_ACCOUNT."
151  echo
152  echo "It is recommended that you backup/archive these files."
153  echo "and then do one of two things:"
154  echo "   1) Delete the files"
155  echo "   2) Change the files' ownership to a current user account."
156  echo
157  echo "Please wait. This may take a while..."
158
159
160  REPORT_DATE=`date +%y%m%d`
161  REPORT_FILE=$USER_ACCOUNT"_Files_"$REPORT_DATE.rpt
162
163  find / -user $USER_ACCOUNT > $REPORT_FILE 2> /dev/null
164
165  echo
166  echo "Report is complete."
167  echo "Name of report:      $REPORT_FILE"
168  echo "Location of report:      `pwd`"
169  echo
170
171  echo
172  echo "Step #4 - Remove user account"
173  echo
174
175  LINE1="Do you wish to remove $User_Account's account from system?[y|n]"
176  get_answer
177
178
179  EXIT_LINE1="Since you do not wish to remove the user account."
180  EXIT_LINE2="$USER_ACCOUNT at this time.exiting the script..."
181  process_answer
182
183  userdel $USER_ACCOUNT
184  echo
185  echo "User account,$USER_ACCOUNT,has been removed."
186  echo


#!/bin/bash dayid=${1:-$(date +%Y-%m-%d)} echo $dayid PROJECT_ID=833 source /data/nfs/scripts/${PROJECT_ID}/hhweb_config.sh echo ${hhweb_db_user} ${hhweb_db_host} ${hhweb_db_port} ${hhweb_db_name} mysql -u${hhweb_db_user} -h${hhweb_db_host} -p${hhweb_db_pass} -P${hhweb_db_port} -D${hhweb_db_name} -v -e" CREATE TABLE IF NOT EXISTS bvreport.hhweb_yqy_user_orders_d ( province_name CHAR COMMENT '省份名称', new_order_users INT COMMENT '新增订购用户数', vip_name CHAR COMMENT '会员类型', dayid CHAR ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; DELETE FROM bvreport.hhweb_yqy_user_orders_d WHERE dayid = '${dayid}'; " hive -hiveconf dayid="${dayid}" -e " DROP TABLE IF EXISTS mgwh_rd_temp.product_vip_info_${dayid}; CREATE TABLE mgwh_rd_temp.product_vip_info_${dayid} AS SELECT product_id, vip_name FROM ( SELECT a.product_id, '体育会员' AS vip_name FROM mgwh_rd_video.dwd_dim_product_1d_full_daily a JOIN ( SELECT sub_busi_id FROM mgwh_rd_video.dwd_dim_sub_business_1d_full_daily WHERE dt = '${dayid}' AND business_name = '体育赛场' ) b ON a.sub_busi_id = b.sub_busi_id WHERE a.dt = '${dayid}' GROUP BY a.product_id UNION SELECT a.product_id, '钻石会员' AS vip_name FROM mgwh_rd_video.dwd_dim_product_1d_full_daily a JOIN ( SELECT sub_busi_id FROM mgwh_rd_video.dwd_dim_sub_business_1d_full_daily WHERE dt = '${dayid}' AND (business_id = 'BB000105301' OR sub_busi_id IN ('SB000110313', 'SB000110411', 'SB000110412')) ) b ON a.sub_busi_id = b.sub_busi_id WHERE a.dt = '${dayid}' GROUP BY a.product_id ) subquery; " hive -hiveconf dayid="${dayid}" -e " INSERT INTO bvreport.hhweb_yqy_user_orders_d (province_name, new_order_users, vip_name, dayid) SELECT a.province_name, COUNT(DISTINCT a.msisdn) as new_order_users, b.vip_name, '${dayid}' AS dayid FROM mgwh_rd_dwm.dwm_video_order_d a INNER JOIN mgwh_rd_temp.product_vip_info_${dayid} b ON a.product_id = b.product_id INNER JOIN defa
03-25
这是我之前做过的一个项目,把这个设计结构有用的也加入到之前的项目中,做一个最全的:后端项目结构深度解析:testrealend 项目 一、项目根目录核心文件 plaintext testrealend/ ├── app.py # Flask应用主入口 │ api # 职责:创建应用实例、配置扩展、注册API路由 ├── requirements.txt # 依赖包清单(pip install -r 安装) ├── add_user_script.py # 管理员账户初始化脚本 ├── update_user_script.py # 用户信息更新脚本 ├── temp_qrcode.png # 临时二维码图片(水印功能相关) ├── embed/ # 水印嵌入后ZIP文件存储目录 │ # 文件名格式:员工ID_时间戳_嵌入结果.zip ├── compare/ # 水印比对文件目录(原始/提取水印对比) ├── static/ # 静态资源目录(CSS/JS/图片,当前项目未直接使用) └── templates/ # HTML模板目录(后端渲染页面时使用,当前项目为空) 二、核心功能模块解析 (1)API 接口层:resource/ plaintext src/resource/ ├── common_resource.py # 通用接口:注册(Register)、登录(Login)、登出(Logout) ├── adm_resource.py # 管理员接口:员工管理、水印操作 ├── emp_resource.py # 员工接口:数据申请、下载、查看 ├── shp_data_resource.py # SHP数据接口:列表查询、ID检索(重点修改模块) ├── application_resource.py # 数据申请接口:提交/审批流程 ├── nav_resource.py # 导航菜单接口:权限动态渲染 ├── generate_watermark.py # 水印生成接口:二维码/文本转水印 ├── embed_watermark.py # 水印嵌入接口:SHP文件处理 ├── download_file_resource.py # 文件下载接口:权限控制 ├── receive_zip_to_extract.py # ZIP上传接口:解压与验证 └── __init__.py # 包初始化文件 核心逻辑: • 每个.py文件对应一类业务场景,通过Flask-RESTful的Resource类定义 HTTP 接口(GET/POST/PUT/DELETE) • 接口路径通过api.add_resource(ResourceClass, '/api/path')在app.py中注册 (2)业务逻辑层:server/ plaintext src/server/ ├── shp_data_server.py # SHP数据业务逻辑:数据库查询、文件处理 ├── adm_server.py # 管理员业务逻辑:账户管理、权限校验 ├── emp_server.py # 员工业务逻辑:数据权限控制 ├── common_server.py # 通用业务逻辑:用户认证、 token管理 ├── application_server.py # 数据申请业务逻辑:流程状态管理(注意:拼写应为application) └── __init__.py # 包初始化文件 设计模式: • 资源类(Resource)接收请求后,调用对应服务类(Server)的方法执行具体逻辑 • 实现接口层与业务层解耦,便于单元测试和逻辑复用 (3)数据模型层:model/ plaintext src/model/ ├── Shp_Data.py # SHP文件模型:存储文件元信息(路径/属性/状态) ├── Adm_Account.py # 管理员账户模型:用户名/密码哈希/权限等级 ├── Employee_Info.py # 员工信息模型:基本资料/部门/角色 ├── Application.py # 数据申请模型:申请记录/审批状态/时间戳 └── __init__.py # 包初始化文件 技术细节: • 使用SQLAlchemy ORM映射数据库表,支持db.Model继承 • 字段定义包含String/Integer/DateTime等类型,部分字段设置unique/index索引 (4)算法模块:algorithm/ plaintext src/algorithm/ ├── NC.py # 归一化相关系数算法(水印相似度计算) ├── embed.py # 水印嵌入算法:SHP文件空间域修改 ├── extract.py # 水印提取算法:信号检测与解码 ├── get_coor.py # 坐标提取工具:从SHP获取几何坐标 ├── is_multiple.py # 倍数判断工具:坐标精度处理 ├── to_geodataframe.py # 地理数据转换:SHP转GeoDataFrame ├── embed/ # 水印嵌入测试数据目录 └── __init__.py # 包初始化文件 (5)扩展与工具:extension/ & utils/ • extension/ plaintext src/extension/ ├── extension.py # 扩展初始化:db(SQLAlchemy)/limiter(请求限流) └── __init__.py • utils/ plaintext src/utils/ ├── required.py # 请求参数校验:必填字段检查 └── __init__.py (6)通用工具:common/ plaintext src/common/ ├── api_tools.py # API辅助函数:响应格式化/错误处理 ├── constants.py # 项目常量:状态码/路径前缀/权限标识 └── __init__.py 三、数据库与配置模块 (1)数据库迁移:migrations/ plaintext src/migrations/ ├── alembic.ini # Alembic配置文件 ├── env.py # 数据库连接配置(生产/开发环境区分) ├── script.py.mako # 迁移脚本模板 └── versions/ # 具体迁移脚本目录(每个版本一个.py文件) 使用场景: • 模型变更时通过flask db migrate生成脚本,flask db upgrade更新数据库 (2)IDE 配置与缓存:.idea/ & pycache/ • .idea/:PyCharm 项目配置(勿手动修改,已加入.gitignore) • __pycache__/:Python 字节码缓存(自动生成,提升模块加载速度)
最新发布
07-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值