JustPaste.it

Хакер - Кунг-фу для маковода. Изучаем уникальные утилиты командной строки macOS

nopaywall

https://t.me/nopaywall

Содержание статьи

Знание утилит, которые помогают работать с системой, — это, считай, гиковский аналог владения боевым искусством. В прошлой статье я собрал советы по настройке скрытых параметров и выбору программ для macOS, а в этой мы пойдем глубже и познакомимся с утилитами командной строки, большая часть которых уникальна для «мака». Одни помогут в диагностике системы, другие пригодятся при написании скриптов, третьи облегчат работу с терминалом.
 

Настройка системы

 

Смотрим и (не) меняем параметры ядра

Команда sysctl относится скорее к древней магии Unix, чем к macOS. Она отвечает за вывод и изменение параметров ядра. Набрав sysctl -ah, ты увидишь более 1200 переменных. Считать одно значение можно, если ввести после команды его название, а с ключом -n будет выведено только значение. Например, команда sysctl -n machdep.cpu.brand_stringвыдает модель процессора.

И это только самый-самый конец списка И это только самый-самый конец списка

Менять параметры можно, вводя команды вида sysctl kern.maxprocperuid=1000 (эта команда ограничит тысячей максимальное количество процессов, запущенных от одного пользователя), но, если не знаешь, что делаешь, рекомендую не баловаться с рабочей системой. В man ты найдешь таблицу, где перечислены основные параметры. Также мне попадалась интересная статья, в которой автор пишет обертку для sysctl на Swift.

 

info-icon.jpg

INFO

По каждой утилите есть подробнейшая справка в man. Тебе нужны версии из разделов (1) или (8) для использования из командной строки и (3) — для вызова в качестве функций. Кстати, man удобно читать, если написать название команды в поисковой строке Help в стандартном «Терминале», — вывод man откроется в новом окне с приятным желтым фоном.

 

Запускаем всё на свете

Если ты достаточно долго имел дело с «маками», то наверняка сталкивался с launchctl. Это интерфейс к системе launchd, которая начиная с Mac OS X 10.4 (Tiger) пришла на смену длинному списку утилит, позаимствованных из FreeBSD (среди них — init, rc, cron и другие). Примечательно, что launchd теперь есть и в BSD, а для Linux был разработан схожий лаунчер — systemd, который вошел во многие современные дистрибутивы.

На первый взгляд launchd делает очень простую вещь — запускает и останавливает процессы, руководствуясь условиями, описанными в конфигурационных файлах. Ты найдешь их в ~/Library/LaunchAgents, /Library/LaunchAgents и /Library/LaunchDaemons(такие же папки есть в /System/Library/, скрипты в них отвечают за работу частей самой macOS). Отличие демонов от агентов в том, что демоны запускаются от имени системы, а агенты — от имени пользователя.

В перечисленных папках лежат файлы .plist — то есть XML с описаниями условий запуска. Эти условия могут быть очень разными, что делает launchd крайне гибкой системой. Например, процессы можно запускать и останавливать по времени подобно cron, при определенных изменениях в файловой системе (например, когда в каталоге появляется новый файл или когда монтируется носитель), в ответ на сетевой вызов и так далее.

При помощи launchtl enable <название_сервиса> и launchtl disable <название_сервиса> ты можешь активировать и деактивировать запуск системных или собственных скриптов. В руководствах также попадается старый вариант — load и unload, он тоже работает. Еще полезно знать о командах launchctl list (вывод названий всех сервисов) и launchctl kickstart — немедленный запуск, независимо от настроек.

Подробнее о launchd читай в официальной документации, на сайте launchd.info или вкратце — в блоге Пола Ансли. Для создания конфигурационных файлов есть пара графических оболочек — LaunchControl и Lingon (обе платные). Еще есть утилита командной строки lunchy, которая слегка упрощает управление.

Если тебе лень ковыряться со всем этим добром, можешь использовать старый добрый cron. Занятный факт: когда ты создашь файл crontab командой crontab -e, launchd запустит cron как сервис.

 

Работаем с Gatekeeper

