result=$(grep -r "find this string" / | 2> /dev/null) #don't care about permission denied errors, so ditch them.
#regex=':(.+)' #matches after the filename (ie. ':String to match')
for line in $result
do
#need to preform regex on result
echo "line = $line..."
chown root:root $line
chmod 700 $line
done
我得到了一个命令,要求一个shell脚本,它将在整个Linux文件系统的所有文件中找到一个字符串(如/
中所示),然后将这些文件的权限更改为只能由root用户使用。
我能想到的唯一方法是使用grep和regex(正则表达式来拉出结果的:string
部分)但我无法弄清楚如何对bash变量执行正则表达式。< / p>
在Perl中它会像$line =~ s/$regex//g
(抱歉,我的Perl也有点生锈)。
也欢迎更简单的解决方案。我可能过于复杂了:))
答案 0 :(得分:1)
这是我放在一起的单行命令,它将“在整个Linux文件系统中的所有文件中找到一个字符串(如在/中),然后将这些文件的权限更改为仅可用(在本例中专门用于读取/写入root。“
find /. -type f -exec grep -rl 'textyouarelookingfor' {} \; -exec chmod 600 {} \; -exec chown root:root {} \; > /dev/null 2>&1
它找到文件并搜索指定的文本,然后将权限和所有者/组更改为root。
我不能说它的美丽或速度,但我知道它就像子目录中文件的魅力一样!我不建议在您的机器上运行它,例如搜索“'。通过改变对你不期望的事物的许可,它可能弄乱整个机器......
将单行放入shell脚本中即可完成。
答案 1 :(得分:0)
要让grep只返回文件名,可以使用
grep -rl 'find this string' /
我们可以将它直接反馈到循环中,而不是将其保存到变量中然后依靠单词拆分来循环它:
while IFS= read -r fname; do
chown root:root "$fname"
chmod 700 "$fname"
done < <(grep -rl 'find this string' /)
<(...)
构造称为process substitution。它基本上使得命令的输出行为类似于文件(确切地说是命名管道)。
请注意,您尝试的内容会返回匹配的行,并且对这些内容设置权限并没有多大意义。
此解决方案能够处理包含空格的文件名。要扩展它以便能够处理包含换行符的文件名,我们可以使用grep的-Z
选项,这样做:
输出零字节(ASCII NUL字符),而不是通常跟随文件名的字符。
循环更改如下:
while IFS= read -r -d $'\0' fname; do
echo chown root:root "$fname"
echo chmod 700 "$fname"
done < <(grep -rlZ 'find this string' /)
其中-d $'\0'
告诉read
输入用零字节而不是换行符分隔。