Модуль_3. Модуль системы и сети передачи данных
Скачать 1.93 Mb.
|
Десктоп Раз уж мы заговорили о десктопе, то продолжим. Как и консоль, его тоже можно заскриптовать. Вот, например, скрипт, загружающий случайные обои, опубликованные на reddit-канале wallpaper: #!/bin/bash 94 wget - O - http : //www.reddit.com/r/wallpaper |\ grep - Eo 'http://i.imgur.com[^&]+jpg' | \ shuf - n 1 | \ xargs wget - O background jpg feh -- bg - fill background jpg Здесь все просто. С помощью wget скрипт загружает страницу www.reddit.com/r/wallpaper, передает ее grep, который ищет на ней ссылки на imgur, выбирает случайную ссылку с помощью shuf, загружает ее опять же с помощью wget и устанавливает в качестве обоев, используя команду feh (это такой миниатюрный просмотрщик изображений, его нужно предварительно установить). Скрипт можно добавить на рабочий стол, и тогда по клику у тебя будут меняться обои. #!/bin/sh state = `synclient | grep TouchpadOff | cut -d '=' -f 2` if [ $state = "1" ]; then synclient TouchpadOff = 0 else synclient TouchpadOff = 1 fi А это скрипт для включения/выключения тачпада ноутбука: включает, если отключен, и наоборот. В своей работе использует утилиту synclient, позволяющую управлять тачпадами производства Synaptics (90% тачпадов делают они). При запуске без аргументов утилита выводит различную информацию о тачпаде, в том числе строку TouchpadOff = 1, если он активирован, и TouchpadOff = 2, если отключен. Скрипт находит это значение и в зависимости от состояния тачпада включает или отключает его. ! #/bin/bash mpv tv : // -frames 3 -vo jpeg mv 00000003.jpg photo jpg rm - f 0000 *. jpg А так можно сделать снимок с помощью веб-камеры. Скрипт использует видеоплеер mpv, чтобы записать первые три кадра, снятые камерой, в JPEG- файлы с именами 0000000.jpg, 00000002.jpg, 00000003.jpg, затем переименовывает третий снимок в файл photo.jpg, а остальные удаляет. Три снимка необходимы для того, чтобы камера успела провести инициализацию, обычно первые два получаются просто черными. Иногда изображение выходит перевернутым; чтобы это исправить, mpv следует запускать с флагом -vf flip: 95 $ mpv tv : // -frames 3 -vf flip -vo jpeg Ту же самую команду можно использовать для создания полноценной камеры слежения, которая делает снимки в моменты, когда юзер прикасается к мыши: #!/bin/bash while true ; do sudo cat / dev / input / mouse0 | read - n1 mpv tv : // -frames 3 -vo jpeg mv 00000003.jpg `date +%F-%H-%M` jpg rm - f 0000 *. jpg sleep 10 done Скрипт входит в бесконечный цикл, ожидая данные на устройстве /dev/input/mouse0. Если данные есть, значит, мышь сдвинулась или была нажата одна из ее клавиш. После этого он использует mpv, чтобы сделать три снимка, дает третьему снимку имя текущей даты и удаляет остальные. Для записи полноценного видео с веб-камеры можно использовать такой скрипт: #!/bin/bash mencoder tv : // -tv driver=v4l2:width=800:height=600:device=/dev/video0:fps=30:outfmt=yuy2:force audio:alsa:adevice=hw.2,0 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=1800 - ffourcc xvid -oac mp3lame -lameopts cbr=128 -o video.avi В результате ты получишь video.avi в формате MPEG4 с битрейтом 1800 и аудиодорожкой в формате MP3 с битрейтом 128. #!/bin/bash ffmpeg - f x11grab - r 25 - s 1366x768 - i : 0.0 screencast mpg А так ты можешь записать скринкаст. 1366x768 — разрешение рабочего стола. Просто сделать скриншот отдельного окна всегда можно с помощью команды import: import screenshot png После ее запуска значок мыши изменится на «прицел», с помощью которого можно выбрать окно. Повесив эту команду на клавиатурную комбинацию, ты получишь практически идеальную систему снятия 96 скриншотов, абсолютно не жрущую память, как это делают специализированные приложения, постоянно висящие в трее. Подключить и настроить внешний монитор тоже можно из командной строки: #!/bin/sh if [ - z "$1" ]; then exit fi if [ $1 == "off" ]; then xrandr -- output VGA - 0 -- off xrandr - s 0 else if [ $1 == "on" ]; then xrandr -- output LVDS -- auto -- primary -- output VGA - 0 -- auto -- left - of LVDS xrandr -- newmode "1920x1080" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 - hsync + vsync xrandr -- addmode VGA - 0 1920x1080 xrandr -- output VGA - 0 -- mode 1920x1080 fi xrandr -- dpi 96 Данный скрипт предполагает, что основной монитор носит имя LVDS, а внешний — VGA-0. Это стандартная ситуация для ноутбуков; если ты не уверен, можешь проверить вывод команды xrandr: при передаче скрипту аргумента off он отключает внешний монитор, аргумент on, в свою очередь, включает его, располагая по левую сторону от основного (аргумент --left-of LVDS в первой команде). Далее скрипт добавляет новую конфигурацию для монитора с разрешением 1920 x 1080 и активирует его. В самом конце скрипт устанавливает дефолтное значение DPI — как показывает практика, при подключении монитора с другим разрешением оно часто слетает. На самом деле в большинстве случаев команды xrandr --newmode ... и xrandr --addmode ... не нужны, так как Xorg может получить конфигурацию монитора и поддерживаемые им разрешения с помощью EDID. Иногда, однако, этого не происходит, и строку конфигурации, указываемую после аргумента --newmode, приходится генерировать самостоятельно с помощью инструмента cvt: $ cvt 1920 1080 97 Он же поможет сгенерировать нестандартное разрешение, «не поддерживаемое» монитором по умолчанию. Google, Twitter, Dropbox и торренты Отвлечемся от десктопных дел и поговорим о сетевых сервисах. Начнем, разумеется, с Google. Вот так будет выглядеть скрипт для получения первых десяти результатов поиска: #!/bin/bash Q = "$@" URL = 'https://www.google.de/search?tbs=li:1&q=' AGENT = "Mozilla/4.0" stream = $ ( curl - A "$AGENT" - skLm 10 "${GOOG_URL}${Q//\ /+}" | grep - oP '\/url\?q=.+?&' | sed 's|/url?q=||; s|&||' ) echo - e "${stream//\%/\x}" Скрипт делает запрос к Google с помощью уже знакомого нам curl, заменяя пробелы в поисковой строке на плюсы. Далее выискивает в ответном HTML ссылки и выводит их на экран. Все просто, хоть и кажется сложным. Второй популярный сервис — YouTube: #!/bin/bash mpv - fs - quiet `youtube-dl -g "$1"` Здесь все совсем просто. Скрипт всего лишь проигрывает видео с указанным в аргументе ID с помощью плеера mpv. Естественно, youtube-dl придется установить заранее. Как насчет твиттера? Нет проблем, вот полноценный бот, который на входе принимает команду, выполняет ее с помощью командного интерпретатора и отправляет результат указанному юзеру. #!/bin/bash USER = "ТВОЙ_НИК" while true ; do CMD = `echo "/dma +1" | ttytter -script | sed 's/\[.*\]\ //' if [ $CMD != $OLD_CMD ]; then REPL=` $CMD ` echo "/dm $USER ${REPL:0:140}" | ttytter -script CMD = $OLD_COMD fi sleep 60 done Скрипт использует консольный клиент ttytter, читая в цикле последнее direct message, далее он проверяет, не была ли такая команда уже выполнена, 98 и, если нет, выполняет ее и отправляет указанному в переменной USER пользователю, попутно обрезая до 140 символов. Чтобы все заработало как надо, тебе придется установить ttytter, запустить его, ввести приведенную им ссылку в адресную строку браузера, скопировать показанный браузером ключ аутентификации и ввести его в ttytter. Естественно, перед тем как это сделать, следует завести для бота отдельную учетку. Twitter запрашивает ключ Твиттер можно использовать не только для выполнения команд, но и для мониторинга машины. Следующий скрипт отправляет в ленту сообщение с информацией о состоянии машины (имя хоста, uptime, нагрузка, свободная память и нагрузка на CPU): #!/bin/bash HOST = `hostname -s` UP = `uptime | cut -d" " -f4,5 | cut -d"," -f1` LOAD = `uptime | cut -d":" -f5,6` MEM = `ps aux | awk '{ sum += $4 }; END { print sum }'` CPU = `ps aux | awk '{ sum += $3 }; END { print sum }'` tweet = "Host: ${HOST}, uptime: ${UP}, cpu: ${CPU}%, memory: ${MEM}%, loadavg ${LOAD}" if [ $ ( echo "${tweet}" | wc - c ) - gt 140 ]; then echo "FATAL: The tweet is longer than 140 characters!" exit 1 fi 99 echo $tweet | ttytter - script Ну и под конец приведем скрипт, не связанный с сетевыми сервисами, но имеющий прямое отношение к сетям и к тому, зачем мы обычно их используем. Это скрипт для запуска и остановки торрент-клиента во время простоя машины: #!/bin/bash IDLE = 600000 STOPCMD = "transmission-remote -S" STARTCMD = "transmission-remote -s" STOPPED = "yes" while true ; do if [ `xprintidle` - gt $IDLE ]; then if [ $STOPPED = "yes" ]; then $STARTCMD STOPPED = "no" fi else if [ $STOPPED = "no" ]; then $STOPCMD STOPPED = "yes" fi fi sleep 60 done Скрипт уходит в бесконечный цикл, каждую минуту проверяя, сколько миллисекунд прошло с момента, когда юзер что-либо делал (для этого используется команда xprintidle). Если прошло уже 600 000 мс (десять минут), скрипт выполняет команду, указанную в переменной STARTCMD. В противном случае он выполнит команду STOPCMD, но только тогда, когда до нее была выполнена команда STARTCMD. Если кратко: ничего не делаешь за компом десять минут — запускается STARTCMD, в данном случае это команда запуска всех закачек с помощью Transmission, если нет — приостановка всех закачек. Не любишь Transmission? Нет проблем, вот команды для Deluge: STOPCMD = "deluge-console pause \*" STARTCMD = "deluge-console resume \*" О ShellCheck 100 ShellCheck — это инструмент статического анализа, который отображает предупреждения и предложения о неправильном коде в сценариях оболочки bash / sh. Его можно использовать несколькими способами: из Интернета путем вставки сценария оболочки в онлайн-редактор или, альтернативно, это может быть установка его в вашей системе и запуск из терминала, интеграция с вашим текстовым редактором, а также в ваша подборка или комплекты доказательств. ShellCheck в первую очередь выполняет три задачи: • Указывает и объясняет типичные синтаксические проблемы новичкам, которые заставляют оболочку выдавать загадочные сообщения об ошибках. • Указывает и объясняет типичные семантические проблемы среднего уровня, из-за которых оболочка ведет себя странно. • Он также указывает на тонкие предупреждения, которые могут привести к сбою работающего расширенного сценария в будущем. Линтер — это чистый код для ленивых Многие из проблем скриптов можно решить с помощью линтера, такого, как статический анализатор кода ShellCheck. Он помогает искать ошибки в текстах скриптов и выводить отчёты о проведённых проверках. Это позволяет повысить производительность работы и качество кода. Линтер — это программа, которая автоматизирует все процессы, и сама «причёсывает» код по определённым правилам. Даёшь ей неуклюжий код, она чистит на уровне каких-то простых правил. В чём может быть проблема, когда программистов много Когда вы пишете код самостоятельно и для себя, его можно писать как угодно — в одну строчку без пробелов или отделяя функции друг от друга тремя пустыми строками. Главное, что вы понимаете, что здесь написано. Как только вы начинаете участвовать с кем-то в совместном проекте, нужно установить общие правила написания кода. Сюда может относиться: • как форматировать код; • ставить табы или пробелы; • если пробелы — сколько штук; • можно ли использовать числа в формулах или нужны только константы и переменные; • можно ли использовать переменные из одной буквы или имя переменной обязательно должно быть со смыслом; • как объявлять классы и работать с методами и т. д. 101 Чтобы эти правила применялись и работали, за ними кто-то должен следить. Можно выделить отдельного программиста, можно проверять код друг друга по очереди, а можно поручить это линтеру. Что делает линтер Линтер на основании заданных правил перерабатывает код за секунду: • расставляет нужные табы и пробелы; • проставляет точки с запятой и скобки в нужных местах; • в HTML делает красивую вложенную структуру тегов и выносит стили из тегов в отдельный блок в |