Як я можу змінити всі файли, що належать одному користувачу, іншому користувачеві?


39

Я шукаю команду Linux, яка може змінити право власності на всі файли, що належать даному користувачеві, бажано в цільовому каталозі, на іншого вказаного користувача.

Моя команда мрії виглядала б приблизно так ...

chuser -R --olduser tom --newuser jerry

або

chuser -R --olduser 1066 --newuser 1492

Це мій сценарій ... У мене є резервний файл (.tgz) із збереженою в ньому інформацією про користувачів та групи. Це було взято з веб-сервера під управлінням Apache та MySQL. Файли в резервній копії представлені з усієї системи і містять файли від кількох різних користувачів та декількох облікових записів системного типу, і важливо, щоб після відновлення на новому сервері налаштування не втрачалися. Проблема полягає в тому, що користувачі на машині відновлюють файли, щоб вони не відповідали тим, які є у файлі резервного копіювання. Наприклад, обидві машини мали користувача MySQL, але вони мають різні ідентифікаційні дані користувачів, і є кілька ідентифікаторів користувачів, які існували на обох машинах, які належать різним користувачам. Це означає, що немає можливості синхронізувати користувачів на новій машині з тими на старій машині.

Я можу знайти всі файли користувачів за допомогою команди find, як це ...

find /decompressed-backup-dir -uid 1050

або

find /decompressed-backup-dir -user tom

Якщо, як я підозрюю, немає можливості зробити те, що я хочу, за допомогою однієї команди, можливо, є спосіб передавати результати команди find до іншої команди для обробки зміни власності?

Я міг би зробити це за допомогою PHP-скрипту, але в резервній копії є 4 ГБ і десятки тисяч файлів, тому я не хочу використовувати PHP або Perl, але я був би задоволений сценарієм оболонки, який міг би це обробити.

Відповіді:



65

Я думаю, що - прапор із команди chown - це, мабуть, найпростіший спосіб.

chown --from=oldguy newguy * -R

3
Найкраще рішення, не потрібно його кохати
Тобіас Хагенбек

2
Оптимальне рішення
Карл Форнер

1
в OS X ви можете це зробити за допомогою brew install coreutilsі gchown.
jomo

Це правильна і найкраща відповідь.
Джордж М

Я підтверджую, це має бути найкращою відповіддю.
Soullivaneuh

7

Додавши відповідь від SiteKickr , аргумент chgrpне має --from, але ви можете досягти того ж chown, опустивши користувача.

Приклад:

chown -R --from=:currentgroup :newgroup /some/directory

6

Ви можете використовувати find, як деякі інші публікації, щоб зробити це chown.

Однак вам, можливо, не доведеться так само tarпіклуватися про речі для вас.

Наприклад, якщо ви зробите tarна machine Aякому користувач tomзнаходиться , uid 500а потім untarфайл на machine Bякому користувач tomзнаходиться uid 505, tarбуде робити правильні речі і зробити файли , що належать uid 505.


Цікавий ласощі, я про це не знав. Таким чином, tar не тільки зберігає uid, але і ім'я, пов'язане з uid.
Ніколі

3
У вихідному форматі дьогтю зберігалася лише числова інформація. Формат UStar, запроваджений POSIX наприкінці 80-х, додає назви. Так що майже будь-який дьоготь, з яким ви стикаєтесь в ці дні, робить правильно.
Цикламіно

1

Відповідь встановлює обидва користувачі і групи:

find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +

але якщо ви хочете змінити ТІЛЬКУ групу файлів, яка належить якомусь користувачеві, ви не можете використовувати chown(наскільки я знаю), а натомість використовувати chgrp:

find /decompressed-backup-dir -uid 1050 -exec chgrp newgroup {} +

і щоб змінити ТІЛЬКУ групу файлів, яка належить до певної групи, яку ви повинні використовувати, наприклад:

find /decompressed-backup-dir -gid 400 -exec chgrp newgroup {} +

Просто для додання знань.


1
Насправді, ви можете просто залишити newuserчастину. Сторінка Man каже: "Якщо двокрапка та група надані, але власник опущений, змінюється лише група файлів; у цьому випадку chownвиконується та сама функція, що і chgrp."
Ben Voigt

0

Якщо вам потрібно рекурсивно зіставити старі / нові ідентифікатори власності, які вирішуються для того самого /etc/passwdкористувача ,

(що може статися після того, як ви ввели LDAP на сервер і /etc/passwdмає дублікати записів для кожного користувача та групи),

Ви можете використовувати цей сценарій, який я написав: https://gist.github.com/siers/ded0a4158c900495f04c3ad965f4a544

Він створює відображення самостійно. Інтерфейс програми знаходиться, на жаль, у коді. Додайте деякі заяви про налагодження, якщо вам потрібно вивчити, як це робити. Але це майже прославлений чоун із відображенням, створеним із дублікатів/etc/passwd . Якщо це коли-небудь стане в нагоді, це було б дійсно здорово. :)


-2

Можна використовувати chown - R /directory/file

Ця команда змінить дозвіл для всіх примірників каталогу chown - R /directory

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.