我myscript.sh
按根 crontab 中的计划运行,我需要它来检测非 root 用户(系统启动时使用该用户)。
我尝试过这些变体:
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
唯一有效的是:
local_user=${SUDO_USER:-$(whoami)}
local_user=${SUDO_USER:-$USER}
但是只有在我手动运行脚本时它们才会起作用,无论是使用 sudo 还是从 root 帐户,但它在 crontab root 中不起作用。
例子:
#!/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
任何想法?
PD:Ubuntu 22.04
更新:已解决!
我在这里找到:https://unix.stackexchange.com/a/617686/266428
local_user=$(ps -eo user,uid | awk 'NR>1 && $2 >= 1000 && ++seen[$2]==1{print $1}')
或者
local_user=$(who | head -1 | awk '{print $1;}')
答案1
cron
以身份运行的登录用户到底是谁root
?root
。脚本手动运行的原因是因为有sudo
登录用户的参与。 没有cron
,系统在指定的上下文中启动作业,这里是root
。 事实上,运行时不必有登录用户cron
,每个人都可以注销,它仍会运行,从而为每个作业创建必要的上下文。 此外,与 Windows 不同,Linux 不会将您限制为一个登录用户;您可以让数十个用户同时登录(尽管使用消费级硬件,如果他们这样做,他们都会发现系统非常迟缓)。您能做的最好的就是向系统询问当前登录用户的列表。