【问题标题】:How to use sudo inside of a Run Script build phase in Xcode 4?如何在 Xcode 4 的运行脚本构建阶段中使用 sudo?
【发布时间】:2011-10-11 19:29:46
【问题描述】:

我需要在 Xcode 4 的运行脚本构建阶段使用 sudo 在脚本内执行命令。但是,编译器抱怨:

sudo:不存在 tty,也没有指定 askpass 程序

谁有解决这个问题的聪明办法?

【问题讨论】:

  • 我建议说明您使用 sudo 访问权限来做什么。这可能会开辟更广泛的选择。
  • 将文件从一个位置复制到另一个位置,并且需要使用 root 访问权限。
  • 我有同样的问题,我已经为该脚本设置了 ALL=NOPASSWD。事实上,如果我从控制台执行它,它不会要求输入密码

标签: xcode build xcode4 sudo


【解决方案1】:

一种解决方案是将 sudo 密码放在可执行的 shell 脚本中,如下所示:

#!/bin/bash
echo thesudopassword

这个shell脚本可能被称为password.sh

然后,设置环境变量 SUDO_ASKPASS=password.sh

设置完成后,可以将 -A 选项传递给 sudo。此选项使用 ASKPASS 程序来获取 sudo 密码。 ASKPASS 程序只需将密码写入标准输出即可。

例如,

sudo -A ditto -V /tmp/testserver.dst /

这显然是一个相当不安全的解决方案,但它确实有效。

【讨论】:

    【解决方案2】:

    尚未提出的两个想法,这两个想法都可能比当前接受的答案更好/更安全:

    第一个选项是将需要以 root 身份运行的脚本部分放入脚本文件(.sh 或其他文件)中,然后将其设置为 root:chmod go-w,+sx scriptfile、sudo chown root scriptfile。这意味着脚本将自动以 root 身份运行,这避免了您需要进行身份验证才能运行它(只是为了更改它)。只要它的操作不受用户输入的影响,这应该是相当安全的。 (当然,如果您编写的脚本接受输入参数并删除或运行它,或者使用它执行大多数其他操作,那么 不 是安全的。)

    第二个选项是使用 applescript(可能通过 osascript)。 Applescript 允许您do shell script "sudo command goes here" with administrator privileges,这将弹出一个图形对话框询问密码。

    第一个选项适用于自动化环境,但它可能无法很好地处理(例如)被检入 SCM 或发送给其他用户的情况。第二个选项会更好地使用它,但每次都需要输入密码,因此对于自动构建脚本来说效果不佳。

    【讨论】:

    • 将 uid 设置为 root 是个好主意。我不太确定我喜欢applescript的答案。我最不想做的就是每次需要构建时都被要求输入密码。
    • @ericgorr 是的,尽管有人可能希望您通常不需要 root 来进行普通构建(因为大多数测试应该能够在您的主目录中完成),但只是偶尔测试一下安装在系统位置或类似位置时是否可以正常工作。当然,我不知道你在这里做什么。
    • chowning 之后,在 AppCode 中保存我的 shell 文件时,权限被重置给我的用户。我现在正在使用 ASKPASS 方法。
    • @articmac,例如在 El Capitan 中(至少)kextload 不会加载内核扩展,除非它是 chown'd root:wheel,并且 Xcode 不能修改构建产品,除非它是 not chown'd root:wheel,所以在构建前和构建后都需要以 root 身份运行脚本。
    • 不幸的是在 El Capitan 中不起作用(没有 suid shell 脚本)。如果脚本不适合 system("...") 调用,可能会从 suid 二进制文件启动脚本,但这可能不会保留 Xcode 环境变量。为此,受路径限制的 sudoers 条目有效,但不如您的答案安全
    【解决方案3】:

    此问题的另一个解决方案是修改 sudoers 文件并将您的帐户添加到其中,并声明您永远不应该被要求输入 sudo 密码。要做到这一点相当简单:

    运行:

    sudo visudo
    

    在“用户权限说明”部分添加如下所示的一行

    youraccountname ALL=(ALL) NOPASSWD: ALL
    

    当然,这样做可能很危险,所以要小心。我建议在走这条路线之前阅读 sudoers 和 visudo 的手册页。

    【讨论】:

    • 最好使用youraccountname ALL=(ALL) NOPASSWD:SETENV: /path/to/script,它将无密码允许限制在该特定路径,然后在Xcode中使用sudo -E /the/script传输环境变量(例如$BUILT_PRODUCTS_DIR等) )
    【解决方案4】:

    经过大量搜索,我找到了以下解决方案。

    https://forum.juce.com/t/build-script-for-automatically-moving-built-aus-into-components-folder-xcode/13112

    总结

    1. 创建钥匙串并将您的管理员密码存储在钥匙串中
    2. 创建一个使用 /usr/bin/security 访问密码的脚本 在你的运行脚本中,
    3. 设置 ASK_PASS 环境变量并将 -A 选项与 sudo 一起使用

    【讨论】:

      【解决方案5】:

      您可以使用以下命令直接以管理员身份运行命令(将 echo YourCommandHere > /tmp/hello 更改为您的命令):

      osascript -e 'do shell script "sudo echo YourCommandHere > /tmp/hello " with administrator privileges'
      

      或使用以下命令在源目录中运行脚本:

      osascript -e 'do shell script "bash -x $SOURCE_ROOT/MyAdminScript.sh 1>/tmp/build-log 2>/tmp/build-log.err" with administrator privileges'
      

      这会运行脚本并将其输出记录到 /tmp/build-log 和 /tmp/build-log.err

      有关脚本中有用的变量,请参阅https://help.apple.com/xcode/mac/8.0/#/itcaec37c2a6

      【讨论】:

        【解决方案6】:

        您也可以使用 sudo 从终端执行 XCode,将项目作为参数提供给它,如下所示:

        sudo /Developer/Applications/Xcode.app/Contents/MacOS/Xcode /path/to/your/project.xcodeproj
        

        这是我能想到的最简单的解决方案,但可能存在一些缺点,因为您将以 root 身份执行 XCode。

        【讨论】:

        • 呃。从技术上讲,这是可行的,但我建议不要这样做,特别是考虑到 Xcode 4 有多么错误(基于它崩溃的频率……想象一下它可能对 root 权限造成的破坏)。
        • 这会影响未来对项目的任何更改,因为此后您总是必须以 root 身份运行 Xcode。
        【解决方案7】:

        无需在任何地方写下您的 sudo 密码。只需打开一个终端窗口并输入

        $ sudo echo "hello"
        

        一旦你输入了你的密码,它会持续一段时间——不确定多久——Xcode生成的shell会继承这个权限。

        如果您稍后再次收到“不存在”消息,只需重复该过程

        【讨论】:

        • 有效,但在自动化环境中没有用。
        猜你喜欢
        • 2011-10-26
        • 2010-11-24
        • 2020-09-04
        • 2015-11-26
        • 2010-11-23
        • 2015-01-18
        • 2016-09-22
        • 2017-01-30
        • 1970-01-01
        相关资源
        最近更新 更多