2

Я хочу запустить команду для изменения владельца /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 . Этот цикл работает на локальном удаленном сервере. Но я не могу использовать эту команду на локальном сервере в качестве удаленного сценария для удаленного сервера. Когда я пытаюсь выполнить эту команду на локальном сервере, переменная «$ i» имеет смешное значение, например "17123891".

2 ответа2

2

Я обнаружил ошибку с изменением ответа Nathan'а. Решение заключается в использовании символа "\" с каждым символом "$", например "\$". Итак, последняя команда:

    #!/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
1

Простейшим решением будет отправить сценарий, а затем выполнить его.

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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .