使用 crontab 获取 root 用户

使用 crontab 获取 root 用户

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以身份运行的登录用户到底是谁rootroot。脚本手动运行的原因是因为有sudo登录用户的参与。 没有cron,系统在指定的上下文中启动作业,这里是root。 事实上,运行时不必有登录用户cron,每个人都可以注销,它仍会运行,从而为每个作业创建必要的上下文。 此外,与 Windows 不同,Linux 不会将您限制为一个登录用户;您可以让数十个用户同时登录(尽管使用消费级硬件,如果他们这样做,他们都会发现系统非常迟缓)。您能做的最好的就是向系统询问当前登录用户的列表。

相关内容