Tenho um script bash que efetua login na minha instância do bitwarden usando o bw
cli, da seguinte maneira:
teste.sh:
#!/usr/bin/sh
set -e -o pipefail
bw logout --quiet || true
BW_CLIENTID=$(cat ./credentials.json | jq -r '.client_id') \
BW_CLIENTSECRET=$(cat ./credentials.json | jq -r '.client_secret') \
bw login --apikey
O ./credentials.json
tem as seguintes permissões:
-rw-r--r-- 1 root root 169 Jun 10 2023 credentials.json
executar este script como um usuário comum funciona bem, mas às vezes preciso executá-lo como root, e notei que em alguns sistemas o bw
comando não lê as variáveis de ambiente inline corretamente quando executado apenas com sudo
, ele só funciona com sudo -E
, então:
./test.sh # always works
sudo ./test.sh # works on some machines but not others
sudo -E ./test.sh # always works
Quando funciona, obtenho a saída:
You are logged in!
e quando isso não acontece eu recebo:
client_id or client_secret is incorrect. Try again.
Digo "corretamente" porque parece que ele está lendo as variáveis de alguma forma, porque se eu remover uma das variáveis de ambiente assim:
BW_CLIENTID=$(cat /mnt/keys/vaultwarden.json | jq -r '.client_id') \
bw login --apikey
Em vez disso, sou solicitado a informar o segredo do cliente (ou o ID do cliente, se eu remover BW_CLIENTID
). Então, por algum motivo, os valores nas variáveis de ambiente não são lidos corretamente sem a -E
opção, mas eles parecem estar lá.
Tentei criar um teste com um script geral da seguinte maneira:
foo.sh:
#!/usr/bin/sh
set -e
FOO=$(cat ./data.json | jq -r '.my_prop') \
BAR=$(cat ./data.json | jq -r '.other_prop') \
./bar.sh
barra.sh:
#!/usr/bin/sh
set -e
echo "foo: '$FOO'"
echo "bar: '$BAR'"
Mas executar qualquer um deles em qualquer um dos meus sistemas funciona, todos eles fornecem a saída esperada (o conteúdo de my_prop
e other_prop
em data.json
) e não vejo diferença entre o valor impresso para nenhuma das variantes:
./foo.sh
sudo ./foo.sh
sudo -E ./foo.sh
Eu testei em vários sistemas, que são uma mistura de sistemas Ubuntu e Arch. Até agora, ele falhou sem ele -E
em todos os sistemas Ubuntu e alguns Arch, e funcionou sem ele -E
em apenas um sistema Arch.
Minhas principais perguntas são: se há uma maneira de sudo
ser configurado para sempre executar com -E
ou algo semelhante? E se há uma diferença de formatação ao usar a -E
opção? (credenciais podem ter alguns caracteres estranhos, mas não entendo por que a -E
opção faria diferença)
Vi que o /etc/sudoers
arquivo permite que você faça algo como:
Defaults env_keep += "HOME"
Mas todas essas linhas são comentadas em todos /etc/sudoers
os arquivos (portanto, em todos os sistemas, incluindo o que está funcionando) e não há arquivos adicionais em /etc/sudoers.d/
. Eu também tentei adicionar BW_CLIENTID
e BW_CLIENTSECRET
assim, mas não teve efeito:
Defaults env_keep += "BW_CLIENTID"
Defaults env_keep += "BW_CLIENTSECRETS
Mas talvez existam outros lugares ou cenários?
nota lateral: presumo que isso possa ser apenas alguma peculiaridade no
bw
cli que o faz não ser capaz de pegar as variáveis de ambiente corretamente em algum sistema sem-E
, mas gostaria de saber se há configurações que eu poderia começar a olhar em meus próprios sistemas. No entanto, eu estaria interessado em qualquer dica sobre isso também.