Você não precisa conceder sudo
access a echo
. De facto, isso é inútil porque, e. com sudo echo foo > bar
, o redirecionamento é feito como o usuário original, não como root.
Chame o script pequeno com sudo
, permitindo que NOPASSWD:
acesse SOMENTE esse script (e quaisquer outros scripts semelhantes) pelo (s) usuário (s) que precisam acessá-lo.
Esta é sempre a maneira melhor / mais segura de usar sudo
. Isole o pequeno número de comandos que precisam de privilégios de root em seus próprios scripts separados e permita que o usuário não confiável ou parcialmente confiável execute apenas esse script como root.
Os pequenos scripts sudo
-able não devem receber args (ou entrada) do usuário (ou seja, qualquer outro programa chamado deve ter opções codificadas e args) ou deve ter muito cuidado em validar quaisquer argumentos / entrada que tem que aceitar do usuário.
Seja paranóico na validação - em vez de procurar coisas 'conhecidas ruins' a serem excluídas, permitir apenas coisas 'boas' e abortar em qualquer divergência ou erro ou qualquer coisa suspeita até mesmo remotamente.
A validação deve ocorrer o mais cedo possível no script (preferencialmente antes que ele faça qualquer coisa mais como root).
Eu realmente deveria ter mencionado isso quando escrevi esta resposta pela primeira vez, mas se o seu script for um script de shell, DEVE citar corretamente all variáveis. Tenha um cuidado especial ao citar as variáveis que contêm entrada fornecida pelo usuário em qualquer modo, mas não presuma que algumas variáveis sejam seguras, COTA AS TODAS .
Isso inclui variáveis de ambiente potencialmente controladas pelo usuário (por exemplo, "$PATH"
, "$HOME"
, "$USER"
etc. E definitivamente incluindo "$QUERY_STRING"
e "HTTP_USER_AGENT"
etc em um script CGI). Na verdade, apenas cite todos eles. Se você tiver que construir uma linha de comando com múltiplos argumentos, use uma matriz para construir a lista de argumentos e cite isso - "${myarray[@]}"
.
Eu já disse "cite todos" com bastante frequência? lembre se. faça isso.