ユーザードットファイルがグループでないか、グローバルに書き込み可能であることを確認する必要があります。次のコマンドは、すべてのファイルを一覧表示します。
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>
シェルスクリプトを作成する必要があります。
答え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 ~/.*