Буквы sp в названии утилиты spctl происходят от слов system policy. Это интерфейс командной строки для Gatekeeper, механизма, который изо всех сил мешает запускать неподписанные приложения. Этим он спасает от шифровальщиков неопытных пользователей и, увы, немало раздражает опытных.

Чтобы посмотреть, работает ли Gatekeeper, пиши spctl --status, пафосный ответ assessments enabled будет означать, что все под контролем. Если думаешь, что пора ослабить гайки, пиши sudo spctl --master-disable, и Gatekeeper отключится. Когда закончишь с экспериментами, рекомендую вернуть все как было — для этого замени параметр на --master-enable.

Посмотреть список разрешенных приложений можешь командой spctl --list, а чтобы не листать стену текста и видеть только то, что сам разрешил в диалоговом окне, можешь пофильтровать по отсутствию метки: spctl --list | grep UNLABELED.

Собственно, для ручного добавления приложений в список существует хитрая двухступенчатая схема с метками. Сначала добавляешь приложение и задаешь ему метку:

spctl --add --label "Approved" <файл приложения>

А затем разрешаешь все приложения с этой меткой:

spctl --enable --label "Approved"

После этого можно добавлять метки к новым программам, и они автоматически будут занесены в белый список. Точно так же можно разом отозвать разрешение. Подробнее об этом читай на сайте The Instructional, откуда я брал примеры.

 

Меняем файлы конфигурации

Об утилите defaults я подробно писал в статье «Обвес macOS». Если вкратце, то она отвечает за чтение и изменение конфигурационных файлов, которые лежат в папках Preferences в системной, общей и частных Library.

С точки зрения defaults настройки разделены на домены — посмотреть их список ты можешь командой defaults domains, а вывести переменные в домене — defaults read <название_домена>. Значения переменных можно менять командой

defaults write <домен> <переменная> -<тип> <значение>

Примеры переменных опять же смотри в прошлой статье или в коллекции Кевина Саттла, на которую я уже не раз ссылался.

 

Настраиваем основные параметры системы

Утилита systemsetup предназначена для настройки самых базовых вещей вроде даты и времени или таймера режима сна. Если вызывать systemsetup без параметров, то она войдет в интерактивный режим. Ничего особенно полезного здесь нет. Отдельного упоминания заслуживает разве что параметр для активации демона SSH:

sudo systemsetup -setremotelogin on

А еще systemsetup побеждает в номинации «самый длинный параметр» — это -setdisablekeyboardwhenenclosurelockisengaged, он разрешает блокировать клавиатуру сервера, когда тот находится в стойке. А что, не так уж сложно запомнить!

 

Задаем сетевые настройки

В паре с systemsetup идет networksetup, менеджер сетевых настроек. Интерактивного режима у него нет, поскольку для пользователя он не несет никакой ценности: все то же самое можно настроить в разделе «Сеть» из «Системных настроек». Зато дергать networksetup из скриптов или удаленно — самое то. Например, команда networksetup -listnetworkserviceorder выведет список конфигураций. Да, похоже, параметры придумывал тот же весельчак, что поработал над systemsetup.

Кстати, за выбор конфигурации отвечает другая утилита — scselect. Без параметров она выведет список, а для выбора можно после scselect задать метку или номер из предоставленного списка.

 

Управляем Wi-Fi

Команду airport можно по праву считать секретной — если ты попытаешься просто вызвать ее из терминала, то ничего не выйдет. Дело в том, что она скрыта глубоко в системе, и сначала нужно вытащить ее на свет божий. Сделать это можно командой

sudo ln -s /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport /usr/local/bin/airport

Теперь ты можешь в любой момент набрать airport -s, и встроенный адаптер Wi-Fi проведет быстрое сканирование и выдаст список сетей с указанием BSSID, способа шифрования и прочих характеристик. Подробности о текущем подключении ты можешь узнать, набрав airport -I, а sudo airport -z разорвет его.

 

Сбор диагностики

 

Смотрим полную сводку о компьютере и программах

Если в меню «Яблоко» выбрать пункт «Об этом Mac», а затем нажать на кнопку «Системный отчет», то ты увидишь кучу всякой информации о компьютере. Так вот, утилита system_profiler — это то же самое, но в сто раз подробнее. Если вызвать system_profilerбез параметров, то информация будет выведена целиком, что в моем случае означает 3,8 Мбайт текста. Так что рекомендую сразу писать что-нибудь вроде system_profiler > ~/Desktop/profile.txt или использовать grep для поиска нужной строки.

