Se a ferramenta não fizer o que você deseja, você poderá aprimorá-la usando um script de wrapper. Eu uso esse script ( noenv
) para manter limpos os ambientes de criação. Usando como
sudo -u powerlessuser noenv /bin/processCmd
faria o que você está pedindo. (O script deve estar no caminho padrão, caso contrário você deve fornecer o caminho no comando).
Script:
#!/bin/sh
# $Id: noenv,v 1.3 2014/05/10 22:43:32 tom Exp $
# trim the environment to minimal (PATH may still be long...)
env | sed -e 's/=.*//' -e '/^[ ].*/d' | \
while true
do
read value
if test -z "$value" ; then
# honor assignments to variables in the parameter list
while test $# != 0
do
case "x$1" in
*=*)
eval $1
name='echo "$1"|sed -e 's/=.*//''
export $name
shift 1
;;
*)
break
;;
esac
done
exec "$@"
break
fi
case "$value" in
HOME|PATH|USER|_|SHLVL|TMPDIR|LOGNAME)
;;
*\ *|*\(*|*\)*|*\!*)
#echo "...skipping $value"
;;
*)
#echo value:"$value"
unset "$value"
;;
esac
done
Para esclarecer, eu não escrevi isso usando /usr/bin/env
, porque alguns dos sistemas nos quais eu estava construindo não tinham um recurso POSIX que a questão mencionada: a opção -i
. Esses são sistemas antigos da BSD, incluindo SunOS 4 e HPUX 10 (verificando minha memória na página de manual de" env "no FreeBSD).
O script, a propósito, reduz os valores de várias linhas (mas o único que você pode encontrar é TERMCAP
, e isso apenas em máquinas muito antigas). A segunda expressão sed deve ser um intervalo com a aba e o espaço .
Para o POSIX (no qual você provavelmente está mais interessado), você pode fazer algo que use o recurso para transmitir valores selecionados do ambiente pai, por exemplo,
env -i foo="bar"
e, portanto, ambos são personalizáveis. Para um grande conjunto de variáveis, isso pode ser desajeitado e um script é uma escolha melhor.
sudo
desaprova TERMCAP
em qualquer caso. Isso está em uma lista (longa) de variáveis que é útil remover do ambiente.
sudo
insiste em definir determinadas variáveis. Lendo a fonte plugins/sudoers/env.c
, você verá este pedaço perto do fim de rebuild_env
:
/* Add the SUDO_USER, SUDO_UID, SUDO_GID environment variables. */
CHECK_SETENV2("SUDO_USER", user_name, true, true);
snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int) user_uid);
CHECK_SETENV2("SUDO_UID", idbuf, true, true);
snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int) user_gid);
CHECK_SETENV2("SUDO_GID", idbuf, true, true);
debug_return_bool(true);
ou seja, logo antes do retorno (somente) bem-sucedido dessa função, ele define suas próprias variáveis , usando seus próprios valores .