我需要在Xcode 4的“运行脚本”构建阶段中使用sudo执行一个命令。然而,编译器报错:
sudo: 没有tty并且没有指定askpass程序
有没有聪明的解决这个问题的方法?
我需要在Xcode 4的“运行脚本”构建阶段中使用sudo执行一个命令。然而,编译器报错:
sudo: 没有tty并且没有指定askpass程序
有没有聪明的解决这个问题的方法?
一个解决方案是将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 /
这显然是一个相当不安全的解决方案,但它确实起作用。
以下是两个尚未提出的想法,这两个想法可能比当前接受的答案更好/更安全:
第一种选择是将需要以root身份运行的脚本部分放入脚本文件(.sh或其他),然后将其设置为root setuid: chmod go-w,+sx scriptfile
,sudo chown root scriptfile
。这意味着该脚本将自动以root身份运行,从而避免了您需要进行身份验证才能运行它(只需更改它)。只要其操作不受用户输入的影响,这应该是非常安全的。(当然,如果您编写一个脚本,该脚本需要输入参数并删除或运行它,或者对其执行任何其他操作,那么这将是不安全的。)
第二种选择是使用AppleScript(可能通过osascript)。 AppleScript允许您使用管理员权限运行shell脚本:do shell script "sudo command goes here" with administrator privileges
,这将弹出一个图形对话框,要求输入密码。
这两个选项中的第一个选项适用于自动化环境,但可能无法很好地处理(例如)被检入SCM或发送给另一个用户的情况。第二个选项在这方面效果更好,但每次都需要输入密码,因此对于自动化构建脚本的效果不佳。
chown
后,当我在 AppCode 中保存我的 shell 文件时,权限会被重置为我的用户。现在我正在使用 ASKPASS 方法。 - vaughankextload
不会加载内核扩展,除非它被chown为root:wheel,并且Xcode无法修改构建产品,除非它未被chown为root:wheel,因此需要在构建之前和之后都作为root运行脚本。 - user2975337system("...")
调用,可能可以从suid二进制文件启动脚本,但这可能无法保留Xcode环境变量。为此,路径限制的sudoers条目可以起作用,但比您的答案不太安全。 - user2975337sudo visudo
youraccountname ALL=(ALL) NOPASSWD: ALL
当然,这样做可能是危险的,所以要小心。在采取这种方法之前,我建议阅读sudoers和visudo的手册页面。
youraccountname ALL=(ALL) NOPASSWD:SETENV: /path/to/script
,这将限制无密码许可到该特定路径,然后在 Xcode 中使用 sudo -E /the/script
传输环境变量(例如 $BUILT_PRODUCTS_DIR
等)。 - user2975337您可以直接以管理员身份运行以下命令(将 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'
经过多次搜索,我找到了以下解决方案。
摘要
你也可以通过从终端使用sudo将项目作为参数提供给XCode来执行它,像这样:
sudo /Developer/Applications/Xcode.app/Contents/MacOS/Xcode /path/to/your/project.xcodeproj
我能想到的最简单的解决方案,但可能存在一些缺点,因为您将以 root 身份执行 XCode。
不需要在任何地方写下你的sudo密码。只需打开终端窗口并输入
$ sudo echo "hello"
输入密码后,它会在一段时间内保持有效 - 不确定多长时间 - 并且由 Xcode 生成的 shell 将继承此权限。
如果您稍后再次收到“没有 tty 存在”的消息,请重复该过程