如何从文件中读取字符串并与第二个文件的每一行进行比较

近江企鹅

我正在制作将包含“硬化”部分的OS安装后脚本。并且在此强化部分中,它将从文件A中读取内核参数,并与文件/etc/sysctl.conf进行比较,如果sysctl.conf中没有可用的参数,则将其添加到sysctl.conf中。

自定义文件中的参数

################## Hardening ############################

kernel.exec-shield = 1
kernel.randomize_va_space = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.log_martians = 1
net.ipv4.tcp_timestamps = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

##########################################################

现在,我添加了这些行以进行硬化。

for i in $(cat /etc/sysctl.conf)
do
        if ! grep -Fxq " $i " /etc/sysctl.conf
        then
        echo -e "$i" > ~/testfile
        fi
done

这个脚本的问题是该脚本将内核参数中的每个空格都视为一个空格行,并且该问题从“对于$(cat /etc/sysctl.conf)中的i”开头就开始了。

这是调试信息

./LinuxHardening.sh
++ date
+ LOGDATE='Mon Feb  9 07:58:07 EST 2015'
+ echo Mon Feb 9 07:58:07 EST 2015
+ tee HardeningLog
Mon Feb 9 07:58:07 EST 2015
+ echo -e '\n############ Kernel Hardening ############'
+ tee -a HardeningLog

############ Kernel Hardening ############
++ cat kernelparms
+ for i in '$(cat kernelparms)'
+ grep -Fxq '##################' /etc/sysctl.conf
+ echo -e '##################'
+ for i in '$(cat kernelparms)'
+ grep -Fxq Hardening /etc/sysctl.conf
+ echo -e Hardening
+ for i in '$(cat kernelparms)'
+ grep -Fxq '############################' /etc/sysctl.conf
+ echo -e '############################'
+ for i in '$(cat kernelparms)'
+ grep -Fxq kernel.exec-shield /etc/sysctl.conf
+ echo -e kernel.exec-shield
+ for i in '$(cat kernelparms)'
+ grep -Fxq = /etc/sysctl.conf
+ echo -e =
+ for i in '$(cat kernelparms)'
+ grep -Fxq 1 /etc/sysctl.conf
+ echo -e 1
+ for i in '$(cat kernelparms)'
+ grep -Fxq kernel.randomize_va_space /etc/sysctl.conf
+ echo -e kernel.randomize_va_space
+ for i in '$(cat kernelparms)'
+ grep -Fxq = /etc/sysctl.conf
+ echo -e =
+ for i in '$(cat kernelparms)'
+ grep -Fxq 1 /etc/sysctl.conf
+ echo -e 1
+ for i in '$(cat kernelparms)'
+ grep -Fxq net.ipv4.icmp_echo_ignore_broadcasts /etc/sysctl.conf
+ echo -e net.ipv4.icmp_echo_ignore_broadcasts
+ for i in '$(cat kernelparms)'
+ grep -Fxq = /etc/sysctl.conf
+ echo -e =
+ for i in '$(cat kernelparms)'
+ grep -Fxq 1 /etc/sysctl.conf
+ echo -e 1
+ for i in '$(cat kernelparms)'
+ grep -Fxq net.ipv4.icmp_ignore_bogus_error_responses /etc/sysctl.conf
+ echo -e net.ipv4.icmp_ignore_bogus_error_responses
+ for i in '$(cat kernelparms)'
+ grep -Fxq = /etc/sysctl.conf
+ echo -e =
+ for i in '$(cat kernelparms)'
+ grep -Fxq 1 /etc/sysctl.conf
+ echo -e 1
+ for i in '$(cat kernelparms)'
+ grep -Fxq net.ipv4.tcp_syncookies /etc/sysctl.conf
+ echo -e net.ipv4.tcp_syncookies
+ for i in '$(cat kernelparms)'
+ grep -Fxq = /etc/sysctl.conf
+ echo -e =
+ for i in '$(cat kernelparms)'
+ grep -Fxq 1 /etc/sysctl.conf
+ echo -e 1
+ for i in '$(cat kernelparms)'
+ grep -Fxq net.ipv4.conf.all.log_martians /etc/sysctl.conf
+ echo -e net.ipv4.conf.all.log_martians
+ for i in '$(cat kernelparms)'
+ grep -Fxq = /etc/sysctl.conf
+ echo -e =
+ for i in '$(cat kernelparms)'
+ grep -Fxq 1 /etc/sysctl.conf
+ echo -e 1
+ for i in '$(cat kernelparms)'
+ grep -Fxq net.ipv4.conf.all.accept_redirects /etc/sysctl.conf
+ echo -e net.ipv4.conf.all.accept_redirects
+ for i in '$(cat kernelparms)'
+ grep -Fxq = /etc/sysctl.conf
+ echo -e =
+ for i in '$(cat kernelparms)'
+ grep -Fxq 0 /etc/sysctl.conf
+ echo -e 0
+ for i in '$(cat kernelparms)'
+ grep -Fxq net.ipv4.conf.all.rp_filter /etc/sysctl.conf
+ echo -e net.ipv4.conf.all.rp_filter
+ for i in '$(cat kernelparms)'
+ grep -Fxq = /etc/sysctl.conf
+ echo -e =
+ for i in '$(cat kernelparms)'
+ grep -Fxq 1 /etc/sysctl.conf
+ echo -e 1
+ for i in '$(cat kernelparms)'
+ grep -Fxq net.ipv4.conf.all.send_redirects /etc/sysctl.conf
+ echo -e net.ipv4.conf.all.send_redirects
+ for i in '$(cat kernelparms)'
+ grep -Fxq = /etc/sysctl.conf
+ echo -e =
+ for i in '$(cat kernelparms)'
+ grep -Fxq 0 /etc/sysctl.conf
+ echo -e 0
+ for i in '$(cat kernelparms)'
+ grep -Fxq net.ipv4.conf.default.accept_redirects /etc/sysctl.conf
+ echo -e net.ipv4.conf.default.accept_redirects
+ for i in '$(cat kernelparms)'
+ grep -Fxq = /etc/sysctl.conf
+ echo -e =
+ for i in '$(cat kernelparms)'
+ grep -Fxq 0 /etc/sysctl.conf
+ echo -e 0
+ for i in '$(cat kernelparms)'
+ grep -Fxq net.ipv4.conf.default.log_martians /etc/sysctl.conf
+ echo -e net.ipv4.conf.default.log_martians
+ for i in '$(cat kernelparms)'
+ grep -Fxq = /etc/sysctl.conf
+ echo -e =
+ for i in '$(cat kernelparms)'
+ grep -Fxq 1 /etc/sysctl.conf
+ echo -e 1
+ for i in '$(cat kernelparms)'
+ grep -Fxq net.ipv4.tcp_timestamps /etc/sysctl.conf
+ echo -e net.ipv4.tcp_timestamps
+ for i in '$(cat kernelparms)'
+ grep -Fxq = /etc/sysctl.conf
+ echo -e =
+ for i in '$(cat kernelparms)'
+ grep -Fxq 0 /etc/sysctl.conf
+ echo -e 0
+ for i in '$(cat kernelparms)'
+ grep -Fxq net.ipv6.conf.all.accept_redirects /etc/sysctl.conf
+ echo -e net.ipv6.conf.all.accept_redirects
+ for i in '$(cat kernelparms)'
+ grep -Fxq = /etc/sysctl.conf
+ echo -e =
+ for i in '$(cat kernelparms)'
+ grep -Fxq 0 /etc/sysctl.conf
+ echo -e 0
+ for i in '$(cat kernelparms)'
+ grep -Fxq net.ipv6.conf.default.accept_redirects /etc/sysctl.conf
+ echo -e net.ipv6.conf.default.accept_redirects
+ for i in '$(cat kernelparms)'
+ grep -Fxq = /etc/sysctl.conf
+ echo -e =
+ for i in '$(cat kernelparms)'
+ grep -Fxq 0 /etc/sysctl.conf
+ echo -e 0
+ for i in '$(cat kernelparms)'
+ grep -Fxq '##########################################################' /etc/sysctl.conf
+ echo -e '##########################################################'
蓝雾

