Как я могу защитить свое окружение от стирания половины его?
Кажется, я могу защитить переменные, но функции, на которые полагаются переменные (например, приглашение), не определены.
Это означает, что в следующий раз, когда будет отображаться приглашение, вместо запуска функции только для чтения в среде, оно будет искать исполняемый файл на диске и выполнит первое, что найдет.
Это может или не может быть вредным в зависимости от обстоятельств, но кажется, что сохранение "половины" среды и удаление вещей, на которые можно положиться, даже, например, для отображения следующего приглашения, - это путь к катастрофе.
Кроме того, в установках, где env IS очищен, переменные типа «TERM» сохраняются, но не «DISPLAY». Разве GUI не является более распространенным в наши дни, чем TTY? Возможно, еще хуже то, что sudo поощряет использование функции pam_env "только для авторизации". В документации pam_env рекомендуется использовать только во время первой авторизации в системе, поскольку, если пользователь входит из удаленной системы, это единственный раз, когда PAM может получить доступ, откуда пользователь вошел в систему, и установить такие вещи, как REMOTEHOST и DISPLAY. С sudo стирает логин и говорит дистрибутивам использовать pam_env, это почти гарантирует, что хост и дисплей оригинального пользователя будут очищены. Помимо того, что запутывает происхождение пользователя, он также убивает любой сеанс удаленного входа.
Учитывая, что многие системы не позволяют вам входить в систему root напрямую через удаленный сеанс - но требуют, чтобы вы входили через своего пользователя, а затем sudo в root, это может показаться очевидным способом аннулировать эту модель безопасности.
Есть ли другая версия sudo, которая не так небезопасна?
Обновить
Для подсказки: 1) Я не хочу вызывать дисковые функции каждый раз, когда я запрашиваю (как это происходит при переключении цветов). Также требование: когда я перечисляю свои глобальные переменные, ИЛИ, когда я отслеживаю, я не хочу, чтобы коды переключения цвета отображались в необработанном виде и меняли цвета там, где они не нужны.
Кроме того, я не хотел говорить об этой конкретной настройке, поскольку она работала на YEARS для нескольких Unix-систем и Windows, только для того, чтобы нуждаться в "исправлении" сейчас, когда sudo не может скопировать мою среду с целостностью.
Для настройки цвета это относительно тривиально. Используйте "read" и читайте в кодах из tput в vars, поэтому в списке или в трассировке коды находятся в нерасширенном вводе bash. Пример:
read _CRST <<<"$(tput sgr0)" #Reset
read _CRed <<<"$(tput setaf 1)" #Red
read _CBLD <<<"$(tput bold)" #Bold
становится:_CBLD = $ '\E [1 м' _CRST = $ '\E [0; 10 м' _CRed = $ '\E [31 м'
Примечание: мои требования были разработаны и уточнены в течение нескольких лет, это не является стимулом для создания момента.
Но для подсказки, это намного сложнее - помните, нет хоста для локального хоста, но также хотите, чтобы он был в заголовке окна.
Здесь есть все, кроме spwd:# построить приглашение ########### # специфично для эмуляций консоли xterm & linux read read _CRST <<< "$(tput sgr0)" #Reset read _CRed < << "$(tput setaf 1)" #Red read _CBLD <<< "$(tput bold)" #Bold Declare _prompt_open = "" _prompt_close = "" _prompt = ">" Declare _disp_port = $ {DISPLAY/[^:] *:/} printf -v qUSER "% q" $ USER typeset -x qUSER
[[ $UID -eq 0 ]] && {
_prompt_open="$_CBLD$_CRed"
_prompt="#"
_prompt_close="$_CRST"
}
PS1='\['"$_prompt_open"'\]$(spwd "$PWD" )'"$_prompt"'\['"$_prompt_close"'\] ';
if [[ -n ${REMOTEHOST:-""} ]]; then
function titlebar { \
printf "\033]1;${qUSER}@${HOSTNAME}:%q\007" "$(spwd "$PWD")" ;\
}
export -f titlebar
PS1='\[$(titlebar)'"$_prompt_open"'\]${HOSTNAME}:$(spwd "$PWD")'"$_prompt"'\['"$_prompt_close"'\] '
fi
FWIW, PS4 получает это:
PS4='>>${BASH_SOURCE:+${BASH_SOURCE[0]/$HOME/~}}#${LINENO}> '
Обратите внимание, что функции spwd нет в приведенном выше примере - она находится в отдельном файле, который создается только при инициализации новой среды.
Но эта функция и ее данные: if [[! $ {qUSER: - ""}]]; затем printf -v qUSER "% q" $ USER export qUSER fi export _home_prefix = $ {HOME%/*}/
Следующая функциональная идея пришла от suse, но была полностью переписана.
Возвращает закороченный путь, когда отображаемый путь занимает> 50% ширины экрана:
alias int=declare\ -i _e=echo _pf=printf exp=export ret=return
exp __dpf__='local -a PF=(
"/$1/$2/$3/../\${$[$#-1]}/\${$#}"
"/$1/$2/../\${$[$#-1]}/\${$#}"
"/$1/../\${$[$#-1]}/\${$#}"
"/$1/../\${$#}"
".../\${$#}"
"..." )'
function spwd () { \
(($#)) || { _e "spwd called with null arg"; return 1; }; \
int w=COLUMNS/2 ;\
( _pf -v _p "%s" "$1" ; export IFS=/ ;\
set $_p; shift; unset IFS ;\
t="${_p#$_home_prefix}" ;\
int tl=${#t} ;\
if (($#<=6 && tl<w));then ((tl<=2)) && \
{ _e -En "${_p}";return 0; } ;\
else \
eval "$__dpf__" ;\
int i pfl=${#PF[*]} ;\
for ((i=0; i<pfl; ++i)); do eval \
"_pf -v _pa %s \"${PF[i]}\"" ;\
_p="$(eval "_pf %s \"$_pa\"")" ;\
((${#_p}<w)) && break; done ;\
fi ;\
_e -En "${_p#$_home_prefix}" )
}
набрать -xrf spwd
При предоставлении ресурсов только для чтения значений или функций:
Если вы попытаетесь повторно использовать переменные или функции только для чтения, вы получите ошибку. Поскольку переменные по-прежнему доступны только для чтения ... только когда sudo разрушает более половины среды, функции, доступные только для чтения, могут быть безопасно прочитаны. Во всех остальных случаях их повторное чтение приведет к множественным ошибкам во время выполнения (невозможно переопределить переменную или функцию только для чтения).
Мои подпрограммы должны были как-то знать, что половина значений только для чтения в памяти (те, которые выглядят как функции) были удалены, и только читать их. Я не уверен, как я буду кодировать в хаки, чтобы проверить перезаписанные переменные или функции только для чтения - и я не должен это делать.
Что касается переопределения моих функций:
1) постоянный пользователь не будет иметь доступа к sudo. 2) Поскольку я системный администратор, эти функции для меня ... если я взломаю свою собственную систему, "C'est la vie".
Re: PAM: Да, sudo использует pam в качестве большинства дистрибутивов.
Все, что я хочу, это чтобы sudo делал то, что он говорит: и не трогал мою среду, когда я говорю это не делать. Вот почему у него нет выбора, поэтому я спросил о более безопасной замене. Программы, которые "помогают" пользователю, лишив его выбора конфигурации, не являются хорошими программами безопасности, поскольку они не уважают политику безопасности локального сайта, а вместо этого переопределяют ее, потому что считают, что знают лучше. Я еще не видел, чтобы такая программа была правильной.
Надеемся, что это ответит на ваши вопросы о том, почему я спрашиваю, как обойти эту проблему и почему это проблема, хотя это, безусловно, значительно выходит за рамки вопроса о том, что кто-то уже отметил, даже будучи ЗАПРОШЕНЫ ... (как я смею!)...