Можно использовать pam_ssh_agent_auth модуль. Довольно просто скомпилировать, и затем просто добавить запись
auth sufficient pam_ssh_agent_auth.so file=~/.ssh/authorized_keys
перед другим auth
(или include
) записи в /etc/pam.d/sudo
и
Defaults env_keep += "SSH_AUTH_SOCK"
кому: /etc/sudoers
(через visudo
).
Теперь каждый пользователь может или пройти проверку подлинности к sudo
через (переданный или локальный) агент SSH или их пароль. Может быть мудро попросить, чтобы Ваши пользователи использовали ssh-add -c
таким образом, что каждый sudo
вызов, по крайней мере, потребует некоторого подтверждения.
Хотите верьте, хотите нет, можно сделать это с find
и du
. Я использовал подобную технику, что я описал на своем блоге некоторое время движение. Та статья названа: [острота]: Вычисление Использования дискового пространства для Списка Файлов Используя du в соответствии с Linux.
Суть того сообщения является командой, такой как это:
$ find -maxdepth 2 -type f | tr '\n' '\0' | du -ch --files0-from=-
Это перечислит размер всех файлов наряду с общим итогом.
$ find -maxdepth 2 -type f | tr '\n' '\0' | du -ch --files0-from=- | tail -10
0 ./92086/2.txt
0 ./92086/5.txt
0 ./92086/14.txt
0 ./92086/19.txt
0 ./92086/18.txt
0 ./92086/17.txt
4.0K ./load.bash
4.0K ./100855/plain.txt
4.0K ./100855/tst_ccmds.bash
21M total
Примечание: Это решение требует этого du
поддерживайте --files0-from=
переключатель, который является переключателем GNU к моему знанию.
выборка из du страницы справочника
--files0-from=F
summarize disk usage of the NUL-terminated file names specified in
file F; If F is - then read names from standard input
Также этот метод страдает от неспособности иметь дело со специальными символами в именах файлов, таких как пробелы и нераспечатки.
du: cannot access `./101415/fileD': No such file or directory
du: cannot access `E': No such file or directory
С ними можно было иметь дело путем представления больше tr .. ..
команды для замены ими с альтернативными символами. Однако существует лучший путь, если у Вас есть доступ к GNU find
.
Если Ваша версия find
предложения --print0
переключитесь затем, можно использовать это колдовство, которое имеет дело с файлами, которые имеют пробелы и/или специальные символы, которые не являются печатаемыми.
$ find -maxdepth 2 -type f -print0 | du -ch --files0-from=- | tail -10
0 ./92086/2.txt
0 ./92086/5.txt
0 ./92086/14.txt
0 ./92086/19.txt
0 ./92086/18.txt
0 ./92086/17.txt
4.0K ./load.bash
4.0K ./100855/plain.txt
4.0K ./100855/tst_ccmds.bash
21M total
du
(использование диска) количество файлы пространства поднимает. Передайте свои найденные файлы ему и направьте его для суммирования (-c
) и печать в человекочитаемом формате (-h
) вместо количеств байта. Эй затем получит размеры всех файлов, завершенных с общим итогом. Если Вы только интересуетесь этой последней строкой, Вы можете затем tail
для него.
Также обработать пробелы в именах файлов, символ разграничивания это find
печать и xargs
ожидает установлен на нулевой символ вместо обычного пространства.
find -maxdepth 2 -type f -print0 | xargs -0 du -ch | tail -n1
Если Вы будете ожидать находить много файлов, которые разрывают количество аргументов maximum, то xargs разделит их на несколько du
вызовы. Затем Вы могли работать вокруг с заменой tail
с a grep
, тот единственные шоу строки суммирования.
find -maxdepth 2 -type f -print0 | xargs -0 du -ch | grep -P '\ttotal$'
$(find ..)
команда и передача его как args к du -ch
. Но в повышении это абсолютно применимо! Также страдает от пробелов и нераспечаток.
– slm♦
05.12.2013, 16:40
Если Вы только собираетесь вычислить размер максимальных двух уровней каталога, почему бы не звонить du
непосредственно?
du -ch dir/* dir/*/* | tail -1
Это заставляет оболочку развернуть два уровня каталогов к списку имен и передает их как аргументы du
который вычисляет сумму.
du
, но эта команда достаточна для большинства (тривиальных) случаев, которым я верю.
–
05.12.2013, 17:13
du
но оболочка и в конечном счете зависимый от операционной системы (на Linux MAX_ARG_PAGES).
– jlliagre
05.12.2013, 17:21
Другой подход: мы просто нуждаемся в размере файла и не заботимся об именах файлов, таким образом, мы можем избавиться от любых "странных" имен файлов, таких как "имена с CR в них, имена с пробелами, и т.д.":
find /some/path -maxdepth 2 -type f -ls -exec printf '\000' \; \
| tr -cd ' -~\000' \
| tr '\000' '\n' \
| awk '{ sum+=$7 } END { print "total size: ",sum }'
Прием:
1) мы печатаем вывод "-ls" каждого файла, СОПРОВОЖДАЕМЫЙ "\000" символ (на следующей строке, но это не проблема, посмотрите шаг 2),
2) мы избавляемся от всего 'non-ascii-printable' (включая '\t' и '\n'. Но мы действительно сохраняем также \000 в дополнение к "регулярному" печатаемому ASCII, поскольку нам нужен он для знания, где строка каждого файла заканчивается!). Тем путем имена файлов больше не имеют никаких причуд в них (никакой '\n', никакой '\t', не''; и т.д.). Мы действительно сохраняем пробелы также, поскольку нам нужны они также для обнаружения 7-го поля "-ls", т.е. размера файла
3) мы переводим добавленные '\000' в '\n' (шаг 2), избавленный от тех также, в случае, если некоторые имена файлов содержали их также!)
4) затем мы добавляем 7-й столбец для получения заключительного размера в байтах.
Это очень портативно (не нуждайтесь в "-print0", и т.д.),
-printf ....
иначе я мог просто просто произвести размер файла только...]
– Olivier Dulac
05.12.2013, 16:19
... --print0 | xargs -0 du ...
– Zelda
05.12.2013, 15:47
Это - простой путь, который обрабатывает любые нечетные имена файлов, которые могут быть найдены:
find . -maxdepth 2 -type f -exec du -ch {} + | grep -w "total"
Если существует действительно большое количество файлов под текущим каталогом, у Вас могла бы быть больше чем одна общая отображенная строка. Могли бы быть также нежелательные общие строки, если некоторые имена файлов содержат изолированное"total
", например: файл называют"Grand total file.txt
"