我需要检查用户点文件是否不可组或全局写入:以下命令将列出所有文件:
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 ~/.*