Буквально только что задался примитивным вопросом — как и чем открыть файл /etc/hosts из командной строки Mac OS? Речь не о консольных программах, а о графических (GUI) приложениях. Сперва казалось, то все довольно просто.
Первый и самый простой вариант — воспользоваться командой open с ключами -t или -e, в первом случае файл откроется в редакторе по-умолчанию, во втором — в TextEdit.app.
~$ open -t /etc/hosts
~$ open -e /etc/hosts
Вообще, команда довольно универсальная, ей можно открыть локальный файл, папку, http ссылку, приложение и т.п. Наберите man open в Терминале — там много интересного. Этой же командой для моих целей можно воспользоваться иначе.
~$ open /Applications/TextEdit.app /etc/hosts
Результат будет тот же самый, причем не совсем тот, который требовался — TextEdit будет открыт от имени простого пользователя, у которого по-умолчанию нет прав на запись /etc/hosts. Забыл про sudo?
~$ sudo open /Applications/TextEdit.app /etc/hosts
Password:
Ввожу пароль, пытаюсь сохранить файл — по-прежнему не удается. То есть посмотреть файл можно, а изменить и записать — нет, в TextEdit не предусмотрен запрос пароля супер-юзера в случае отсутствия необходимых прав.
Проблема в том, что sudo выполняет с правами root команду open, а та запускает TextEdit уже с правами текущего пользователя, у которого не хватает прав. Обойти эту особенность не удастся, только если открыть файл, сохранить на рабочий стол, а затем перенести в нужную папку, авторизовавшись в Finder — слишком много суеты.
Способ запустить TextEdit (или любое другое приложение) с правами администратора все-таки есть, хотя и не сильно простой.
~$ sudo -b /Applications/TextEdit.app/Contents/MacOS/TextEdit /etc/hosts
Теперь процесс TextEdit действительно запущен с правами пользователя root, алилуйя. Обратите внимание на ключ -b, он запускает приложение «в фоне», иначе консоль будет ждать до закрытия приложения, причем нажав ctrl-c его можно принудительно и мгновенно закрыть.
Длинноватая команда вышла. Решение есть и на этот случай — можно сделать скрипт, который будет искать приложение по имени и запускать его с помощью sudo.
#!/bin/bash
if [ $# -lt 1 ]
then
me=`basename $0`
echo "Usage: $me [OSX Application]"
exit
fi
myPath=/Applications:/Applications/Utilities:/Developer/Applications:$PATH
myPath=\"`echo $myPath | sed 's/:/" "/g'`\"
# Check our custom path and execute the first match
for thisPath in $myPath
do
thisPath="`echo $thisPath | sed 's/\"//g'`"
app=$thisPath/$1.app/Contents/MacOS/$1
if [ -x "$app" ]
then
# We found it!
shift
sudo -b "$app" $*
exit
fi
done
# We didn't find anything.
echo 'Sorry, application not found.'
Автор скрипта назвал его sopen, файл сохранил в /usr/local/bin, далее надо сделать его выполняемым и множно пользоваться.
~$ chmod -x /usr/local/bin/sopen
~$ sopen TextEdit /etc/hosts
Вся эта суета совершенно не нужна для редактирования небольших файлов, типа того же /etc/hosts, для этого в Mac OS есть чудесный консольный редактор nano.
~$ sudo nano /etc/hosts
Для больших файлов (логи, дампы SQL и т.п.) я пользуюсь редактором TextMate, у которого имеется консольная «запускалка» по имени mate. Она тоже не умеет передавать привелегии редактору, но TextMate при сохранении не ленится спросить пароль.
не могу прописать пароль, просто тупо не пишется и не вставляется.
т.е. строку: sudo /Applications/TextEdit.app/Contents/MacOS/TextEdit /etc/hosts
набираю, потом энтер, появляется password: …. и ничего не пишется
что нужно сделать?
Ввести пароль, нажать ввод, наверно. Это тот же sudo и работает так же.