По-видимому, я полностью пропустил Ваш вопрос. Ответ - то, что нет никакого четко определенного "нормального автозавершения". Однако, если бы Вы знаете, какую вещь Вы хотели бы, чтобы это завершило (файлы, псевдонимы, pids, имена переменной, и т.д.), можно дать один или несколько флагов compgen
. См. эту compgen страницу руководства, конкретно -A
опции под complete
(они - то же). Например, если бы Вы хотите завершить имена файлов, Вы использовали бы это:
compgen -f -- "${COMP_WORDS[COMP_CWORD]}"
Если Вы хотите завершить команды (включая псевдонимы, функции, и т.д.), можно использовать это:
compgen -back -A function -- "${COMP_WORDS[COMP_CWORD]}"
Использовать $COMP_CWORD
получить индекс завершаемого слова. Если индекс не 1, набор $COMPREPLY
кому: ()
и возвратитесь.
COMP_CWORD
An index into ${COMP_WORDS} of the word containing the current
cursor position. This variable is available only in shell functions
invoked by the programmable completion facilities
Я лично не обеспокоился бы как программы, которые Вы перечислили, обычно считаются безопасными и надежными. И например sudo
без suid набора битов не имеет никакого смысла. То же идет для chsh
chfn
и т.д. Если бы Вы действительно хотите защитить свой сервер, я просто дал бы следующие исполняемые файлы suid полномочия:
ping
/ping6
по диагностическим причинам.suexec
запускать cgi скрипты при различных пользователяхsu
или sudo
pt_chown
если Вы не имеете devpts
Можно удалить бит suid из ssh-keysign
поскольку это только используется для основанной на хосте аутентификации согласно http://lists.freebsd.org/pipermail/freebsd-stable/2006-October/029737.html
Необходимо также удостовериться, что пользователи не получают доступ оболочки и имеют их каталог chrooted.
Если Вы действительно хотите защитить свой сервер, необходимо рассмотреть изучение SELinux.
Позвольте своему распределению сделать то, что оно хочет, если Вы не уверены, что знаете то, что Вы делаете. То, что необходимо задать этот вопрос, показывает, что Вы не знаете достаточно. Так оставляют хорошо одними.
То, какие программы должны быть setuid, зависит от того, как вещи настраиваются на Вашем распределении. Например, Fedora заменил большую часть использования setuid setcap. Например, для ping нужно CAP_NET_RAWIO
возможность смочь открыть неструктурированные сокеты; это может получить его, будучи setcap CAP_NET_RAWIO
(лучшая изоляция полномочия), или будучи setuid корнем (традиционный метод, который не требует setcap исполняемых файлов).
Программы, которые Вы перечисляете, разработаны, чтобы быть выполненными обычными пользователями, но потребовать дополнительных полномочий функционировать. При удалении их бита setuid Вы повредите свою систему. Например, ping
просто прекратит работать (если Вы не зарегистрированы как корень). Вы сможете стать корнем с su
но не с sudo
, который побеждает смысл sudo
. Пользователи не смогут установить crontabs. И так далее.
На выделенном сервере не могли бы иметь значения некоторые вещи, которые Вы повредили. Но необходимо только изменить значения по умолчанию распределения, если Вы знаете о выполнении правильной вещи, не наоборот. Помните, что доступность является частью безопасности. Если Вы блокируете себя из сервера или делаете себя не могущими диагностировать и восстановить проблемы, Вы повредили свою собственную безопасность.
selinux будет заботиться многое из того (в тех системах, которые имеют его). Таким образом, если бы Вы используете selinux, я оставил бы весь материал setuid в покое, он не должен больше иметь полномочий, чем selinux политика даст его.