Eu executo myscript.sh
o agendamento no crontab root e preciso dele para detectar o usuário não root (com o qual o sistema inicia).
Eu tentei estas variantes:
local_user=${who -m | awk '{print $1;}'}
local_user=${logname 2>/dev/null || echo $SUDO_USER}
local_user=$(logname)
local_user=$(ps -o user= -p $$)
local_user=${SUDO_UID:-$(id -u)}
local_user=$(id -u $(logname))
if [ "$EUID" -eq 0 ]; then
local_user=$SUDO_USER
else
local_user=$(whoami)
fi
# or
if [ -n "$SUDO_USER" ]; then
local_user="$SUDO_USER"
else
local_user="$(whoami)"
fi
Os únicos que funcionam são:
local_user=${SUDO_USER:-$(whoami)}
local_user=${SUDO_USER:-$USER}
mas eles só funcionam se eu executar o script manualmente, com sudo ou da conta root, mas não funciona no crontab root.
exemplo:
#!/bin/bash
local_user=${SUDO_USER:-$(whoami)}
echo "my user is $local_user" | tee /var/log/syslog
# run crontab
*/1 * * * * /home/user/test/test.sh
my user is root
# run manual
root@foo:/home/user/test# ./test.sh
my user is user
qualquer ideia?
PD: Ubuntu 22.04
Atualização: resolvido!
Encontrei aqui: https://unix.stackexchange.com/a/617686/266428
local_user=$(ps -eo user,uid | awk 'NR>1 && $2 >= 1000 && ++seen[$2]==1{print $1}')
ou
local_user=$(who | head -1 | awk '{print $1;}')
Quem exatamente é o usuário conectado para
cron
executarroot
?root
. A razão pela qual os scripts funcionam manualmente é porque há umasudo
ação de um usuário conectado. Não há nenhum emcron
, o sistema inicia o trabalho no contexto especificado, que aqui éroot
. E de fato não precisa haver um usuário logado nacron
execução, todos podem estar desconectados e ele ainda rodará, criando o contexto necessário para cada job. Além disso, diferentemente do Windows, o Linux não limita você a um usuário logado; você pode ter dezenas de usuários logados ao mesmo tempo (embora com hardware de consumo, todos acharão muito lento se fizerem isso). O melhor que você pode fazer é solicitar ao sistema a lista atual de usuários logados.