【问题标题】:When executing python script, How to find username from which sudo is executed?执行python脚本时,如何找到执行sudo的用户名?
【发布时间】:2019-05-02 06:43:11
【问题描述】:

我正在编写将在不同机器上运行的代码。 在代码内部,需要将日志文件创建为"/tmp/2019-05-02/log_file",即为每天创建一个子目录,然后在新文件夹中创建日志文件。出于这个原因,在“/tmp”目录中创建目录我需要运行我的代码

sudo python /path/to/code.py

稍后在相同的代码中,我需要在 "Documents" 中为每一天创建另一个目录。这个新创建的目录的所有者是 root,因为我的代码是作为 sudo 运行的。 当我想从 UI 应用程序中删除 Documents 中这个新创建的子目录时,真正的问题出现了:Files。

所以我所做的是更改了目录权限。这样我就可以毫无问题地删除这个文件夹。

os.chmod("/path/to/directory/inside/Documents", 0747)

但现在当我ls进入文档时。这些新创建的文件夹显示为带有绿色背景的蓝色文本 |表示目录可由拥有用户和组以外的其他人写入,并且没有设置粘性位 (o+w, -t)。

有什么方法可以使 /tmp/2019-05-2 中创建的文件夹的所有者是 root 并且在 Documents 中创建的文件夹归普通用户所有(从该用户我以 sudo 执行程序)。

在我的机器中,用户是 dell。因为我知道我的用户名,所以我可以在我的机器中使用 chown 更改所有者。但即使代码在不同用户名的不同机器上执行,我也需要更改所有者。

【问题讨论】:

  • 查看示例 here 他们展示了 setuid 脚本如何返回到原始用户的 ID。
  • 试试看:print(os.getenv("SUDO_USER"))
  • 我认为你不需要运行 sudo 在 /tmp 中创建目录。
  • @kantal print(os.getenv("SUDO_USER")) 它有效。谢谢。我运行 sudo 因为我使用 os.makedirs() 在 /tmp 下创建多个目录,就像在 /tmp/1/2/3 中一样。
  • @kantal os.getenv("SUDO_USER") 当我以非 sudo 运行时返回无。 os.getlogin() 无论如何都返回关联的登录名。

标签: python operating-system chown


【解决方案1】:

恕我直言,最可靠的方法是使用os.getlogin()。它返回与 session 关联的登录名,并且只能通过 setlogin 系统调用来更改,这在普通程序中很少使用 (ref.)。

Python 手册说:

在大多数情况下,使用环境变量 LOGNAME 或 USERNAME 来找出用户是谁会更有用...

但 unix 手册页解释了背后的基本原理:

...这更灵活,正是因为用户可以任意设置LOGNAME。

【讨论】:

  • 如果用户使用su 而不是sudo 怎么办?
  • os.getlogin() 在这种情况下也会返回预期结果。
猜你喜欢
  • 1970-01-01
  • 2011-11-24
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
相关资源
最近更新 更多