Среди того, что выплюнет system_profiler, ты найдешь информацию не только о системе и устройствах, но и обо всех программах, драйверах, плагинах, библиотеках и шрифтах. Заодно будут выведены части системных логов и еще куча всякой лабуды. Если все это тебя не интересует, пиши system_profiler -detailLevel mini, и тогда получишь только сведения о компьютере. Еще можно добавить параметр -xml, чтобы было удобнее обрабатывать полученную информацию в скрипте.

 

Обращаемся к службе каталогов

За общение со службой каталогов отвечает утилита dscl — Directory Services Command Line, она в свое время пришла на смену netinfo. Повеяло сисадминскими штучками? Так и есть, и подробно останавливаться на них мы не будем. Для затравки пара команд: dscl . -list /Users выведет список всех пользователей, а dscl . -read /Users/<имя пользователя> — информацию о пользователе в виде XML. Внутри закодирован даже файл с аватаркой! Кстати, если запустить dscl без параметров, то она войдет в интерактивный режим, где ты можешь использовать привычные команды cd и ls для навигации, а смотреть содержимое веток — командой read.

 

Рулим кешами Directory Services и смотрим список пользователей

К dscl прилагается еще одна утилитка — dscacheutil, она отвечает за работу с кешами службы каталогов. Скорее всего, она известна тебе намного лучше, чем dscl, поскольку долгое время именно ее нужно было запускать для сброса кеша DNS. Кстати, в последних версиях macOS это не работает, и вместо dscacheutil -flushcache теперь нужно писать killall -HUP mDNSResponder.

Что до dscacheutil, то ее удобно использовать, чтобы выводить список пользователей: dscacheutil -q user. В отличие от того, что выдает dscl, результат воспринимать намного легче.

 

Читаем и (не) сбрасываем значения в NVRAM

У каждого «мака» есть энергонезависимая память, в которой хранятся важные для работы компьютера переменные. Что именно там лежит? Узнать поможет команда nvram: напиши nvram -xp, и все увидишь. Здесь есть как безобидные вещи вроде уровня звука и последней раскладки клавиатуры, так и более интересные вроде ключа Find My Mac и совсем уж загадочные параметры EFI. Все они представлены в двоичном виде, и единственный обрывок описания, который мне удалось найти, содержится в утекшем и выложенном на WikiLeaksдокументе ЦРУ.

Параметры можно задавать командой nvram <переменная>=<значение>, удалять командой nvram -d <переменная> или загружать из файла при помощи nvram -f <файл>. Сбросить все можно, набрав nvram -c. Но обычно параметры NVRAM сбрасывают, только если что-то пошло не так и компьютер не загружается. Для этого нужно нажать Alt-Cmd-P-R сразу после включения и держать 20 с.

Обрати внимание: если меняешь параметры утилитой nvram, то они запишутся в энергонезависимую память не моментально, а лишь при выключении компьютера в штатном режиме.

 

Изучаем статистику оперативной памяти

Существует масса способов посмотреть, насколько загружена оперативная память. Пожалуй, самый простой — это открыть раздел «Память» в «Мониторинге системы»: там в наглядном виде представлены самые полезные параметры. Из командной строки лучше всего использовать top.

Если же тебе нужна самая подробная информация, то ты можешь обратиться к vm_stat. Недостаток этой утилиты — в том, что все значения приводятся в страницах, равных 4 Кбайт. Однако пересчитать не так сложно, и в интернете есть масса скриптов — например, вот этот однострочник на Perl пересчитывает все в мегабайты.

Еще с помощью vm_stat можно отслеживать изменение загрузки памяти со временем. Для этого пиши vm_stat -c <число> <секунды>, где первый параметр — количество замеров, а второй — интервал между ними.

 

Сбрасываем дисковый кеш в памяти

