检查用户点文件是否不可组或全局写入

检查用户点文件是否不可组或全局写入

我需要检查用户点文件是否不可组或全局写入:以下命令将列出所有文件:

find /home/ -name "\.*" -perm /g+w,o+w

输出:

/home/system/.java
/home/ldap/.java

我的问题是,如何通过 SSH 连接到计算机(多个虚拟机),然后使用上述命令找到这些文件并使用以下命令进行更正:

chmod go-w /home/<\USER><\FILE>
chmod go-w /home/<\USER>/<\DIRECTORY>

我需要写一个shell脚本。

答案1

您可以使用 for 循环对 find 命令返回的所有文件/文件夹运行 chmod。

for i in `find /home/ -name ".*" -perm /g+w,o+w`; do chmod go-w $i; done

这将在使用 find 命令找到的所有文件/文件夹上运行 chmod go-w 。

这就是 bash 脚本的样子。

#!/bin/bash
for i in `find /home/ -name ".*" -perm /g+w,o+w`; do chmod go-w $i; done

编辑:

正如 Drav Sloan 在问题评论中所建议的那样,仅附加-exec chmod g-w,o-w "{}" \;到 find 的末尾比 for 循环更有效。

所以你可以使用

find /home/ -name ".*" -perm /g+w,o+w -exec chmod g-w,o-w "{}" \;

或者作为 bash 脚本:

#!/bin/bash
find /home/ -name ".*" -perm /g+w,o+w -exec chmod g-w,o-w "{}" \;

如果将其保存为 script.sh,则可以使用以下命令运行它:

bash script.sh

如果你想远程运行 for 循环,如果你将 script.sh 放在所有机器上,类似这样的事情应该可以工作:

ssh machine "bash script.sh"

或者如果它只是本地的

ssh machine 'bash -s' < script.sh

如果要在多个服务器上运行脚本,可以将 ssh 放入 for 循环中,或使用 pssh 实用程序。

如果将所有服务器放入 serverlist 文件中,则可以使用 pssh 在所有这些服务器上运行本地脚本:

pssh -h serverlist -i -I < script.sh

或使用 for 循环和 ssh:

for i in `cat serverslist`; do ssh $i 'bash -s' < script.sh; done

答案2

如果您只想强制文件不可写,那么以下还不够吗?

$ chmod g-w,o-w ~/.*

相关内容