RESOLVIDO, script atualizado adicionado - Obrigado a ambos @steeldriver e @user10489
A impressão do shell está fora de ordem e faltando algumas informações.
Sou novato em Linux e ainda estou na fase de copiar/colar e ver o que acontece.
Já tentei pesquisar no Google, mas não adiantou.
Estou executando um script que emprega várias maneiras de retornar o usuário atual.
O script usa
- chamadas diretas
- chamadas usando
sudo
- chamadas usando
sudo su -
Cada método deve retornar 7 valores, em vez disso, o primeiro e o segundo métodos retornam 5 valores, e o terceiro método retorna todos os 7.
O roteiro em questão:
#!/usr/bin/env bash
echo ""
echo "GET USER - DIRECT"
echo ""
whoami
echo $USER
id -u -n
logname
ps -o user= -p $$ | awk '{print $1}'
echo $SUDO_UID
echo $SUDO_USER
echo ""
read -p "Press enter to continue"
echo -e "\n"
echo "GET USER - SUDO"
echo ""
sudo whoami
sudo echo $USER
sudo id -u -n
sudo logname
sudo ps -o user= -p $$ | awk '{print $1}'
sudo echo $SUDO_UID
sudo echo $SUDO_USER
echo ""
read -p "Press enter to continue"
echo -e "\n"
echo "GET USER - SUDO SU -"
echo ""
sudo su -c 'whoami; echo $USER; id -u -n; logname; ps -o user= -p $$ | awk "{print $1}"; echo $SUDO_UID; echo $SUDO_USER; echo ""'
echo -e "\n"
A saída que obtenho:
player1@Arcade:~/Desktop$ ./testuser.sh
GET USER - DIRECT
player1
player1
player1
player1
player1
Press enter to continue
GET USER - SUDO
[sudo] password for player1:
root
player1
root
player1
player1
Press enter to continue
GET USER - SUDO SU -
root
root
root
player1
root
1000
player1
O que estou esquecendo aqui? Minha suposição é que a chamada direta de $SUDO_UID
e $SUDO_USER
é relacionada a permissões. A ordem em que a impressão está acontecendo ainda me intriga.
EDITAR:
entender o uso de sh -c
, citação adequada e acesso às variáveis $SUDO_xxxxx resolveu o problema.
Além disso, não consigo contar corretamente. O script tem como objetivo retornar 7 valores, não 6.
O script atualizado agora está funcionando como era de se esperar.
Obrigado a ambos pela ajuda!
meu script atualizado:
#!/usr/bin/env bash
echo ""
echo "GET USER - DIRECT"
echo ""
whoami
echo $USER
id -u -n
logname
ps -o user= -p $$ | awk '{print $1}'
sh -c 'echo $SUDO_UID'
sh -c 'echo $SUDO_USER'
echo ""
read -p "Press enter to continue"
echo -e "\n"
echo "GET USER - SUDO"
echo ""
sudo whoami
sudo echo $USER
sudo id -u -n
sudo logname
sudo ps -o user= -p $$ | awk '{print $1}'
sudo sh -c 'echo $SUDO_UID'
sudo sh -c 'echo $SUDO_USER'
echo ""
read -p "Press enter to continue"
echo -e "\n"
echo "GET USER - SUDO SU -"
echo ""
sudo su -c 'whoami'
sudo su -c 'echo $USER'
sudo su -c 'id -u -n'
sudo su -c 'logname'
sudo su -c 'ps -o user= -p $$ | awk '"'"'{print $1}'"'"
sudo su -c 'sh -c '"'"'echo $SUDO_UID'"'"
sudo su -c 'sh -c '"'"'echo $SUDO_USER'"'"
echo -e "\n\n"
minha saída atualizada:
player1@Arcade:~/Desktop$ ./testuser.sh
GET USER - DIRECT
player1
player1
player1
player1
player1
Press enter to continue
GET USER - SUDO
[sudo] password for player1:
root
player1
root
player1
player1
1000
player1
Press enter to continue
GET USER - SUDO SU -
root
root
root
player1
root
1000
player1
Há duas questões aqui:
$
strings não são citadas corretamente, então são substituídas antes de serem passadas para o sudo. Se você não quiser que elas sejam substituídas antes, coloque-as entre aspas simples ou entre aspas de barra invertida. Essas aspas serão removidas e então serão$
passadas para o comando seguinte.$
substituição é feita por um shell...em algum lugar. Então, se você executar o comando sem um shell (ou seja, diretamente pelo sudo), ele apenas ecoará o raw$var
. Osh -c
fornece esse segundo shell.Por exemplo:
Isto é do meu shell original
...o shell original fez a substituição mesmo que o sudo tenha executado o echo.
Sem shell — o comando não foi analisado, então o sudo tentou encontrá-lo
echo $$
como um executável (com o espaço nele).Nenhuma substituição foi feita...o raw
$$
foi impresso.Novo shell com novo pid fez a análise e substituição do comando
e o pid do shell original ainda é o mesmo
O artigo referenciado no comentário ("Por que $HOME não muda se eu usar sudo?") é um problema separado, mas relacionado. Muitas das
$
variáveis não são definidas pelo shell, mas vêm do ambiente, e o sudo seletivamente passa por algumas delas inalteradas, filtra seletivamente outras, e seletivamente altera outras, dependendo dos arquivos de configuração e opções de linha de comando.Parece que você está confuso sobre onde alguns dos seus comandos estão obtendo informações.
$$
é uma constante de shell local, substituída pelo pid do shell "atual"A página de manual
logname
não diz de onde ele obtém essas informações, mas imagino que ele as obtenha de quem está logado no terminal atual.$SUDO_UID
e$SUDO_USER
são variáveis de ambiente definidas especificamente pelo sudo para o usuário que invocou o sudo, não para o usuário para o qual o sudo está alternando; isso é explicitamente declarado na página de manual do sudo, então não deve ser confuso.