2011-07-23 46 views
14

我需要在使用sudo的Xcode 4中的运行脚本构建阶段的脚本中执行命令。然而,编译器会抱怨:如何在Xcode 4的Run Script构建阶段内使用sudo?

须藤:不存在TTY并没有askpass程序指定

任何人有这个问题的聪明的解决方案?

+0

我建议说明你在使用sudo access做什么。这可能会开辟更广泛的替代品。 –

+0

将文件从一个位置复制到另一个位置,需要使用root访问权限才能完成。 – ericg

+0

我有同样的问题,我已经为该脚本设置了ALL = NOPASSWD。事实上,如果我从控制台执行它,它不会要求密码 – hithwen

回答

11

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

#!/bin/bash 
echo thesudopassword 

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

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

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

因此,例如,

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

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

+10

至少让它只有你可读! 'chmod 600 ' –

-1

你也可以执行的XCode使用sudo这样给它的项目从终端参数:

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

这是我能想到的最简单的方法,但可能会有一些缺点,因为你会以root身份执行XCode。

+2

呃。从技术上讲,这是有效的,但我建议不要这样做,尤其是考虑Xcode 4的错误(基于它崩溃的频率......想象它可能会因root权限而造成的破坏)。 – Richard

+1

由于您总是必须以root身份运行Xcode,因此这会影响项目的未来更改。 – mydogisbox

-4

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

$ sudo echo "hello" 

一旦你输入的密码,这将是好一会儿 - 不知过了多久 - 由Xcode中催生了壳将继承此权限。

如果再次获得“无TTY本”的消息后,重复刚才的步骤

+2

有效,但在自动化环境中无用。 – Jasarien

2

这个问题的另一种解决方案是修改sudoers文件和您的帐户添加到它,说明你不应该问sudo密码。要做到这一点是非常简单的:

运行:

sudo visudo 

在用户权限说明部分中添加一行看起来

youraccountname ALL=(ALL) NOPASSWD: ALL 

当然,这可能是做危险的事,所以要小心。我建议在走这条路线之前阅读sudoers和visudo的手册页。还没有被建议尚未

+1

最好使用'youraccountname ALL =(ALL)NOPASSWD:SETENV:/ path/to/script',它将无密码限制限制到特定路径,然后使用'sudo -E/the/script' Xcode传输环境变量(例如'$ BUILT_PRODUCTS_DIR'等) – jrodatus

6

两个想法,这两者都可能比目前公认的答案更好/更安全:

第一种选择将是把需要以root身份运行该脚本的一部分在脚本文件(。sh或者其他东西),然后以root身份setuid:chmod go-w,+sx scriptfile,sudo chown root scriptfile。这意味着脚本将以root身份自动运行,这可以避免您需要进行身份验证才能运行它(只是为了更改它)。只要其操作不受用户输入限制,这应该是相当安全的。 (当然,如果你犯了一个脚本,需要一个输入参数,并将其删除或运行它,或做了大部分别的吧,那会是安全的。)

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

这些选项中的第一个对于自动化环境很有用,但它可能无法很好地处理(例如)签入SCM或发送给其他用户。第二种方法可以更好地工作,但每次都需要密码输入,所以对于自动构建脚本来说也不行。

+1

将uid设置为root是个好主意。我不太确定我喜欢苹果的答案。关于我想要的最后一件事是每次需要构建时都要求输入密码。 – ericg

+0

@ericgorr诚然,虽然人们可能希望你通常不需要root用于你的一般构建(因为大多数测试应该可以在你的主目录中完成),但是偶尔会安装在系统位置或类似环境中时可以正常工作的测试。当然,我不知道你在这里做什么。 – arcticmac

+0

其实,我确实需要每个版本的root ... – ericg