Удалить пользователя и все файлы, принадлежащие этому пользователю

12

Я использовал deluserбез параметра --remove-all-files:

$ deluser 'user'

Есть ли способ, кроме rm -r /home/userкак удалить все файлы, принадлежащие пользователю сейчас (так как я уже выполнил deluser)?

pl1nk
источник

Ответы:

19

Вам нужно будет вручную найти файлы, что, вероятно, было deluserбы то, что будет делать.

Обратите внимание, --remove-all-filesэто не то же самое, что rm -r /home/user. Последний только удаляет homedir (который может включать в себя файлы, не принадлежащие этому пользователю, хотя и не обычно), первый удаляет все файлы, принадлежащие этому пользователю, из системы. По крайней мере, если справочная страница заслуживает доверия .

В GNU findесть -userтест, поэтому вы можете find / -user xxxнайти все файлы, принадлежащие пользователю xxx. xxxбудет имя пользователя, и может (и в этом случае будет необходимо, так как пользователь больше не существует) будет числовой идентификатор пользователя. findтакже есть -deleteопция, так

find / -user xxx -delete

Должен это сделать, хотя я не тестировал команду со всеми опциями одновременно.

РЕДАКТИРОВАТЬ: Числовой идентификатор: причина, по которой я сказал, что вы должны использовать числовой идентификатор, заключается в том, что, поскольку вы уже удалили пользователя, /etc/passwdбыла удалена его запись (в ней, наряду с другими вещами, были указаны идентификатор пользователя и его имя пользователя). ,

Таким образом, если вы не удалили его homedir, один из самых простых способов - просто запросить идентификатор владельца этого homedir:

stat -c %u /home/user/

( statэто инструмент для чтения данных файловой системы. -c %uрассказывает, statкак записать вывод, здесь я прошу просто вывести идентификатор пользователя)

Если вам нравятся однострочники, вы можете даже объединить обе команды:

find / -user $(stat -c %u /home/user/) -delete

(Конечно, вы можете предпочесть запустить его сначала без команды no, -deleteчтобы убедиться, что вы ничего не хотите сохранить, и перехватить любую ошибку, которую вы сделали при написании остальной части команды. Ошибки при выполнении рекурсивных операций удаления /не для слабых сердца.)

njsg
источник
Вы также можете использовать -execопцию find для запуска пользовательской команды rm, если вы хотите немного больше контролировать свои удаления, но я никогда не пробовал это так, YMMV.
agc93
Правда, либо это, либо передача вывода в rmиспользование xargs(но это, вероятно, достигнет предела аргументов, если результатов слишком много), но посмотрите -depth, цитируя справочное руководство: «Если ваша команда` find 'удаляет каталоги, вы можете обнаружить, что вы получаете ложное сообщение об ошибке, когда `find 'пытается вернуться в каталог, который сейчас удален. Использование опции` -depth' обычно решает эту проблему. " (и позже в том же разделе "(` -delete 'в любом случае подразумевает `-depth')")
njsg
@njsg Ну, я получаю:find: 'user' is not the name of a known use
pl1nk
1
@ pl1nk: как я уже сказал, вам придется использовать числовой идентификатор пользователя - поскольку вы уже удалили пользователя, в нем нет сопоставления, в /etc/passwdкотором перечислены пользователь и его идентификатор. Вам нужно будет найти числовой идентификатор. Сделайте stat -c %u /home/user/, он должен дать вам числовой идентификатор пользователя, используйте это, как xxxуказано выше.
njsg
@njsg Вы правы, я не прочитал последнюю часть вашего вопроса.
pl1nk
5

Другой вариант - повторно добавить пользователя adduser, указав старый UID, а затем запустить deluserснова, на этот раз с --remove-all-filesфлагом.

Предположим, например, что у пользователя были имя пользователя aliceи UID 1001:

sudo adduser --uid 1001 alice
sudo deluser --remove-all-files alice
Элия ​​Каган
источник
3

У gnu find есть опции -nouser и -nogroup, найдите их в man find. С помощью этих параметров вы можете найти все файлы в вашей файловой системе (-ах), у которых нет соответствующего пользователя, в / etc / passwd. Если вы не создали нового пользователя со старыми uid своих удаленных пользователей, это возможность найти эти потерянные файлы.

Однако вы можете найти больше файлов - не только те, которые принадлежали вашему удаленному.

о нет
источник
Я считаю, что у вас есть лучший ответ! ... "$ find / \ (-nouser -o -nogroup \) -print0 | xargs -0 rm -rf" Команда находит все файлы, у которых нет ни пользователя, ни группы, и удаляет их автоматически.
DanglingPointer