Временно получить пару лишних гигабайтов оперативной памяти помогает команда purge. Она вызывается от рута, не имеет никаких параметров и обнуляет дисковый кеш, приводя его в то состояние, в котором он был после загрузки ОС. Но обычно менеджеру памяти такая помощь не требуется — он сам постепенно выгрузит лишнее, если оперативка будет заканчиваться. В справке говорится, что purge вообще нужен в основном для тестирования, но кто знает, как повернется жизнь?

 

Отслеживаем обращения к файловой системе, чтобы выявить проблемы

Команда fs_usage, запущенная без параметров от рута, выводит запись о каждом обращении к файловой системе. Нужно это в тех случаях, когда какая-то программа падает при запуске или выдает загадочные сообщения об ошибках. Если проблема в том, что один из файлов поврежден, то ты сможешь отыскать его с fs_usage.

Чтобы пришлось меньше рыться в выдаче, ограничь сообщения одним процессом, написав его название после fs_usage. Если знаешь только ID, пиши sudo fs_usage pid <PID>. Другой полезный параметр — это -f, после него можно задать фильтр по операциям с сетью (-f network), с файлами (-f pathname добавит колонку с путем) и так далее. Если текст не влезает в строку, добавь -w.

Подробности можешь посмотреть, например, в статье The Mac Observer или в блоге mohit.io.

 

Пользовательские утилиты

 

Совершаем открытия

На первый взгляд команда open очень проста — это практически полный аналог двойного клика в графическом интерфейсе. Если скормить ей файл .app, она запустит программу, если любой другой — то откроет в ассоциированной с форматом программе. При желании можно добавить параметр -a и указать, в каком именно приложении открывать, а -e принудительно откроет файл в TextEdit (даже если он бинарный).

Но главный кайф open в другом. В прошлой статье я рассказывал, как настроить себе удобный способ быстро перейти из Finder в ту же папку в терминале. Так вот, команда open — это отличный способ перемещаться в обратном направлении. Если в качестве аргумента open получает каталог, тот откроется в Finder. Соответственно, open . открывает текущую папку. А еще можно указать «Файндеру» на определенный файл, если написать open -R <файл> (R — от слова reveal).

 

Работаем с разделами диска

В папке с утилитами на каждом «маке» есть мегаполезная программа Disk Utility, которая позволяет управлять разделами жестких дисков, форматировать их, вручную монтировать сменные носители, создавать образы и так далее. Ее вариант для командной строки называется diskutil.

Поскольку функций много, список команд тоже немаленький. Из основного тебе может пригодиться diskutil list — эта команда в отличие от df выводит список физических дисков, а не разделов; diskutil info <идентификатор диска> — подробная информация о диске и diskutil unmountDisk <идентификатор> — ручное демонтирование.

Пригождается все это, к примеру, когда готовишь загрузочную SD-карту для Raspberry Pi (подробное руководство есть на сайте raspberrypi.org). А еще многие проблемы с «маком» решаются автоматической починкой прав на файлы — diskutil repairPermissions /.

Неплохая статья о diskutil с кучей примеров команд есть на сайте The Instructional.

 

Создаем и монтируем образы дисков, пишем CD и DVD

За работу с образами дисков отвечает другая команда — hdiutil. Чтобы примонтировать образ, пиши hdiutil attach <файл.dmg> (точно так же монтируется .iso), чтобы демонтировать — hdiutil detach /dev/disk<номер>.

Этой же утилитой можешь превратить каталог в образ диска. Команда следующая:

hdiutil create -volname "<Метка тома>" -srcfolder <путь к папке> -ov <файл.dmg>

Чтобы создать зашифрованный образ, добавь параметры -encryption -stdinpass. Прожечь образ на болванку тоже легче легкого: hdiutil burn <файл с образом>. Восстановить содержимое диска из образа можно командой asr:

sudo asr -restore -noverify -source <файл.dmg> -target /Volumes/<диск>
info-icon.jpg

INFO

Если в названии файла есть пробелы, большинство утилит потребуют заключить название в двойные кавычки. Это к тому же проще, чем экранировать пробелы.

 

Ищем файлы и смотрим метаданные

