【问题标题】:Run bash script with sudo but create files with user as owner使用 sudo 运行 bash 脚本,但以用户为所有者创建文件
【发布时间】:2016-08-16 14:37:16
【问题描述】:

我有一个 bash 脚本 create-file.sh,它创建了一个名为 a: 的文件

   $ cat create-file.sh
   # /bin/bash
   touch a

当我运行脚本时,它会以我的用户为所有者创建一个文件“a”。

 $ ./create-file.sh
 $ ls -l
 -rw-r--r--  1 shai  wheel  0 Aug 16 17:19 a

但是,当我在 sudo 下运行脚本时,文件是以 root 用户身份创建的:

 $ sudo ./create-file.sh
 $ ls -l
 -rw-r--r--  1 root  wheel  0 Aug 16 17:19 a

有没有办法告诉在 sudo 下运行的脚本以我的用户作为所有者来创建文件?

  • 您可以正确地说涉及单个文件的脚本不需要在 sudo 下运行。这个例子当然是对原始问题的简化,我的脚本有更多并且确实需要在 sudo 下运行,但我仍然希望以我的用户作为所有者来创建文件。

【问题讨论】:

  • 细节很重要——例如,理想的方法可能涉及诸如运行 sudo 脚本作为协同进程的非提升脚本之类的东西。专注于特定解决方案的问题不允许有细致入微、量身定制的答案。
  • 顺便说一句,# /bin/bash 不是#!/bin/bash! 必须是有效的 shebang。
  • @Charles Duffy:当然,#!/bin/bash,我的错。

标签: bash macos sudo


【解决方案1】:

sudo 将原始用户名导出为SUDO_USER;你可以chown那个。

#!/bin/bash
touch a
[[ $SUDO_USER ]] && chown "$SUDO_USER" a

同样,如果您的 sudo 配置允许(默认情况下)root 在没有明确密码提示的情况下将权限授予任何其他用户,您可以利用这一点:

#!/bin/bash

# drop privileges back to non-root user if we got here with sudo
depriv() {
  if [[ $SUDO_USER ]]; then
    sudo -u "$SUDO_USER" -- "$@"
  else
    "$@"
  fi
}

depriv touch a

【讨论】:

  • 谢谢,这看起来是正确的方法。但是,如果我的脚本通过调用其他脚本或 shell 命令创建了许多文件,其中一些文件将无法很好地扩展。我必须提前知道正在创建的每个文件。
  • 如果您希望创建文件的默认所有者不是 euid - 抱歉,这根本不是 UNIX 语义。这就是为什么我建议采用协同处理方法,以保留所有内容的原始 euid,除了您需要提升的脚本的特定部分。..
  • 或者,如果您使用depriv 来包装您的“其他脚本或shell 命令”(从而将权限降回原来的euid),那么您就可以了;这就是我提供它的原因。
  • ...也就是说,depriv something 将以原始用户身份运行 something,而不是 root。
猜你喜欢
  • 2013-05-15
  • 2014-11-05
  • 2012-06-18
  • 2021-03-30
  • 2015-03-24
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多