sg
позволяет переключить основную группу на другую дополнительную группу (т. Е. Группу, для которой пользователь указан в / etc / group
) без аутентификации, или переключить основную группу на группу, указанную в / etc / group
, введя пароль, указанный в / etc / group
или / etc / gshadow
. Таким образом, использование sg
, «без ввода паролей» и «не должен быть членом этой группы» противоречат друг другу.
Если пользователь может свободно переключаться в группу, нет особого смысла не делать его членами группы. Единственным реальным преимуществом будет регистрация, когда они обращаются к группе.
Конфигурация, которую вы пробовали, с пользователем, указанным в gshadow
, но не в группе
, не является поддерживаемой конфигурацией. Тот факт, что он дал что-то близкое к тому, что вы хотели, на самом деле кажется мне ошибкой - gshadow
не должен предоставлять членство в группах, которые не указаны в group
. В руководстве указано: «Вам следует использовать тот же список пользователей, что и в / etc / group
». Если вы нарушите эту рекомендацию, не рассчитывайте на разумное или переносимое поведение.
Если вы хотите разрешить пользователю запускать определенную команду как группу, с ведением журнала, вы можете использовать sudo. Запустите visudo
и добавьте такую строку после любого не- NOPASSWD
, как это может касаться этого пользователя :
morfik ALL = (morfik:audio) NOPASSWD: pulseaudio
Один из способов выполнить определенную операцию для всех каталогов, найденных в данном каталоге,
setopt -s nullglob
for e in SPECIFIED_DIRECTORY/*
do
setopt -u nullglob
[[ -d $e ]] && YOUR_SCRIPT "$e"
done
Обратите внимание, что при этом будут пропущены каталоги, имя которых начинается с точки. Обычно это то, что нам нужно, но если вы хотите включить и эти каталоги, вы можете адаптировать мое решение и к этому случаю. :См. параметр dotglob
на странице руководства и не забудьте исключить специальные каталоги .
и ..
.
Другой возможностью является использование чего-то вроде
find SPECIFIED_DIRECTORY -maxdepth 1 -type d -exec YOUR_SCRIPT {} \;
Всего одна строка переместит все файлы (в дочерних подкаталогах )в pwd.
$ find . -mindepth 2 -type f -exec mv {}.. \;
При этом будут перемещены все обычные файлы, включая файлы с точкой -(, начинающиеся с точки ), но не ссылки.
Затем удалите пустые каталоги:
$ find. -type d -empty -delete
То, что осталось, содержит ссылки (или другие типы файлов ), которые не были перемещены.
Если вам нужен скрипт, используйте:
#!/bin/bash
fullpath=${1:-.}
( cd "$fullpath";
find . -mindepth 2 -type f -exec mv {}.. \;
find. -type d -empty -delete
)
Вызовите скрипт как:script /the/path/you.want