我需要在Xcode 4的Run Script构建阶段使用sudo在脚本内执行命令。但是,编译器抱怨:
sudo:没有tty存在且没有指定askpass程序
任何人都有这个问题的聪明解决方案吗?
答案 0 :(得分:13)
一种解决方案是将sudo密码放在可执行shell脚本中,如下所示:
#!/bin/bash
echo thesudopassword
此shell脚本可能称为password.sh
然后,设置环境变量SUDO_ASKPASS = password.sh
设置完成后,可以将-A选项传递给sudo。此选项使用ASKPASS程序获取sudo密码。 ASKPASS程序只需要将密码写入stdout。
所以,例如,
sudo -A ditto -V /tmp/testserver.dst /
这显然是一种相当不安全的解决方案,但确实有效。
答案 1 :(得分:6)
尚未提出的两个想法,两者都可能比目前接受的答案更好/更安全:
第一个选项是将需要在root文件中运行的脚本部分放在脚本文件(.sh或其他内容)中,然后将其作为root用户设置为setuid:chmod go-w,+sx scriptfile
,{{1} }。这意味着脚本将自动以root身份运行,这可以避免您需要进行身份验证才能运行它(只是为了更改它)。只要其操作不受用户输入的影响,这应该是非常安全的。 (当然,如果你创建一个带有输入参数的脚本并将其删除或运行它,或者对其进行大部分操作,那么不是安全的。)
第二个选项是使用applescript(可能通过osascript)。 Applescript允许您sudo chown root scriptfile
,它会弹出一个图形对话框,要求输入密码。
这些选项中的第一个对于自动化环境是有益的,尽管它可能不适合(例如)被检入SCM或被发送给另一个用户。第二个选项可以更好地使用它,但每次都需要输入密码,因此对于自动构建脚本不起作用。
答案 2 :(得分:2)
此问题的另一个解决方案是修改sudoers文件并将其添加到其中,并声明永远不会要求您提供sudo密码。要做到这一点非常简单:
运行:
sudo visudo
在“用户权限规范”部分中添加一行类似于
的行youraccountname ALL=(ALL) NOPASSWD: ALL
当然,这可能是一件危险的事情,所以要小心。我建议在走这条路之前阅读sudoers和visudo的手册页。
答案 3 :(得分:0)
经过大量搜索,我发现了以下解决方案。
摘要
答案 4 :(得分:0)
您可以使用以下命令直接以管理员身份运行命令(将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
答案 5 :(得分:-1)
您还可以执行XCode,使用sudo从终端为项目提供参数:
sudo /Developer/Applications/Xcode.app/Contents/MacOS/Xcode /path/to/your/project.xcodeproj
这是我能想到的最简单的解决方案,但可能存在一些缺点,因为您将以root身份执行XCode。
答案 6 :(得分:-4)
无需在任何地方写入您的sudo密码。只需打开终端窗口并输入
即可$ sudo echo "hello"
一旦你输入了你的密码,它会好一段时间 - 不确定多长时间 - 由Xcode产生的shell将继承这个权限。
如果您稍后再次收到“no tty present”消息,请重复该过程