Как включить 'sudo' с пользовательскими функциями?

Вместо TIMESTAMP, поместить

$$(date +%Y%m%d%H%M%S)

в Вашем рецепте остроты.

5
26.03.2012, 09:44
1 ответ

В общем случае то, что вы пытаетесь сделать, на самом деле не работает.

В случае псевдонимов, перед передачей строки на выполнение выполняется простая перезапись строки.

Так, например, если у вас есть

alias sudo='sudo '
alias foo='bar baz'

, то при вводе sudo foo командная строка переписывается на sudo bar baz и , что является то что запускается. Это простое переписывание командной строки.

Теперь функции усложнились. Это не просто переписывание, а полная оценка; они могут устанавливать переменные, изменять каталоги, открывать файлы ... в значительной степени делать все, оболочка. И, что немаловажно, они запускаются в контексте текущей оболочки. Когда вы запускаете sudo myfunction , ничего из этого невозможно; в частности, команды sudo выполняются как подпроцесс и поэтому не могут влиять на текущую оболочку.

Обход, используемый для таких вещей, как sudowrap , упомянутый выше, заключается в том, чтобы попытаться автоматически обработать sudo bash -c 'myfunction () {...}; моя функция ». Это явно вызывает новую подоболочку bash , а затем запускает функцию в этой подоболочке. Явный вызов дает понять, что такие вещи, как установка переменных и тому подобное, работать не будут :-) Он позволяет использовать ограниченный набор функций.

Функции, которые вы можете вызывать таким образом, лучше переписать как сценарии оболочки, а не функции; тогда sudo может вызвать их напрямую. Пример, приведенный на http://w00tbl0g.blogspot.com/2007/05/using-bash-functions-under-sudo.html , будет проще, если duk преобразовать в исполняемый файл

#!/bin/bash
exec du -k "$@" | sort -n

Тогда он будет работать, как ожидалось!

1
27.01.2020, 20:43

Теги

Похожие вопросы