/ homeディレクトリの所有権を変更するコマンドを実行したいと思います。例
例:
[root@remoteServer]# ls -l /home
drwxr-xr-x. 17 root root 4096 Sep 9 2014 user1
drwxr-xr-x. 17 root root 4096 Sep 9 2014 user2
drwxr-xr-x. 17 root root 4096 Sep 9 2014 user3
[root@remoteServer]#
[root@remoteServer]#id user1
uid=1101(user1) gid=1200(groupO)
[root@remoteServer]#id user2
uid=1102(user2) gid=1200(groupO)
[root@remoteServer]#id user2
uid=1103(user3) gid=1200(groupO)
このディレクトリの所有権を次のように変更します。
[root@remoteServer]# ls -l /home
drwxr-xr-x. 17 user1 groupO 4096 Sep 9 2014 user1
drwxr-xr-x. 17 user2 groupO 4096 Sep 9 2014 user2
drwxr-xr-x. 17 user3 groupO 4096 Sep 9 2014 user3
このためにlocalServerのスクリプトを使用します。スクリプトは次のようになります。
#!/bin/bash
for ip in $(cat ipListFile)
do
ssh -o ConnectTimeout=2 -o StrictHostKeyChecking=no -o PasswordAuthentication=no $ip "for i in /home/*; do chown $(echo $i | awk -F"home/" '{ print $2 }'):groupO $i; done;"
done
forループに問題があります。このループはremoteServerローカルで機能しています。しかし、localServerでこのコマンドをremoteServerのリモートスクリプトとして使用することはできません。 localServerでこのコマンドを試してみると、「$ i」変数の値は「17123891」のようにばかげています。
ネイサンの答えを変えることで間違いを見つけました。解決策は、「\ $」のような各「$」文字で「\」文字を使用することです。したがって、最後のコマンドは次のとおりです。
#!/bin/bash
for ip in $(cat ipListFile)
do
ssh -o ConnectTimeout=2 -o StrictHostKeyChecking=no -o PasswordAuthentication=no $ip "for i in /home/*; do chown \$(echo \$i | awk -F"home/" '{ print \$2 }'):groupO \$i; done;"
done
最も簡単な解決策は、スクリプトを送信してから実行することです。
for ...
do
scp script.sh $ip:/tmp
ssh $ip bash /tmp/sript.sh
ssh $ip rm /tmp/sript.sh
done
複数のタイムアウトを回避するため
for ...
do
if scp script.sh $ip:/tmp
then
ssh $ip bash /tmp/sript.sh
sh $ip rm /tmp/sript.sh
fi
done
すべての/home/userX
はuserX
に属している必要があります
あなたが試すことができます
"ls -d /home/* | xargs -L1 basename | while read h ; do chown \$h:group0 /home/\$h ; done"