logname [选项]
| 选项 | 说明 |
|---|---|
--help |
显示帮助信息 |
--version |
显示版本信息 |
基本用法,显示当前用户的登录名:
logname
输出示例:
john
这意味着当前用户是以"john"这个用户名登录的。
在shell脚本中获取当前登录用户名:
#!/bin/bash
# 获取当前登录用户名
CURRENT_USER=$(logname)
echo "当前登录用户是: $CURRENT_USER"
echo "当前脚本执行用户是: $(whoami)"
# 使用登录用户名执行操作
echo "用户 $CURRENT_USER 的主目录是: /home/$CURRENT_USER"
保存为脚本并执行:
chmod +x script.sh
./script.sh
演示logname和whoami命令的区别:
# 正常情况下的输出
logname
whoami
# 使用sudo时观察区别
sudo logname
sudo whoami
在sudo环境下:
logname 返回原始登录用户名whoami 返回当前有效用户(通常是root)在脚本中检查是否以特定用户身份登录:
#!/bin/bash
# 检查是否以root用户登录
if [ "$(logname)" = "root" ]; then
echo "警告:您以root用户直接登录,建议使用普通用户登录后使用sudo"
else
echo "当前登录用户: $(logname)"
echo "可以使用sudo执行特权命令"
fi
# 检查是否允许特定用户执行
ALLOWED_USER="john"
if [ "$(logname)" = "$ALLOWED_USER" ]; then
echo "允许执行此脚本"
else
echo "错误:只允许用户 $ALLOWED_USER 执行此脚本"
exit 1
fi
logname可以与其他命令结合使用:
# 显示登录用户的详细信息
finger $(logname)
# 查看登录用户的进程
ps -u $(logname)
# 查看登录用户的磁盘使用情况
du -sh /home/$(logname)
# 查看登录用户的登录历史
last $(logname)
在自动化部署脚本中确保以正确用户执行:
#!/bin/bash
# 部署脚本示例
DEPLOY_USER="deploy"
# 检查当前登录用户
if [ "$(logname)" != "$DEPLOY_USER" ]; then
echo "错误:此脚本必须由 $DEPLOY_USER 用户执行"
echo "当前登录用户: $(logname)"
echo "请切换到正确用户: sudo su - $DEPLOY_USER"
exit 1
fi
echo "开始部署..."
# 部署代码...
echo "部署完成"
在安全审计脚本中记录真实的操作者:
#!/bin/bash
# 安全审计脚本
AUDIT_LOG="/var/log/audit_actions.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
LOGIN_USER=$(logname)
CURRENT_USER=$(whoami)
# 记录审计信息
echo "[$TIMESTAMP] 登录用户: $LOGIN_USER, 执行用户: $CURRENT_USER, 命令: $@" >> $AUDIT_LOG
# 执行实际命令
"$@"
EXIT_CODE=$?
echo "[$TIMESTAMP] 命令退出代码: $EXIT_CODE" >> $AUDIT_LOG
exit $EXIT_CODE
使用方式:
# 将脚本保存为audit.sh
# 给执行权限
chmod +x audit.sh
# 通过审计脚本执行命令
./audit.sh ls -la
./audit.sh rm important_file.txt
监控系统中不同用户的活动:
#!/bin/bash
# 监控用户活动的脚本
MONITOR_LOG="/var/log/user_monitor.log"
CHECK_INTERVAL=60 # 60秒检查一次
while true; do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
# 获取所有登录用户的活跃进程
for user in $(who | awk '{print $1}' | sort -u); do
PROCESS_COUNT=$(ps -u $user | wc -l)
echo "[$TIMESTAMP] 用户 $user 有 $PROCESS_COUNT 个进程" >> $MONITOR_LOG
done
# 记录当前活动用户
ACTIVE_USER=$(logname)
echo "[$TIMESTAMP] 当前活动登录用户: $ACTIVE_USER" >> $MONITOR_LOG
sleep $CHECK_INTERVAL
done
| 命令 | 功能 | 输出示例 | 特点 |
|---|---|---|---|
logname |
显示登录用户名 | john | 返回原始登录用户名,不受sudo影响 |
whoami |
显示当前有效用户名 | root (使用sudo时) | 返回当前有效的用户名 |
id -un |
显示当前有效用户名 | root | 与whoami类似,但更多用户信息选项 |
who am i |
显示登录会话信息 | john pts/0 2024-03-11 09:30 | 显示完整的登录会话信息 |
echo $USER |
显示环境变量中的用户名 | john | 返回USER环境变量的值,可能被修改 |
echo $LOGNAME |
显示环境变量中的登录名 | john | 返回LOGNAME环境变量的值 |
logname命令的工作原理:
logname命令通过检查/var/run/utmp文件获取登录用户名sudo切换到root,logname仍然返回原始登录用户名这种机制使得logname在需要知道原始登录用户的场景中非常有用。
logname:显示您最初登录时使用的用户名。即使您使用sudo切换到root用户,logname仍然显示您原始的登录用户名。
whoami:显示您当前有效的用户名。如果您使用sudo,whoami将显示"root"。
示例:
# 用户john登录后使用sudo
$ logname
john
$ whoami
root
因此,logname更适合需要知道原始登录用户的场景,而whoami适合需要知道当前权限的场景。
logname命令可能失败的情况:
错误示例:
$ logname
logname: no login name
解决方法:
# 检查utmp文件
ls -l /var/run/utmp
# 尝试其他方法获取用户名
who am i | awk '{print $1}'
# 或
echo $LOGNAME
logname命令:
/var/run/utmp读取登录用户名$LOGNAME环境变量:
示例:
# 修改环境变量
export LOGNAME="fakeuser"
echo $LOGNAME # 输出: fakeuser
logname # 输出: john (原始登录名)
# 重置环境变量
unset LOGNAME
echo $LOGNAME # 输出为空
logname # 输出: john
在安全敏感的脚本中,应该使用logname命令而不是环境变量。
在脚本中安全获取登录用户名的几种方法:
#!/bin/bash
# 方法1:使用logname(最可靠)
LOGIN_USER=$(logname 2>/dev/null || echo "")
# 方法2:如果logname失败,使用who am i
if [ -z "$LOGIN_USER" ]; then
LOGIN_USER=$(who am i | awk '{print $1}')
fi
# 方法3:如果上述方法都失败,使用环境变量(最不可靠)
if [ -z "$LOGIN_USER" ]; then
LOGIN_USER=${LOGNAME:-$(whoami)}
fi
echo "登录用户名: $LOGIN_USER"
# 验证用户是否存在
if id "$LOGIN_USER" &>/dev/null; then
echo "用户 $LOGIN_USER 存在"
else
echo "警告:用户 $LOGIN_USER 不存在"
exit 1
fi
最佳实践:
logname命令logname而不是环境变量logname是否成功执行logname可能不可用,需要备选方案logname记录真实操作者logname而不是其他方法#!/bin/bash
# 示例:最佳实践的脚本
set -e # 遇到错误立即退出
# 获取登录用户名,提供备选方案
get_login_user() {
local user
user=$(logname 2>/dev/null) || \
user=$(who am i 2>/dev/null | awk '{print $1}') || \
user=${LOGNAME:-$(whoami)}
echo "${user:-unknown}"
}
LOGIN_USER=$(get_login_user)
echo "确定的登录用户: $LOGIN_USER"