简体   繁体   English

在bash脚本中以变量作为参数sed

[英]sed with variable as argument in bash script

I am trying to write a bash script to scan for authorized_keys files and remove the keys of a couple previous employees if found. 我正在尝试编写一个bash脚本来扫描authorized_keys文件,并删除前几个雇员的密钥(如果找到)。 I am having one heck of a time figuring out the escaping for the sed command at the end. 我花了一点时间找出最后sed命令的转义。 I am using commas instead of / since / can show up in the ssh-key. 我使用逗号而不是/,因为/可以显示在ssh键中。 Any help would be appreciated 任何帮助,将不胜感激

#!/bin/bash

declare -A keys
keys["employee1"]='AAAAB3NzaC1yc2EAAAABJQAAAIEAxoZ7ZdpJkL98n8cSTkFBwaAeSNK0m/tOWtF1mu5NAzMM/+1SDO6rJH/ruyyqBJo9s+AHWZLGRHfXT2XBg2SRaUnubAKp0w6qNIbej0MsA/ifAs8AfVGdj0pUPLtKpo6XVZkB8vEZSIQ+xNk1n5HJrGJnFGWKWeY3z1/KOLxcLHU='
keys["employee2"]='AAAAB3NzaC1yc2EAAAABIwAAAQEAwHYNAVhb319OBVXPhYF8cSTkFBwaAekr7UcKjfLPCHMpz19W0L/C0g+75Hn8COxOQILDUhIPhYHXOduQjGD/6NXgJDWxgyT00Azg5BREUnBd58WqZPlEvTZYlAgmdMIbnWPPGdJwzqKH/k7/STK6vTKxL6rxBo4lSNK0m/tOWtF1mu5NAzMM/+1SDO6rJH/ruyyqBJo9s+NIbej0MsA/ifAs8AfAkfO2JjgeQpJMyZ7B02XVN5iSLAyC3Cb5FXIjJuk4LPhcApuVyszH2lgve0r5bt/nFgVujJTvJTHPlGrqkYDcDJVUtfbjoLqGPrnpijp6rGIC7aFDDe7bk0ygHYMXDFWcjJBerfLGUWTYWFFLY3bfiO/h/9oEycmQHyB2co4a0IyyDnaYn9OY6xsRRATVlk4Q=='

files=`find / -name authorized_keys`

echo "Checking Authorized_Keys files on: " `hostname`
echo ""
echo "Located files: "

for file in $files; do
  echo "  $file"
done

echo""

for file in $files; do
  for key in "${!keys[@]}"; do
    if grep -q ${keys[$key]} $file; then
      echo "  *** Removing $key from $file"
      sed "s,${keys[$key]},d" $file
    fi
  done
done

You've made it a bit complicated I think. 我认为您已经使它变得有些复杂。

You can do this using grep -vf and process substitution : 您可以使用grep -vf进程替换来做到这一点:

# array to hold the value you want to remove
keys=(
'AAAAB3NzaC1yc2EAAAABJQAAAIEAxoZ7ZdpJkL98n8cSTkFBwaAeSNK0m/tOWtF1mu5NAzMM/+1SDO6rJH/ruyyqBJo9s+AHWZLGRHfXT2XBg2SRaUnubAKp0w6qNIbej0MsA/ifAs8AfVGdj0pUPLtKpo6XVZkB8vEZSIQ+xNk1n5HJrGJnFGWKWeY3z1/KOLxcLHU=',
'AAAAB3NzaC1yc2EAAAABIwAAAQEAwHYNAVhb319OBVXPhYF8cSTkFBwaAekr7UcKjfLPCHMpz19W0L/C0g+75Hn8COxOQILDUhIPhYHXOduQjGD/6NXgJDWxgyT00Azg5BREUnBd58WqZPlEvTZYlAgmdMIbnWPPGdJwzqKH/k7/STK6vTKxL6rxBo4lSNK0m/tOWtF1mu5NAzMM/+1SDO6rJH/ruyyqBJo9s+NIbej0MsA/ifAs8AfAkfO2JjgeQpJMyZ7B02XVN5iSLAyC3Cb5FXIjJuk4LPhcApuVyszH2lgve0r5bt/nFgVujJTvJTHPlGrqkYDcDJVUtfbjoLqGPrnpijp6rGIC7aFDDe7bk0ygHYMXDFWcjJBerfLGUWTYWFFLY3bfiO/h/9oEycmQHyB2co4a0IyyDnaYn9OY6xsRRATVlk4Q=='
)

while IFS= read -d '' -r file; do
    grep -vf <(printf "%s\n" "${keys[@]}") "$file" > "$file.tmp"
    mv "$file.tmp" "$file"
done < <(find / -name authorized_keys -print0)

In your case, it's easy, just need to use a sign which not contained in base64 code as the delimiter, eg | 就您而言,这很容易,只需要使用base64代码中未包含的符号作为分隔符即可,例如| :

sed "\|${keys[$key]}|d" $file

Explanation in the sed manual : sed 手册中的说明:

\\%regexp% \\%regexp%

(The % may be replaced by any other single character.) (%可以用任何其他单个字符代替。)

This also matches the regular expression regexp, but allows one to use a different delimiter than /. 这也与正则表达式regexp匹配,但是允许使用与/不同的分隔符。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM