Bash脚本:在帐户删除过程中忽略unix帐户的删除

Bash脚本:在帐户删除过程中忽略unix帐户的删除,bash,awk,Bash,Awk,需要清除Linux机器上的用户帐户,很少有例外。为我做同样事情的脚本是 #UIDMAX will contain the minimum value used by OS for ID selection UIDMIN=`grep "UID_MIN" /etc/login.defs` #UIDMAX will contain the mixnimum value used by OS for ID selection UIDMAX=`grep "UID_MAX" /etc/login.defs

需要清除Linux机器上的用户帐户,很少有例外。为我做同样事情的脚本是

#UIDMAX will contain the minimum value used by OS for ID selection
UIDMIN=`grep "UID_MIN" /etc/login.defs`

#UIDMAX will contain the mixnimum value used by OS for ID selection
UIDMAX=`grep "UID_MAX" /etc/login.defs`

for i in  awk -F: -v "min=${UIDMIN##UID_MIN}" -v "max=${UIDMAX##UID_MAX}" '{ if ( $3 >= min && $3 <=max ) print $1}' /etc/passwd
do 
     userdel -r $i  
done
#UIDMAX将包含操作系统用于ID选择的最小值
UIDMIN=`grep“UID\u MIN”/etc/login.defs`
#UIDMAX将包含操作系统用于ID选择的mixnium值
UIDMAX=`grep“UID\u MAX”/etc/login.defs`
对于awk中的i-F:-v“min=${UIDMIN#UID#u min}”-v“max=${UIDMAX#UID#u max}”{如果($3>=min&$3为什么要使用awk

# using lower-case variable names is conventional for things which are neither builtins
# nor environment variables to avoid namespace conflicts.
min=$(grep "^UID_MIN" /etc/login.defs); min=${min##*[[:space:]]}
max=$(grep "^UID_MAX" /etc/login.defs); max=${max##*[[:space:]]}

# set up an associative array of users to ignore
declare -A users_to_ignore=( [test1]=1 [test2]=1 [test]=1 )

while IFS=: read -r name _ pid _ <&3; do
  # check not only for pid min and max, but also presence in users_to_ignore
  if (( pid >= min && pid < max )) && ! [[ ${users_to_ignore[$name]} ]]; then
    userdel -r "$name"
  fi
done 3</etc/passwd
……还有

[[ " $users_to_ignore " =~ " $name " ]]
为什么要使用awk

# using lower-case variable names is conventional for things which are neither builtins
# nor environment variables to avoid namespace conflicts.
min=$(grep "^UID_MIN" /etc/login.defs); min=${min##*[[:space:]]}
max=$(grep "^UID_MAX" /etc/login.defs); max=${max##*[[:space:]]}

# set up an associative array of users to ignore
declare -A users_to_ignore=( [test1]=1 [test2]=1 [test]=1 )

while IFS=: read -r name _ pid _ <&3; do
  # check not only for pid min and max, but also presence in users_to_ignore
  if (( pid >= min && pid < max )) && ! [[ ${users_to_ignore[$name]} ]]; then
    userdel -r "$name"
  fi
done 3</etc/passwd
……还有

[[ " $users_to_ignore " =~ " $name " ]]

保持简单,使用awk实现其擅长的功能(解析文本),使用shell实现其擅长的功能(对命令的调用排序):

awk-F:-v exceptions=“test1 test2 test”
开始{
拆分(例外情况,tmp,/)
对于(tmp中的i){
除[tmp[i]]
}
}
NR==FNR{
if(sub(/UIDMIN/,“”)min=$0
如果(sub(/UIDMAX/,“”))最大值=$0
下一个
}

$3>=min&&$3保持简单,并使用awk实现其擅长的功能(解析文本),使用shell实现其擅长的功能(对命令调用排序):

awk-F:-v exceptions=“test1 test2 test”
开始{
拆分(例外情况,tmp,/)
对于(tmp中的i){
除[tmp[i]]
}
}
NR==FNR{
if(sub(/UIDMIN/,“”)min=$0
如果(sub(/UIDMAX/,“”))最大值=$0
下一个
}


$3>=min&&$3
for
循环中的awk命令将不起作用。您需要使用命令替换运算符
$()
(或反勾号)for
循环中的awk命令将不起作用。您需要使用命令替换运算符
$()
(或反勾号)将
用户声明为\u ignore
作为一个简单字符串不是更容易吗?您可以使用
=~
操作符检查是否应该忽略
$name
。@hek2mgl,想想如果您有一个名称是另一个名称的子集,例如“hek2mgl”和“hek”,会发生什么情况,并且只想保留较短的命名用户。突然,您不得不担心匹配周围的空白以及名称本身(以及名字和姓氏的大小写),然后就更容易正确地使用数组了。你可以在正则表达式中使用单词边界。我看不出这有什么问题。@EdMorton,没错,但因为我在
[[]中的
=~
右侧的扩展名周围使用了双引号
,shell不会将其视为正则表达式,而是将其视为要匹配的文字子字符串。如果我正在编写,比如说,
[[$users\u to\u ignore=~”“$name”“]
(扩展名在引号之外),那么是的,这将是一个问题。@EdMorton,inside
[[]]
、全局搜索和字符串拆分都会被禁止。将
用户声明为“忽略”
作为简单字符串不是更容易吗?您可以使用
=~
操作符检查是否应忽略
$name
。@hek2mgl,想想如果您有一个名称是另一个名称的子集,例如“hek2mgl”,会发生什么情况和“hek”,并且只想保留较短的命名用户。突然,你不得不担心匹配周围的空白以及名称本身(以及名字和姓氏的角格),然后就更容易正确地使用数组了。你可以在正则表达式中使用单词边界。我看不出这有什么问题。@EdMorton,没错,但因为我在
[[]中的
=~
右侧的扩展名周围使用了双引号
,shell不会将其视为正则表达式,而是将其视为要匹配的文字子字符串。如果我正在编写,比如说,
[[$users\u to\u ignore=~”“$name”“]
(扩展名在引号之外),那么是的,这将是一个问题。@EdMorton,inside
[[]]
,全局绑定和字符串拆分将被禁止。您在哪里检查要忽略的黑名单?问题文本部分的OP询问如何扩展其代码,即使UID在相关范围内也不会删除特定命名的用户。这比ISAM中的纯bash方法更有效例如,它只需一次通过文件就可以提取UIDMIN和UIDMAX,不需要单独的子shell(这可以在本机bash中完成,但需要大量代码)。还有其他优点吗?它是可移植的,可以与任何awk和shell AFAIK一起使用(当然,旧的、坏的、awk除外)。它也很容易维护/扩展。我完全同意,在处理大数据流时,awk的效率通常是一个杀手级功能—几个shell(ksh93,zsh)也许在性能开销方面可以接近,但bash甚至不在同一个级别。这是一个很好的讨论;小心。你在哪里检查要忽略的黑名单?OP——在问题的文本部分——是问如何扩展他们的代码,以不删除特定命名的用户,即使其中包含UID相关范围。这比纯bash方法更有效,因为它只需通过文件一次提取UIDMIN和UIDMAX,不需要单独的子shell(可以在本机bash中完成,但需要大量代码)。还有其他优点吗?它是可移植的,可以与任何awk和shell AFAIK一起使用(当然,除了旧的、坏的、awk之外)。它也很容易维护/扩展。我完全同意,在处理大数据流时,awk的效率通常是一个杀手级功能——几个shell(ksh93,zsh)也许在性能开销方面可以接近,但是bash甚至不在同一个联盟中。这是一个很好的讨论;小心。