Содержание статьи
Сама природа операционных систем семейства UNIX делает их очень гибкими ОС, которые способны на гораздо большее, чем мы привыкли думать. Во многих случаях сама операционка подталкивает пользователя к нестандартному мышлению и нахождению обходных путей решения каких-либо задач. Множество людей оказывалось в такой ситуации, и это толкало их на создание скриптов и программ, выполняющих обычные функции нестандартным и более эффективным путем.
Эта статья – своего рода обзор или, лучше сказать, дневник, описывающий личный опыт использования нестандартного софта в повседневной жизни линуксоида. Многие из описанных в статье программ и трюков используются мной ежедневно и зарекомендовали себя отличными инструментами, значительно упрощающими жизнь.
Google за пределами браузера
Google вездесущ, из поисковой системы он превратился в огромную, живущую своей жизнью инфраструктуру, которая пытается проникнуть во все аспекты жизни простого интернет-зависимого человека. Google существенно упрощает нашу жизнь, позволяя получить доступ ко всем благам современного интернета с помощью единственного аккаунта. Но можно ли сделать доступ к этим благам за пределами окна браузера? Можно ли задать вопрос поисковой системе и скачать видео из Youtube из окна терминала? Не так давно эти вопросы я задал сам себе и был приятно удивлен.
Сразу оговорись, что, как линуксоид старой школы, я не приемлю сложных графических интерфейсов и тяжеловесных приложений. Простые изящные утилиты командной строки вызывают во мне гораздо больше трепета, нежели сложные многофункциональные программы, зависящие от сотни библиотек. Поэтому именно в эту сторону велись мои поиски клиентов для сервисов Google.
Первым найденным мной инструментом оказался пакет под названием GoogleCL (http://code.google.com/p/googlecl/), опубликованный сотрудниками самого Google. Будучи установленным в систему, он добавляет команду «google», с помощью которой можно производить такие действия, как публикация постов в блог, изменение событий в календаре, редактирование контактов gmail/android (эта ОС хранит всю адресную книгу на серверах Google), управление документами Google Docs, добавление фотографий в альбомы Picasa и публикация видео на Youtube.
Команда принимает два обязательных аргумента и любое количество необязательных опций, следующих прямо за ними. В качестве первого аргумента выступает имя сервиса (picasa, blogger, youtube, docs, contacts или calendar), а второго – действие, которое необходимо выполнить, используя этот сервис. Для каждого сервиса предусмотрен свой список возможных действий, например, для Picasa это get, create, list, list-albums, tag, post и delete, тогда как для Blogger – только post, tag, list и delete. Опции используются для уточнения действий, например, --title задает заголовок публикуемого поста для сервиса Blogger или имя публикуемого видео на Youtube, а опция --summary предназначена для добавления небольшого комментария к альбому Picasa или к тому же видеоклипу. Вообще, это настолько простая и интуитивно понятная команда, что объяснять что-либо просто не имеет смысла. Вместо этого я просто приведу примеры ее использования:
1. Публикация поста в блог с помощью Blogger:
$ google blogger post --blog 'Linuxoid' --title 'GoogleCL работает!' --tags 'linux, cli' 'Открыл для себя GoogleCL, bla-bla, bla'
2. Добавление события в календарь:
$ google calendar add 'День рождения Юли'
3. Добавление контакта
$ google contacts add 'Евгений Зобнин,zobnin@gmail.com'
4. Редактирование документа Google Docs (в дефолтовом редакторе, имя которого указано в переменной окружения EDITOR):
$ google docs edit --title "Список покупок"
5. Добавление нового альбома в Picasa (и заливка фоток):
$ google picasa create --title "Мои фотки" ~/photos/*.jpg
6. Публикация видео на Youtube:
$ google youtube post --category Comedy ужос.avi
Во время первого обращения к сервису команда попросит ввести Google-логин (адрес почты на gmail) и откроет страничку в браузере, на которой необходимо подтвердить права GoogleCL на удаленное управление. Последующие запуски команды будут проходить без вопросов.
GoogleCL хорош, и его действительно удобно использовать для доступа к сервисам Google, но оказалось, что он лишен одной из важнейших функций: возможности скачивать видео с Youtube. Пришлось продолжить поиски, в результате чего был открыт консольный Youtube-клиент под названием youtube-dl (http://bitbucket.org/rg3/youtube-dl/wiki/Home). Эта до крайности простая утилита принимает в качестве параметра ссылку на видеоролик в интернете, закачивает его и помещает в текущий каталог. Кроме самого Youtube утилита умеет работать с metacafe.com, Google Video, Photobucket, Yahoo! video, Dailymotion и некоторыми другими. Никакого конвертирования файла после его получения не производится, но нужно ли оно, когда все популярные UNIX-плееры умеют воспроизводить flv-видео напрямую?
В качестве дополнительных параметров команда принимает несколько опций, которые позволяют задать имя пользователя и пароль, используемые для доступа к закрытым каналам (опции «-u» и «-p»), качество видео («-b» для самого лучшего качества или «-d» для HD-видео), или просто продолжить докачку с прерванного места (опция «-c»). Остальные опции не представляют особого интереса, но подробно описаны в man-странице. Вместо URL ролика можно использовать специальные ключевые слова для прямого поиска видео. Например, запустив команду с параметром «ytsearch:HTC Desire», ты получишь самое релевантное видео, удовлетворяющее поисковому запросу HTC Desire. Для поиска по Google Video и Yahoo! video предусмотрены ключевые слова «gvsearch» и «ybsearch».
Дальнейшие поиски инструментов также принесли свои плоды в виде виртуальной файловой системы, позволяющей монтировать хранилище Google Docs к локальному каталогу. Программа носит имя gdocs-mount-gtk и может быть легко установлена в Ubuntu из стороннего репозитория. Чтобы сделать это, достаточно выполнить всего три команды:
$ sudo add-apt-repository ppa:doctormo/ppa
$ sudo apt-get update
$ sudo apt-get install gdocs-mount-gtk
Далее ее можно найти в меню: Приложения –> Стандартные –> Google Docs Connection. К сожалению, в своей работе программа использует возможности Gnome и файлового менеджера Nautilus, что не слишком обрадует гиков и KDE’шников. К счастью, от графических ненужностей можно легко избавиться, установив только пакет google-docs-fs, который реализует саму файловую систему:
$ sudo apt-get install google-docs-fs
После этого в системе появятся две простых команды: gmount и gumount, которые можно использовать для подключения хранилища к системе:
$ mkdir gdocs
$ mount мыло@gmail.com пароль gdocs
$ ls gdocs
$ gumount gdocs
Dropbox как инструмент синхронизации всего и вся
Когда-то открыв для себя Dropbox, я уже не мыслю жизни без этого несравнимого по удобству использования облачного сервиса хранения данных. Он интуитивно прост в применении, имеет клиенты для всех популярных ОС (включая iOS и Android), не просит ждать, пока данные будут загружены на сервер, и чрезвычайно быстро производит синхронизацию файлов (надо отдать должное разработчикам сервиса, снабдившим ее системой поиска дубликатов по всему хранилищу и дельта-синхронизацией). Dropbox можно использовать для передачи информации между компьютерами, бэкапа данных и совместной работы над проектами. Однако на этом возможности Dropbox не заканчиваются, ведь он способен выполнять функции хостинга простых веб-сайтов, синхронизировать профили приложений и даже удаленно управлять ПК. Ниже я приведу наиболее интересные и полезные, но нетривиальные способы использования Dropbox в повседневной жизни.
1. Управление торрент-клиентом. Практически любой доступный для Linux торрент-клиент имеет функцию автоматической загрузки торрент-файлов из определенного каталога. Обычно она используется для того, чтобы заставить торрент-клиент качать файлы сразу после того, как они будут сохранены пользователем в определенный каталог, избегая лишних манипуляций с его стороны. Dropbox позволяет добавить к этой функции возможность удаленной загрузки файлов, благодаря чему работающий сутки напролет домашний сервер будет автоматически начинать качать торренты, загруженные на облачный жесткий диск. Для этого просто создай в каталоге ~/Dropbox подкаталог torrents и настрой торрент-клиент так, чтобы он автоматически скачивал все торренты, содержащиеся в этом каталоге. Теперь в каталог можно кидать файлы с любого ПК, имеющего доступ в сеть (рабочий или институтский комп, или даже смартфон), и быть уверенным, что файлы будут скачаны к твоему приходу домой.
2. Синхронизация паролей. Есть такая замечательная программа под названием KeePassX, создана она для того, чтобы секьюрно хранить все логины и пароли пользователя (включая те, что он вводит в веб-браузере). Примечательная особенность программы не только в ее кроссплатформенности (Windows-версия носит имя KeepPass), но и в том, что она позволяет работать с разными базами паролей одновременно и самостоятельно указывать их местоположение. Естественно, базу можно сохранить в каталог ~/Dropbox, а затем открыть на другом компе.
3. Синхронизация профиля Firefox. Как и любой другой браузер, при своем первом запуске Firefox создает так называемый профиль, который используется для хранения всего, что породил (получил из интернета) браузер во время работы пользователя, включая пароли, закладки, кукисы, настройки и много чего еще. Профиль представляет собой каталог, поэтому его можно скопировать, забэкапить, унести на флешке и, естественно, выложить в Dropbox. Для этого необходимо создать специальный каталог внутри ~/Dropbox:
$ mkdir ~/Dropbox/fx_profile
Переместить в него все содержимое профиля (здесь XXX – это случайная строка, которую придется скопировать или запомнить):
$ mv ~/.mozilla/firefox/XXX.default/* ~/Dropbox/fx/profile
И создать символическую ссылку, чтобы Firefox ничего не заметил (XXX берем из предыдущей команды):
$ ln -s ~/Dropbox/fx/profile ~/.mozilla/firefox/XXX.default
Теперь на всех остальных машинах, которые будут использовать этот профиль, необходимо удалить существующий профиль (rm -rf ~/.mozilla/firefox/*.default) и создать симлинк, как это было показано в последней команде.
4. Портативные приложения. Переносимые приложения, распространяемые в виде одного исполняемого файла, работающего на любой машине, существуют не только для Windows. Создатели сайта portablelinuxapps.org предлагают своим посетителям выбор между сотней приложений, которые могут быть без установки запущены на любом Linux-десктопе. Положив необходимые приложения в Dropbox, ты добьешься того, что твои любимые программы всегда будут у тебя под рукой.
5. Удаленное управление Linux-машиной. На одной из страниц wiki.getdropbox.com выложен интересный набор скриптов, который позволяет управлять Linux-машиной удаленно, не задействуя для этого ничего, кроме Dropbox. Реализация очень проста и занимает всего несколько строк на языке командного интерпретатора: dl.getdropbox.com/u/30722/dropbox_server.sh и dl.getdropbox.com/u/30722/dropbox_client.sh. Помещаем оба скрипта в каталог ~/Dropbox, на сервере запускаем dropbox_server.sh, а на клиенте – dropbox_client.sh. В ответ на приглашение к вводу (Enter Command:) пишем свою команду, которую хотим выполнить на сервере, и получаем ее вывод на экран. Хитрость в том, что клиент просто записывает имя команды в файл, сервер его читает, выполняет команду и помещает результат в другой файл, который читает клиент и выводит на экран. Естественно, ни о каких управляющих символах терминала речи идти не может, поэтому о подсветке и mc придется забыть :).
Вообще, все это – лишь частные примеры хранения конфигурационных и управляющих файлов на серверах Dropbox, список которых можно продолжать бесконечно. В конце концов, в Dropbox можно запихнуть и весь домашний каталог без каких-либо проблем и последствий для производительности, другое дело, что не все могут доверить частную информацию в открытом виде посторонним.
Рекурсивный X-сервер
Рядовой пользователь домашнего линукса даже не подозревает, какая многофункциональная и сложная махина скрывается за легким полупрозрачным интерфейсом его рабочего стола. X-сервер считается одной из самых сложных программ, написанных на языке C, и имеет такое количество различных подсистем и механизмов, что его разработчикам иногда кажется, что еще совсем чуть-чуть – и они уже не смогут разобраться, что к чему. X-сервер включает в себя драйвера для всех мыслимых и немыслимых графических адаптеров и устройств ввода, способен на почти полное самоконфигурирование, умеет ускорять производительность приложений с помощью прямого доступа к памяти, но самое главное – обладает клиент-серверной архитектурой, которая позволяет не только удаленно обращаться к рабочему столу на основе иксов, но и, например, запустить несколько X-серверов на одной машине.
Когда-то мне понадобилось сделать множество скриншотов различных оконных менеджеров. Эта задача могла быть решена с помощью многократного запуска иксов с различными записями в файле ~/.xinitrc. Мне это показалось слишком нерациональным, и я решил воспользоваться возможностями псевдо-X-сервера Xnest, который работает внутри окна уже существующего X-сервера. Для его установки и запуска необходимо было выполнить всего две простых команды:
$ sudo apt-get install xnest
$ Xnest :1 -ac
Здесь «:1» – это адрес X-сервера, записанный в короткой форме (полная форма выглядела бы примерно так: 127.0.0.1:1). «Корневой» X-сервер автоматически получает адрес «:0», поэтому все остальные сервера, запущенные на одной машине, должны иметь адреса по возрастанию. Опция «-ac» отключает проверку на права доступа к серверу, без нее клиенты-приложения (в моем случае это менеджер окон) не смогли бы получить доступ к серверу без подтверждения своих прав.
В отличие от стандартного X-сервера, Xnest не использует драйвера для прямого доступа к дисплею и устройствам ввода, а вместо них использует возможности «корневого» сервера, создавая под свои нужды отдельное окно и перехватывая все обращения к нему. Чтобы запустить свои приложения в этом окне, необходимо проделать небольшой трюк, а именно – присвоить переменной окружения DISPLAY адрес Xnest (сделай это в новом терминале):
$ DISPLAY=:1
Далее можно запускать любые приложения под управлением виртуального X-сервера. Проблема тут заключается только в том, что он не совсем корректно отображает графику, и картинка может оказаться испорченной различными артефактами. К счастью, существует альтернатива под названием Xephyr (пакет xserver-xephyr), более продвинутая версия Xnest, лишенная данного недостатка:
$ Xephyr :1 -ac
Управление менеджером окон из командной строки
Вопреки распространенному мнению, в системах типа UNIX автоматизации поддаются не только действия, выполняемые с помощью командного интерпретатора, но и многие операции с графическим интерфейсом. Яркий тому пример – протокол D-BUS, используемый для объединения компонентов рабочего стола в единое целое, и стандарт EWMH (NetWM), который определяет интерфейс взаимодействия менеджера окон со сторонними приложениями. Объединив мощь D-BUS и EWMH, можно добиться почти полной автоматизации графического интерфейса.
О D-BUS мы уже писали, поэтому для его изучения лучше обратиться к соответствующей статье («Хозяин цифровой магистрали», ][ от 09.2010), а вот о EWMH еще не говорили. Этот стандарт предназначен для более тесной интеграции менеджера окон в графическое окружение, однако его можно использовать и для более гибкого управления оконной системой с помощью командного интерпретатора.
Существует консольный EWMH-клиент под названием wmctrl. Его назначение состоит в том, чтобы дать пользователю возможность управлять окнами прямо из командной строки или скриптов. В качестве аргументов команда принимает «действие» (в виде однобуквенной опции) и идентификатор окна, к которому это действие должно быть применено. Утилита может выполнить практически любое действие с окном, на которое способен сам менеджер окон, включая изменение размеров окна, изменение фокуса или закрытие окна. Вот несколько примеров:
1. Вывести окно с именем Firefox на передний план и назначить ему фокус ввода:
$ wmctrl -a Firefox
2. Переместить окно с именем google-chrome на текущий рабочий стол и вывести его на передний план:
$ wmctrl -R google-chrome
3. Изменить размер окна с именем Firefox:
$ wmctrl -r Firefox -e '0,6,0,1040,708'
4. Скрыть/показать окно с именем Xterm:
$ wmctrl -r 'Xterm' -b toggle,shaded
5. Передвинуть окно Xterm на рабочий стол номер 2:
$ wmctrl -r 'Xterm' -t 2
Wmctrl удобно использовать не только для автоматизации действий, но и чтобы назначить определенные действия на хоткеи (для связывания клавиш с командами воспользуйся утилитой xhotkeys, xbindkeys или keytouch).
Управление ПК с помощью смартфона
Несмотря на то, что в плане развлечений большие домашние ПК постепенно уходят из моды, уступая ноутбукам, умным цифровым телевизорам и различным телевизионным приставкам, для многих гиков системный блок с большим широкоформатным монитором и хорошей акустической системой остается прекрасным мультимедиа-центром, который они вряд ли в ближайшем будущем на что-то променяют. Однако у ПК есть один существенный минус, который заключается в отсутствии системы удаленного управления из коробки. Многие, конечно, уже успели приспособить ненужные старые пульты и инфракрасные приемники для выполнения этой задачи, однако технологичным и по-настоящему удобным такой подход назвать можно только с большой натяжкой. Для себя проблему удаленного управления я решил совсем по-другому.
Уже давно в моей обители стоит точка доступа Wi-Fi, которая раздает интернет по всему дому, поэтому, когда встал вопрос об организации удаленного управления домашним компом, мой взор сразу устремился в сторону смартфона, умеющего использовать ее возможности для выхода в интернет. Смартфон работал под управлением истинно гиковской ОС Android, поэтому приложения для управления компом через Wi-Fi для нее должны были быть обязательно (тем более что они есть и для Symbian, и для Windows Mobile). На запрос «Remote Control» Android Market выдал несколько результатов, включая несколько программ для управления презентациями и медиа-серверами, не слишком функциональный PRemoteDroid, Unified Remote с сервером только для Windows и Gmote (www.gmote.org), способный управлять Linux-машинами и полностью открытый в плане исходных кодов. На нем я и остановился.
После установки программа предложила скачать и установить на управляемую машину серверное ПО. Пришлось перейти на официальный сайт и слить стандартный тарболл (sites.google.com/site/marcsto/GmoteServerLinux2.0.0.tar.gz), который после распаковки оказался Java-программой. «Что ж, Java так Java», – подумал я и ввел в терминале заветную команду:
$ sudo apt-get install openjdk-6-jre
После выполнения команды «./GmoteServer.sh» из каталога с распакованным тарболлом сервер благополучно запустился, предложил ввести имена каталогов с медиа-файлами (например, ~/video и ~/music) и задать пароль, после чего повис в трее.
Клиент, запущенный на телефоне, самостоятельно нашел ближайший сервер и попросил ввести пароль. Спустя мгновение на экране появился весьма элегантный на вид интерфейс управления со стандартными клавишами play, stop, pause и т.д. Через меню можно было выбрать проигрываемый альбом или видеофайл, который будет воспроизведен на компе с помощью плеера vlc (его тоже придется установить). В качестве приятного дополнения оказалась доступна функция удаленной клавиатуры и мыши, которую можно использовать, когда не хочешь вставать с кровати, чтобы просто закрыть окно или запустить программу.
Выводы
Меньше слов – больше дела. Именно эта фраза лучше всего подходит для заключения к статье. Ощутить удобство описанных инструментов по описанию вряд ли удастся; только установив все это на свою машину и попробовав в деле, ты поймешь, насколько удобным может быть UNIX.
Wikipedia в консоли, используя DNS-запрос
Ошеломляющий своей простотой консольный клиент Wikipedia был опубликован на небезызвестном ресурсе www.commandlinefu.com. Он состоит из одной строки и выводит на экран несколько первых строк статьи и ссылку на полную версию:
#!/bin/sh
dig +short txt ${1}.wp.dg.cx
Управление web-камерой с помощью mplayer
На низком уровне работа с веб-камерами в Linux происходит через стандартную ядерную подсистему «video for linux» (v4l), а это значит, что для ее управления не нужно ничего, кроме консольного mplayer:
$ mplayer tv://
Это пример вывода изображения с камеры на экран. А вот пример его записи в файл:
$ mencoder tv:// -nosound -ovc lavc -lavcopts vcodec=mjpeg -o video.avi
Если камера – не первое видеоустройство, необходимо использовать дополнительные опции:
$ mplayer tv:// -tv device=/dev/video1
INFO
В Dropbox можно было бы сохранить и профиль Google Chrome, однако это не имеет смысла, так как он почти весь синхронизируется с серверами Google (по крайней мере, в разрабатываемой версии браузера).