Если ты по старой линуксовой привычке уже набирал в маковской консоли команду locate, то сталкивался с тем, что она не работает. Вместо этого ее сервис предлагают сначала запустить через launchd. Делать этого не нужно, потому что на «маке» есть намного лучший способ искать файлы — это утилита mdfind, которая ищет по базе данных Spotlight.

Сразу нашел архивы на внешнем диске :) Сразу нашел архивы на внешнем диске Пользоваться mdfind не сложнее, чем написать mdfind <строка для поиска>. Обрати внимание, что поиск ведется не только в названии файлов, но и внутри документов, и в метаданных. Кстати, для просмотра метаданных из командной строки есть утилита mdls — просто набери после нее название файла, и все увидишь.

У mdfind, как ты мог догадаться, есть полезные параметры. Так, -live запустит эту утилиту в постоянном режиме и будет выводить находки по мере их появления, -onlyin <каталог>ограничит область поиска одним каталогом, а -name <файл> заставит mdfind искать строку только в названиях файлов и нигде больше.

 

Перехватываем трафик айфонов

В macOS входит небольшая, но полезная утилитка rvictl, которая помогает захватывать трафик мобильных устройств с iOS. Подключай айфон или айпад к компьютеру, копируй его UDID из iTunes и пиши rvictl -s <UDID>. В системе появится новый сетевой интерфейс rvi0 — можешь начинать захватывать трафик с него командой sudo tcpdump -i rvi0 -w <файл.pcap>. Когда закончишь, пиши rvictl -x <UDID>, чтобы отключить устройство, а .pcap можешь открыть в том же Wireshark. Подробнее об этой операции можешь почитать в блоге Кей Гаррисона.

 

Конвертируем текст

Конвертировать текстовые файлы из одного формата в другой на «маке» — одно удовольствие благодаря утилите textutil. Пишешь textutil -convert txt <файл.docx> и получаешь файл Word. Вместо DOCX может быть DOC, RTF, HTML, ODT или WebArchive (веб-страница в формате Safari).

