命令行程序问题 在 sudo 下怎么获取当前用户信息?

2023-12-27 10:41:50 +08:00
 ppllss
在 Windows 下命令行已管理员方式运行是可以拿到当前用户信息的

但是 Linux 下面 以 sudo 的方式运行程序,发现获取当前命令变成了 root

不知道怎么办了。查询无果。用的 go 语言写的
934 次点击
所在节点    程序员
10 条回复
AoEiuV020JP
2023-12-27 11:13:35 +08:00
不太理解,确实如你所说 sudo 运行的程序当前用户就是 root ,这有什么问题吗?
考虑 xy problem ,
非要判断的话可以通过 shell 进程或者 x 进程 UID 判断当前有那些用户是登录状态,
liumory
2023-12-27 12:03:14 +08:00
sudo -E 可以保留当前用户的环境变量。那么是否可以通过环境变量记录当前的用户名,然后再通过 sudo -E 传递给 root 。
export USER_INFO=·whoami·;sudo -E your_program
AoEiuV020JP
2023-12-27 12:13:16 +08:00
试了下可以通过一级一级获取父进程祖父进程直到获取 sudo 前的用户,
正常 linux 环境 sudo 应该都是有效的,主要问题就是层级数量可能不一定,需要遍历判断到 sudo 的父进程,
ppllss
2023-12-27 15:05:46 +08:00
@AoEiuV020JP @liumory


就是想通过 sudo 这样的命令


sudo ./myService

但是程序获取到的 user.Current() 是 root
想获取到当前用户的信息,可行吗?
AoEiuV020JP
2023-12-27 15:19:29 +08:00
@ppllss #4 按 3 楼的办法说不定可以,但习惯上你的程序如果必须 root 权限运行又必须对特定用户有影响,那就应该直接把用户当成参数传进去,不要想歪门邪道去获取非执行者的身份,
参考 passwd 命令,默认是修改当前用户的密码,
sudo passwd 那就是修改 root 用户的密码,而不是修改执行 sudo 前的用户的密码,
要用 roof 权限修改特定用户的密码,那就是 sudo passwd <username>, 把要操作的对象当作参数传入,这就是最普通合适的做法,
AoEiuV020JP
2023-12-27 15:20:36 +08:00
@AoEiuV020JP #5 尖括号被吞了,
要用 roof 权限修改特定用户的密码,那就是 sudo passwd 《 username 》, 把要操作的对象当作参数传入,这就是最普通合适的做法,
AoEiuV020JP
2023-12-27 15:23:55 +08:00
@AoEiuV020JP #6 擦,居然是 v2ex-script 的 bug ,我还以为 v 站吞尖括号了,
AoEiuV020JP
2023-12-27 15:37:48 +08:00
如果确保是直接 sudo 跟上你的程序,要想获取用户信息办法还是有些的,但依然不建议用这些,参数传入是最靠谱的了,
ppllss
2023-12-27 15:59:46 +08:00
@AoEiuV020JP 谢谢了
julyclyde
361 天前
不是应该用 SUDO_USER 吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1003745

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX