【问题标题】:Change ownership of dir to user when running program in sudo在 sudo 中运行程序时将 dir 的所有权更改为用户
【发布时间】:2020-11-18 13:17:03
【问题描述】:

我有一个程序需要使用sudo 运行。我使用mkdir 创建了一个目录,但该目录的所有者和组设置为root。这是有道理的,因为我使用的是sudo。我想将所有者和组更改为普通用户,但我不知道该怎么做。我认为运行 system("chown $USER:$USER /directory/") 会起作用,但我想因为我在 sudo 中,它只会设置为 root。我正在考虑使用chown,但我不确定我应该如何获取所有者和组 ID。此外,它的便携性也很好,所以我不想只是硬编码用户/组 ID。

【问题讨论】:

  • 当您执行 sudo 时,您的 sudo 会话中有此变量 $SUDO_USER
  • 那行得通。谢谢@Philippe

标签: c linux ubuntu directory permissions


【解决方案1】:

您已经走在正确的道路上,chown 是您要在此处查找的命令。

您可以将要创建的两个命令串在一起,然后使用分号一起拥有该目录。

sudo mkdir 测试; sudo chown $USER:$USER 测试

我已经在 ubuntu 18.04 和 ubuntu 20.04 上测试过了,因为那是你的标签。 $USER 变量解析为您最初登录的用户,而不是 root,只要您在上述命令的开头使用它即可。请注意,在执行 chown 部分时,您需要再次调用 sudo ;结束 sudo 提升。

【讨论】:

  • 对不起。我为 mkdir 链接了错误的东西。我正在使用函数 mkdir(const char *, mode_t) (有问题的链接已更新)。所以我尝试使用 mkdir() 函数,然后运行`system("sudo chown $USER:$USER /home/user/Desktop/data//p/")。但是当我执行 ls -lh 时,我将用户和组视为 root。
  • 事实上,@Philippe 关于使用 $SUDO_USER 是正确的
【解决方案2】:

coreutils 包包含一个有用的小命令 install,您可以在 sudo 上下文中使用它来代替 mkdir。例如,

sudo install -o USER -g GROUP -m MODE -d DIRECTORY

其中USER 是拥有DIRECTORY 目录的用户,GROUP 是拥有该目录的组,MODE 是对该目录的访问模式(如chmod)。

因为system(COMMAND)popen(COMMAND,...)实际上以-cCOMMAND为参数运行/bin/sh,所以可以使用形式

sudo install -o $(id -u) -g $(id -g) -m u=rwx,g=r-x,o=x DIRECTORY

shell 在执行 sudo 之前替换用户名和组名(或者更确切地说是数字,因为我没有使用 -n 选项)。 (id 命令也包含在 coreutils 中,因此您绝对可以期望 installid 在所有成熟的 Linux 机器上都可用;甚至在大多数嵌入式系统上。这是所有包管理器等其他用于安装文件,你看。)

以上,我以模式u=rwx,g=r-x,o=x(相当于0751)为例;它将模式设置为rwxr-x--x,即授予所有人访问权限,所有者用户和组能够列出目录内容,并且只有所有者用户能够在其中创建新文件或目录。

【讨论】:

    猜你喜欢
    • 2011-04-18
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多