who am i和whoami区别

who am i 显示的是实际用户ID即用户登陆的时候的用户ID
whoami   显示的是有效用户ID.
但在大多数情况下,实际用户ID和有效用户ID是一致的。
 
login:zhx
Pssword:
$who am i
zhx     pts/0    2007-08-16   13:16   (:0.0)
$whoami
zhx
当切换用户后:
su
Password:
#who am i
zhx     pts/0   007-08-16   13:16  (:0.0)
#whoami
root
 
也可以说who am i  显示的是切换用户前的实际登陆的用户ID,whoami是切换后的有效的用户ID,此时此终端具有切换后用户的访问权限,如本文中切换后则具有超级用户的访问权限。
 


who am i whoami有何区别?

 

首先要说明uideuideffective user id)的区别。uid就是你login的时候使用的id,而euid则是你当前的有效id。因为登录后我们可以使用su切换用户身份,所以uideuid可能是不同的,程序在运行的时候一般看的都是euid,当然也有特出的,who am i就是一个。

举个例子:用户用ABC登陆,使用su变成root,用who am i看到的是ABC,使用whoami命令看到的是root

login: u1

Password:

$ su

Password:

# /usr/ucb/whoami

root

# who am i

u<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="True" sourcevalue="1" unitname="pts">1<span style="mso-spacerun: yes">         </span>pts</chmetcnv>/4        10 31 23:18   (192.168.0.1)

<think>嗯,用户想了解如何在Linux中使用echo命令将HISTSIZEHISTTIMEFORMAT写入/etc/profile,并验证结果。我需要先确认这两个环境变量的作用。HISTSIZE是控制历史命令的数量,HISTTIMEFORMAT设置历史命令的时间格式。用户提到的命令是echo -e 'HISTSIZE=9999\nHISTTIMEFORMAT="`who am i`"' >> /etc/profile,这里可能有问题,因为HISTTIMEFORMAT的值里用了反引号,会立即执行who am i,而不是每次记录命令时动态获取。这可能不符合用户预期,用户可能希望每次记录历史命令时显示当前用户登录信息。 接下来要考虑/etc/profile的修改需要生效的方式,比如source或者重新登录。然后验证时应该检查历史命令是否有时间用户信息。同时需要注意权限问题,普通用户可能没有写/etc/profile的权限,需要用sudo。另外,修改全局配置文件会影响所有用户,是否合适?或者建议用户修改~/.bashrc更合适? 还可能存在语法问题,HISTTIMEFORMAT的值如果包含空格或特殊字符,是否需要转义?使用单引号还是双引号?用户当前的命令用了单引号包裹整个字符串,但里面的HISTTIMEFORMAT值用了双引号,可能没问题,但反引号在单引号中是否会被转义?测试一下,单引号内反引号不会执行,所以实际写入的是`who am i`这个字符串,而不是命令结果。这样HISTTIMEFORMAT会被设置为`who am i`,但Bash在处理HISTTIMEFORMAT时,是否会解析其中的反引号?可能不会,导致时间格式显示为字面的`who am i`,而不是实际用户信息。所以用户可能犯了错误,应该使用双引号或者使用其他方法动态获取信息。 可能的正确做法是让HISTTIMEFORMAT包含whoami或者其他命令,但需要了解HISTTIMEFORMAT是否支持动态更新。实际上,HISTTIMEFORMAT是静态的,每次记录历史时,会使用当前的格式,但里面的命令不会实时执行。例如,使用date命令的格式,如%F %T,但无法动态执行who am i。因此用户的需求可能无法通过HISTTIMEFORMAT实现,只能显示固定的信息,或者每次登录后设置HISTTIMEFORMAT为当前用户信息。 因此,用户的命令可能达不到预期效果,应该指出这个问题,并建议替代方案,比如在/etc/profile中设置HISTTIMEFORMAT为包含时间静态用户信息,或者使用其他机制记录用户登录信息。</think>你的命令验证步骤如下,但需要注意潜在问题改进点: ----- **1. 命令解析:** - `echo -e 'HISTSIZE=9999\nHISTTIMEFORMAT="`who am i`"' >> /etc/profile` - **问题:** 反引号 `who am i` 会立即执行(写入文件时),而非每次记录历史命令时动态获取。 - **结果:** `HISTTIMEFORMAT` 将被固定为执行该命令时的用户登录信息(如 `user! pts/0 2024-06-16 10:00`),后续所有历史记录时间戳都会显示这个固定值。 ----- **2. 生效方法:** ```bash # 方法一:重新登录用户 logout # 或断开当前会话重新SSH连接 # 方法二:立即生效(仅当前终端) source /etc/profile ``` ----- **3. 验证结果:** ```bash # 查看历史记录格式 history ``` - **预期输出:** ``` 1024 2024-06-16 10:00 (user! pts/0) ls 1025 2024-06-16 10:00 (user! pts/0) cd ~ ``` - **实际效果:** 所有历史命令的时间戳会固定显示最初执行 `who am i` 时的信息,无法动态更新。 ----- **4. 改进建议:** - **静态时间 + 用户信息:** ```bash # 使用日期格式,放弃动态 who am i HISTTIMEFORMAT="%F %T " ``` - **动态用户信息:** - 需结合其他机制(如 `PROMPT_COMMAND` 在每次提示符显示时更新变量),但复杂度较高。 ----- **5. 安全提示:** - 修改 `/etc/profile` 需 `sudo` 权限(你的命令未体现,实际应前置 `sudo`)。 - 建议优先修改用户级配置(`~/.bashrc`)避免影响全局。 ----- **总结:** 你的命令能生效但逻辑不符预期,`HISTTIMEFORMAT` 设计为静态时间格式,无法直接实现动态用户信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值