Как использовать sudo внутри этапа сборки Script в Xcode 4?
Мне нужно использовать команду внутри script на этапе сборки script в Xcode 4 с использованием sudo. Однако компилятор жалуется:
sudo: нет tty присутствует и не указана запрошенная программа
У кого-нибудь есть умное решение этой проблемы?
Ответы
Ответ 1
Одним из решений является поместить пароль sudo в исполняемую оболочку script следующим образом:
#!/bin/bash
echo thesudopassword
Эта оболочка script может быть вызвана password.sh
Затем настройте переменную окружения SUDO_ASKPASS = password.sh
Как только это будет установлено, опция -A может быть передана sudo. Эта опция использует программу ASKPASS для получения пароля sudo. Программе ASKPASS нужно только написать пароль для стандартного вывода.
Итак, например,
sudo -A ditto -V /tmp/testserver.dst /
Это, очевидно, довольно небезопасное решение, но оно работает.
Ответ 2
Две идеи, которые еще не были предложены, обе из них, вероятно, лучше/безопаснее, чем принятый в настоящее время ответ:
Первый вариант состоит в том, чтобы поместить часть script, которая должна быть запущена как root в файле script (.sh или что-то еще), а затем сделать его setuid как root: chmod go-w,+sx scriptfile
, sudo chown root scriptfile
. Это означает, что script будет автоматически запускаться с правами администратора, что позволит избежать необходимости аутентификации для его запуска (просто для его изменения). До тех пор, пока его работа не подлежит пользовательскому вводу, это должно быть совершенно безопасным. (Конечно, если вы создаете script, который принимает входной аргумент и удаляет его или запускает, или делает что-то еще с ним, это небезопасно.)
Второй вариант - использовать applescript (возможно, через osascript). Applescript позволяет вам do shell script "sudo command goes here" with administrator privileges
, в котором появится диалоговое окно с запросом пароля.
Первый из этих вариантов был бы хорош для автоматизированной среды, хотя, возможно, это не сработало бы (например), который был бы проверен в SCM или отправлен другому пользователю. Второй вариант будет работать лучше, но требует ввода пароля каждый раз, поэтому не работает также для автоматической сборки script.
Ответ 3
Еще одно решение этой проблемы - изменить файл sudoers и добавить к нему свою учетную запись и указать, что вам никогда не следует запрашивать пароль sudo. Для этого достаточно просто:
run:
sudo visudo
В разделе спецификации привилегий пользователя добавьте строку, которая выглядит как
youraccountname ALL=(ALL) NOPASSWD: ALL
Конечно, это может быть опасно, поэтому будьте осторожны. Я бы посоветовал прочесть man-страницу для sudoers и visudo, прежде чем идти по этому маршруту.
Ответ 4
После долгих поисков я нашел следующее решение.
https://forum.juce.com/t/build-script-for-Automatically-moving-built-Aus-into-components-folder-xcode/13112
Резюме
- Создайте связку ключей и сохраните пароль администратора в связке ключей.
- Создайте сценарий, который использует /usr/bin/security для доступа к паролю. В вашем сценарии запуска
- Установите переменную enk 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
Вы также можете выполнить XCode, предоставляя ему проект в качестве параметра из терминала с помощью sudo, как это:
sudo /Developer/Applications/Xcode.app/Contents/MacOS/Xcode /path/to/your/project.xcodeproj
Это самое легкое решение, о котором я мог думать, но могут быть некоторые недостатки, поскольку вы выполняете XCode как root.
Ответ 7
Не нужно писать свой пароль sudo в любом месте. Просто откройте окно терминала и введите
$ sudo echo "hello"
Как только вы набрали пароль, это будет хорошо на некоторое время - не уверен, как долго - и оболочка, порожденная Xcode, наследует это разрешение.
Если вы снова получите сообщение "no tty present", просто повторите процедуру