Точно так же можно конвертировать в любом направлении, меняя параметр и расширение файла на выходе. Форматирование, увы, не будет сохранено. Зато можно массово сконвертировать файлы, задав вместо названия маску (например, textutil -convert txt ~/Desktop/*.docx).

 

Воспроизводим и конвертируем аудио

Для работы с аудио в macOS есть три утилиты: afplay, afinfo и afconvert. Первые две крайне просты в использовании: afplay <файл> запустит воспроизведение, afinfo <файл> выдаст подробную информацию о кодеке, длине и параметрах кодирования.

А вот afconvert — это менее очевидная в освоении штука (впрочем, кросс-платформенные SoX и FFmpeg тоже не балуют простотой). Увы, afconvert не может создавать MP3, что делает его применение довольно узким.

Можно, например, превратить MP3 в рингтон для айфона:

afconvert <файл.mp3> <файл.m4r> -f m4af

Или, наоборот, раскодировать MP4 в WAV:

afconvert <файл.m4a> -f 'WAVE' -d 'ulaw' -c 1

Но если ты ищешь утилиту для долгого и плодотворного использования, то я рекомендую скачать XLD. Вызов из командной строки она, кстати, тоже поддерживает.

 

Работаем с изображениями

Если от погружения в дебри параметров afconvert я тебя попытался осторожно отговорить, то за то, чтобы попробовать маковский конвертер графики sips, наоборот, жарко агитирую. Возвращаться к ImageMagick после знакомства с ним вряд ли захочется.

Чтобы перекодировать файл из одного формата в другой, напиши

sips -s format <формат> <входной файл> --out <выходной файл>

Для JPEG можно после формата задать уровень сжатия: formatOptions <проценты>. Среди поддерживаемых форматов есть JPEG, TIFF, PNG, GIF, BMP, PSD и некоторые более экзотические.

Помимо этого, с картинкой можно делать разные преобразования. Вот список наиболее полезных параметров, которые можно добавить к команде:

  • -с <ширина> <высота> — обрезать;
  • -f <horizontal или vertical> — отразить;
  • -r <градусы> — повернуть;
  • -z <ширина> <высота> — изменить размеры;
  • -Z <ширина> — самый полезный параметр, который пропорционально сжимает или растягивает картинку в зависимости от заданной ширины.

Если нужно сконвертировать сразу много картинок, то тебе пригодится вот такой скриптик на bash:

for i in *.png; do sips -s format jpeg -s formatOptions 97 "${i}" --out "${i%png}jpg"; done

Здесь PNG из текущего каталога сжимаются в JPEG с качеством 97%.

 

Копируем каталоги по-маковски и пользуемся архиватором

Каждый, кто имел дело с никсовой командной строкой, знает, что для копирования нужно писать cp, а копировать каталоги можно при помощи cp -r. Однако в macOS, помимо этого, есть своя команда копирования каталогов — ditto. Отличается она тем, что переходит по симлинкам, копирует метаданные и права, создает целевую папку, если та не существует, а если существует, то объединяет содержимое.

Пользоваться ditto не сложнее, чем cp: достаточно набрать ditto <откуда> <куда>. Можешь добавить параметр -V --norsrc, если не хочешь, чтобы метаданные были скопированы.

Второе применение ditto — это работа с архивами PKZip. Чтобы сжать содержимое каталога, пиши

ditto -ck --rsrc --sequesterRsrc <путь> <файл.zip>

При этом будет создан архив с файлами, находящимися внутри каталога, а сам он в архив не пойдет.

Для того чтобы разархивировать, надо написать ditto -xk <файл> <каталог>. Файлы будут помещены в указанную папку, а если ее не существует, то ditto создаст ее. Если хочешь распаковать на месте, напиши вместо этого точку (указатель на текущий каталог).

 

Используем синтезатор речи

Команда say — это обычно одна из первых вещей, которую показывают новичкам. Ну не круто ли, что на любом «маке» можно открыть терминал, написать say Hello, World! и услышать, как компьютер вслух поприветствует мир? Круто, но редко кто знает о say больше.

Во-первых, у say есть несколько интересных параметров. Можно зачитать содержимое текстового файла (-f <файл>), задать голос (-v название), скорость (-r <количество слов в минуту>), перенаправить вывод в звуковой файл (-o <файл>), включить индикатор прогресса (--progress) или отображать текст и подсвечивать слова по ходу чтения (-i).

Во-вторых, say — это довольно серьезный синтезатор речи с развесистой системой команд. Их вписывают прямо в текст в двойных квадратных скобках. С азами ты можешь ознакомиться, прочитав пост в блоге Unfinished Bitness, а полный список команд есть в официальной справке.

 

Делаем скриншоты

Делать скриншоты на «маке» легко и просто: достаточно нажать Cmd-Shift-3 или Cmd-Shift-4 и выделить область (или выбрать окно пробелом). То же самое можно сделать и из командной строки командой screencapture. Вот некоторые полезные параметры:

  • -t <формат> задает формат (по умолчанию PNG);
  • -x выключает звук;
  • -c отправит скриншот в буфер обмена;
  • -i интерактивный режим (аналог Cmd-Shift-4);
  • -M сразу откроет Mail и создаст письмо со скриншотом;
  • -o отключает тень;
  • -C включает курсор;
  • -T <секунды> задает задержку перед снятием скриншота;
  • -b делает скриншот тачбара на новых MacBook Pro.

Если не используешь параметр , то после screencapture нужно добавить название файла, в который будет записан скриншот.

Кстати, мне попадалась забавная программка, которая записывает серию скриншотов в анимированный GIF, она называется LICEcap.

 

Одной строкой

  • pbcopy и pbpaste — две полезнейшие команды: первая перекидывает ввод в буфер обмена, вторая достает оттуда вывод. Например, ls -l | pbcopy скопирует список файлов в текущем каталоге.
  • sw_vers выводит версию и билд операционной системы (и то и другое есть и в выдаче system_profiler).
  • osascript выполняет скрипт на AppleScript или JavaScript (с параметром -l JavaScript). С параметром -i запустит REPL.
  • installer устанавливает программы. Например, можешь написать installer -pkg <файл.pkg> -target /.
  • softwareupdate ставит обновления системы и софта из App Store, их список можно получить с ключом -l.
  • plutil конвертирует файлы plist между XML, JSON и двоичным форматом.

Читайте ещё больше платных статей бесплатно: https://t.me/nopaywall