Мой клиент попросил меня развернуть несколько папок в нескольких домашних каталогах для веб-сайтов его клиентов. Я сделал это с помощью сценария Bash, но в итоге он использовал разрешения учетной записи root.
Как мне создать сценарий Bash, который берет каждую папку в / home /пользователь (не скрытые файлы или папки), получает права собственности пользователя и группы на эту папку, а затем выполняет команду chown -R {user}. {group} / home /пользователь?
На серверах работает CentOS Linux.
Я должен полностью отдать должное Кайлу Брандту выше. Итак, если вам нравится этот ответ ниже, щелкните треугольник вверх на его сообщении, чтобы поднять его статус, пожалуйста.
Тем не менее, я улучшил его распорядок и счел своим долгом опубликовать его здесь и отметить как окончательный ответ.
Все, что я добавил в распорядок Кайла, - это убедиться, что мы касаемся только домашнего каталога, то есть строки со звездочками в нем. Затем я убеждаюсь, что этот домашний каталог все еще существует. После этого я делаю заявление chown. И как сказал Кайл - удалите ключевое слово «echo», и оно действительно выполнит задачу. Затем я добавил "-R" в chown, чтобы заставить его работать рекурсивно на случай, если проблема может быть глубже в домашнем каталоге.
#!/bin/bash
while IFS=':' read -r login pass uid gid uname homedir comment; do
if [[ "$homedir" = **/home/** ]]; then
if [ -d "$homedir" ]; then
echo chown -R $uid:$gid "$homedir";
fi
fi
done < /etc/passwd
Я думаю, что вы спрашиваете как-то наоборот. Вы не хотите брать каждую папку, а затем находить пользователя, скорее вы хотите взять пользователя и найти его домашнюю папку.
#!/bin/bash
while IFS=':' read -r login pass uid gid uname homedir comment; do
echo chown $uid:$gid "$homedir";
done < /etc/passwd
Конечно, вам нужно будет удалить эхо, и вам нужно будет запустить это с правами root. Я также всегда рекомендую цикл while вместо цикла for ls
себя. Вы можете сохранить этот цикл для любых действий с /etc/passwd
.
#!/bin/bash
for f in $( ls /home/ );
do chown -R $f:yourgroup /home/$f
done
Здесь нет проверки на работоспособность, и я написал это без какого-либо тестирования, так что будьте осторожны.
(Кстати, требование «никаких скрытых файлов или папок» будет выполняться тем фактом, что скрытый файл в Unix - это просто обычный файл с. Перед ним, и .username не будет действительным пользователем для chown).
Это может помочь
#!/bin/bash
for file in `ls -a | grep -v '^\.'`
do
if [[ -d $file ]]
then
fowner=`ls -ld $file | nawk '{print $3}'`
fgroup=`ls -ld $file | nawk '{print $4}'`
chown -R $fowner:$fgroup $file
fi
done
Использовать getent
чтобы получить имя пользователя, имя группы и домашний каталог каждого пользователя, чей идентификатор пользователя больше или равен 500, и применить их через chown -R
. Кроме того, в настоящее время это user:group
.
для меня в ls -l /home/ | awk '{print $3}'
; do chown -R $ i / home / $ i; готово
для меня в ls -l /home/ | awk '{print $4}'
; do chgrp -R $ i / home / $ i; готово