为什么不使用while逐行阅读:

while read -r line
do
        if ! grep -Fxq " $line " /etc/sysctl.conf
        then
        echo -e "$line" >> ~/testfile
        fi
done </etc/sysctl.conf

并将>替换为>>。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将第一个文件中的每一行与第二个文件中的所有行进行比较?

将文件的每一行与第二个文件中的数千行进行比较时提高速度

如何遍历文件的每一行并将该文件的每一行与第二个文件的所有行进行匹配?

熊猫:从每一行获取字符串的第二个字符

替换文件每一行中单词的第二个实例

在将第一行与第二个 DF 中的多行进行比较后,将 DF 中的每一行映射到另一个 DF 中的一行的最佳方法是什么?

使用Bash替换ASCII文件中一行的第二个字符串实例

搜索文件中具有匹配模式的行,但将同一行中与第二个模式匹配的字符串替换

如果第一个文件的行与Linux中第二个文件中存在的字符串匹配,如何删除该行?

Mips:如何获取字符串中的第二个字符

在第二个命令中将文件的每一行传递给特定变量

如果它们恰好匹配第二个文件中的字符串,如何从一个文件中删除字符串?

如何将文件每一行的第二个单词保存为char?

如何根据第二个文件中的相应值在一个文件中打印一行?

用第二个文件中的文本替换文件中的字符串

在shell脚本中查找并将一个文件中包含的行字符串替换为第二个文件

在Java中将第一个文件的一个字符串与第二个文件的所有字符串进行比较

读取文件的第一行并将其与外壳文件中的字符串进行比较

如何使用AWK循环浏览第一个文件并在第一个文件中的每一行旁边打印第二个文件中的所有行?

从文件的每一行提取字符串

从文本文件中提取一行中的第二个单词

提取bat文件中的倒数第二个子字符串

提取文本文件中第一个和第二个重复字符串之间的特定行

将第二行的第二个字段附加到文件中的第一行

在第二个文件的每一行前面打印一个文件的第一行

从文件中读取行,在第二个文件中grep,并为每个$ line输出一个文件

如何在第二个“-”之前抓取字符串?

PHP如何获取字符串中出现的第二个数字

使用Javascript + Regex获取字符串中的第二个数字?