Хакер - Используй силу, Тукс! Применяем PowerShell в Linux
hacker_frei
Андрей Попов
Содержание статьи
- GUI и CLI
- CLI в Linux
- CLI в Windows
- Объединение миров Windows и Linux
- Установка и запуск
- PowerShell как командная оболочка
- Структура команд и псевдонимы
- Доступность команд
- Справочная система
- Работа в командной строке
- Выводы
«Санкции», «импортозамещение» — эти словечки в последнее время все чаще встречаются в прессе и сетевых публикациях. Под давлением обстоятельств некоторые компании переходят на Linux и свободное ПО. Когда работаешь в Linux или используешь две операционные системы сразу, очень хочется сохранить удобное окружение и привычное средство автоматизации, роль которого в Windows играет PowerShell. Можно ли полноценно использовать его в Linux? Конечно, и сейчас мы разберемся, как.
GUI И CLI
С точки зрения обычного пользователя, ОС — это графическая оболочка для манипуляций с файловой системой компьютера и запуска различных приложений. Внешне операционные системы отличаются друг от друга незначительно, так как графический интерфейс везде состоит из одних и тех же элементов (окна, кнопки, раскрывающиеся списки и прочее), а файловые системы построены на одном принципе вложенных каталогов и файлов.
Поэтому работа с GUI-приложениями в Windows и Linux выглядит одинаково и интуитивно понятна, основные операции выполняются стандартными способами в более‑менее привычном интерфейсе.
Продвинутые пользователи и профессионалы для автоматизации работы пользуются еще одним инструментом, присутствующим в любой десктопной операционной системе. Это командный интерпретатор (оболочка) и набор стандартных утилит, исполняющихся в консольном режиме. Командный интерпретатор решает сразу две задачи:
- выполнение команд, которые вводятся вручную с помощью интерфейса командной строки (Command Line Interface, CLI);
- поддержка языка программирования для создания скриптов, исполняемых в операционной системе.
В отличие от графического интерфейса, CLI-инструменты нельзя назвать интуитивными. Нужно знать, какие именно команды есть в операционной системе, с какими ключами их запускать, как можно комбинировать эти команды для получения требуемого результата.
Дело осложняется тем, что в Windows и Linux используются разные командные оболочки со своими наборами служебных команд. Это связано как с принципиальными отличиями в архитектуре ОС, так и с историческими причинами.
CLI в Linux
В Linux работу с командной строкой поддерживает та или иная модификация оригинальной оболочки sh операционной системы Unix, обычно это Bash (Bourne again shell) или Zsh (Z shell).

Функциональность этих командных интерпретаторов и набор консольных утилит базируются на стандарте POSIX, созданном для обеспечения совместимости различных Unix-подобных операционных систем. Поэтому во всех модификациях Linux (как и в операционной системе macOS) используются одни и те же команды, которые можно соединять друг с другом в программные конвейеры, когда текст из выходного потока одной утилиты направляется на вход другой.
Многие стандартные команды Linux ориентированы на обработку текста (grep, sed, awk, sort, cut, tail), так как в Unix-подобных операционных системах текстовые данные принято использовать в качестве универсального представления информации, различные системные настройки и конфигурации приложений хранятся в обычных текстовых файлах.
Еще один базовый принцип Unix, перешедший в Linux, выражается фразой «всё есть файл». Поэтому одни и те же утилиты можно использовать для работы как с обычными текстовыми файлами, так и с виртуальными файлами, представляющими собой каналы связи программ друг с другом, периферийными устройствами и устройствами, эмулирующими ядро операционной системы.
Таким образом, несложные задачи автоматизации в Linux в итоге сводятся к манипуляциям с файловой системой и обработке текста с помощью имеющихся в системе стандартных команд. Такие задачи удобно решать, последовательно применяя несколько команд, объединенных текстовыми потоками в конвейер.

Типичный пример: необходимо очистить каталог /tmp от файлов, которые старше семи дней. Объединяем в конвейер команду find для поиска файлов и команду rm для их удаления:
find /tmp -type f -name '*' -mtime +7 -print0 | xargs -0 rm -f
В более сложных случаях, когда парой конвейеров не обойтись, пишут сценарии на поддерживаемом оболочкой древнем командно‑скриптовом языке, который никак нельзя назвать удобным и интуитивно понятным, или на одном из универсальных интерпретируемых языков, самый популярный из которых сейчас — Python.
CLI в Windows
Современные версии Windows базируются на разработанной в начале 1990-х годов Windows NT, имеющей, в отличие от Unix, API-ориентированную архитектуру. Операционные системы этого семейства состоят из огромного числа подсистем и компонентов, доступ к которым организован через специфические API. Для упрощения работы с такой сложной системой управляемые элементы группируются в структурированные объекты.
В этом и состоит принципиальное отличие Windows от Unix-подобных систем, которые ориентированы на использование текста для представления всего, что только можно. Инструмент для управления Windows из командной строки должен не только поддерживать работу с файловой системой и текстовыми файлами, как в Unix-системах, но и обеспечивать простой и единообразный доступ к свойствам и методам множества внутренних объектных моделей Windows (.NET Framework, WMI, WSH, ADSI, CDO и так далее).
Стандартный командный интерпретатор cmd.exe, появившийся в Windows NT и благополучно доживший до последних версий Windows, не имел такой возможности, его основной задачей было обеспечивать обратную совместимость с командным интерпретатором command.com предыдущей операционной системы MS-DOS, в которой не было никаких внутренних объектных систем. По возможностям оболочки cmd.exe и составу системных консольных утилит Windows всегда уступала Unix-подобным системам. Основные усилия разработчиков направлялись на улучшение графической оболочки, а не на командную строку.
Для решения этих проблем Microsoft в начале 2000-х разработала новую оболочку и среду выполнения сценариев Windows PowerShell, которая впитала в себя удачные решения из других оболочек и скриптовых языков. PowerShell обеспечивает прямой доступ из командной строки к внутренним объектам системы и позволяет работать с различными источниками данных (например, с системным реестром или хранилищем сертификатов) по принципу файловой системы. Внутренний набор команд PowerShell можно дополнять собственными командами, которые полностью интегрируются в оболочку.
От всех других оболочек командной строки PowerShell отличает главная особенность — ее ориентация на объекты. Команды PowerShell, которые принято называть командлетами, взаимодействуют друг с другом не с помощью символьных строк, а через объекты. Поэтому работать в PowerShell становится проще, чем в традиционных оболочках: не нужно дополнительно ничего делать, чтобы выделить информацию из символьного потока.

Например, нужно получить упорядоченный по количеству затраченного процессорного времени список процессов, идентификаторы которых больше 1000. Это делается конвейером из трех команд, назначение которых очевидно из их названий:
Get-Process | Where-Object Id -gt 1000 | Sort-Object cpu -Descending
Для поддержки объектов разработчики PowerShell воспользовались объектной моделью .NET Framework. Таким образом, язык PowerShell относится к .NET-языкам программирования (как C#), и при этом он совершенно не похож на другие. Это командно‑скриптовый язык, позволяющий совмещать в сценариях императивный и декларативный стили программирования.
Объединение миров Windows и Linux
Итак, в Windows и Linux живут совершенно разные командные оболочки, однако стараниями Microsoft стало возможным работать с привычной для себя оболочкой в любой системе:
- Bash в Windows. С помощью подсистемы WSL (Windows Subsystem for Linux) можно установить из Microsoft Store один из дистрибутивов Linux и пользоваться его командной оболочкой для работы с файловой системой Windows или запуска Windows-утилит. Также в этом случае можно будет запускать утилиты Linux в командной строке Windows.
- PowerShell в Linux. В 2017 году Microsoft открыла исходный код PowerShell, теперь это Open Source проект (вот репозиторий на GitHub). Оболочка, использующая .NET Core, стала кросс‑платформенной, с ней можно работать в различных дистрибутивах Linux (Debian, Ubuntu, CentOS, Red Hat, openSUSE, Fedora) и в macOS.
Вначале кросс‑платформенная версия оболочки называлась PowerShell Core 6, чтобы явно указать ее зависимость от .NET Core. Начиная с седьмой версии слово Core из названия убрали, теперь оболочка носит имя просто PowerShell. Версия оболочки, базирующаяся на полной платформе Windows .NET Framework, называется Windows PowerShell.
УСТАНОВКА И ЗАПУСК
Установка PowerShell зависит от типа операционной системы и ее версии, соответствующие инструкции имеются на сайте Microsoft. Например, для установки PowerShell в операционной системе Linux Ubuntu 20.04 нужно выполнить следующие команды:
sudo apt-get update
sudo apt-get install -y wget apt-transport-https software-properties-common
wget -q https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update
sudo add-apt-repository universe
sudo apt-get install -y powershell
Чтобы запустить установленную оболочку PowerShell, выполним в терминале команду pwsh. После вывода информации о версии PowerShell мы получим обычное приглашение командной строки с путем к текущему каталогу в качестве префикса.

POWERSHELL КАК КОМАНДНАЯ ОБОЛОЧКА
Для эффективной и удобной работы в командной строке важны два момента.
- Нужно знать названия команд и их ключей. Запомнить их будет проще, если синтаксис команд интуитивно понятен и однороден. Если мы не помним ключи у команды, то должна быть возможность быстро найти справку по этой команде и примеры ее использования.
- Сами команды и их ключи должны быть краткими и удобными для быстрого набора на клавиатуре. Оболочка должна поддерживать механизмы автодополнения, поиска и повтора выполнявшихся ранее команд.
Если со вторым пунктом у стандартных оболочек Linux все хорошо, то похвалиться понятностью имен и ключей команд они не могут: названия многих утилит представляют собой аббревиатуры, придуманные еще в 1960-е годы, а одни и те же ключи в разных командах могут иметь разный смысл. В PowerShell такой проблемы нет.
Структура команд и псевдонимы
В PowerShell имена всех внутренних команд соответствуют шаблону «действие‑объект», например Get-Process (получить информацию о процессе), Get-Content (получить содержимое файла), Clear-Host (очистить экран). Для одинаковых параметров команд используются стандартные имена, структура параметров во всех командах идентична, все команды обрабатываются одним синтаксическим анализатором. Это делает семантику команд очевидной и значительно упрощает запоминание и использование команд PowerShell.
С другой стороны, иногда PowerShell ругают именно за этот многословный и необычный для других оболочек синтаксис. Например, нам нужно создать в текущем каталоге пустой файл 1.txt. В Bash это делается командой touch из пяти букв:
~ touch 1.txt
При создании файла в PowerShell с помощью команды New-Item с параметрами потребуется ввести больше двадцати символов.

Выглядит ужасно, правда? Но того же результата можно добиться, набрав команду ni всего из двух символов.

Команда ni — это стандартный псевдоним для New-Item (сокращение по первым буквам слов команды), значение File для параметра -Type используется по умолчанию, имя параметра -Path можно опустить.
Таким образом, стандартные псевдонимы PowerShell, полный список которых можно получить с помощью команды Get-Alias, помогают быстро вводить команды и создавать компактные и лаконичные конвейеры из нескольких команд.

Отметим, что в Windows PowerShell за некоторыми командлетами закреплены псевдонимы, соответствующие стандартным командам Unix-подобных систем: ls, rm, cp, mv, cat, ps, man, mount. В PowerShell 6/7 данные псевдонимы не определены, их ввод приведет к выполнению «родных» команд Linux.
Доступность команд
В .NET Core/.NET 5 реализована не вся функциональность платформы .NET Framework, поэтому в PowerShell 6/7 по умолчанию загружается меньше модулей и будет доступно меньше команд, чем в Windows PowerShell. Например, под Linux недоступны команды *-Service, *-Acl, *-Event, Set-ExecutionPolicy.
Часть из отсутствующих модулей напрямую связаны с особенностями операционной системы Windows и не могут быть перенесены на другие платформы (так, в PowerShell для Linux отсутствуют провайдеры и виртуальные диски для системного реестра и хранилища сертификатов), некоторые модули могут быть добавлены в следующих версиях PowerShell.
При работе с PowerShell в Linux необходимо учитывать особенности операционной системы.
- Зависимость от регистра символов. Сама оболочка PowerShell, как и операционная система Windows, не зависит от регистра символов. Например, имена
$aи$Aобозначают одну и ту же переменную, название командлетов можно писать в любом регистре (Get-Process,get-processилиGET-PROCESS), в путях к файлам и каталогам в Windows тоже можно использовать символы в разных регистрах (C:\Windows, c:\windows или C:\WINDOWS). Напротив, в Linux важен регистр символов в путях к каталогам и файлам или в именах переменных среды. Поэтому для запуска сценариев, загрузки модулей и корректной работы автодополнения файловых путей в этих системах нужно писать точные имена с учетом регистра символов. Названия самих командлетов и переменных PowerShell по‑прежнему от регистра не зависят. - Разделители в путях файловой системы. В Windows в качестве разделителей в путях к файлам и каталогам можно использовать символы слеша / и обратного слеша . В Linux используется только символ слеша /.
- Запуск команд от имени суперпользователя (sudo). Для выполнения какой‑либо одной команды с привилегиями суперпользователя root в оболочке Linux используется команда sudo. В сеансе работы PowerShell напрямую применить sudo не получится, нужно с ее помощью запустить новый экземпляр оболочки, и все команды PowerShell будут выполняться от имени суперпользователя.
Справочная система
При работе с интерактивной командной оболочкой важно иметь под рукой подробную и удобную справочную систему с описанием возможностей команд и примерами их применения. В PowerShell такая система имеется, в Linux она работает так же, как в Windows, с помощью команды Get-Help.

Подробная справочная информация о командах PowerShell (описания каждого из параметров команды, различные замечания и примеры запуска команды с различными параметрами и аргументами) хранится в интернете на сайтах Microsoft. С помощью команды Update-Help можно загрузить справочные файлы на свою машину, чтобы обращаться к ним быстрее:
Update-Help -Force -UICulture en-US
Отметим, что командлет Get-Help позволяет просматривать справочную информацию не только о разных командах, но и о синтаксисе языка PowerShell, о псевдонимах, функциях, скриптах и других аспектах работы оболочки. Список тем, обсуждение которых представлено в справочной службе PowerShell, можно увидеть с помощью команды Get-Help about_*.

Работа в командной строке
При запуске PowerShell автоматически загружается модуль PSReadLine, обеспечивающий удобную интерактивную работу в командной строке.
Названия командлетов, параметров и переменных, ключевые конструкции и другие элементы языка PowerShell при вводе в командную строку отображаются разными цветами. Если при наборе команды получается синтаксически неверная конструкция (например, мы забыли поставить закрывающую скобку или не написали команду после знака конвейера), то последний знак > в приглашении командной строки становится красным.

В PowerShell поддерживается автоматическое завершение имен команд, их параметров и путей к файлам и каталогам. Для этого используется клавиша Tab. Например, если набрать символы get-p и нажать Tab, то в командной строке появится команда Get-Process.
Если для завершения возможны несколько вариантов, то они будут выведены все, а ввод команды продолжится. Таким образом, при вводе команды можно узнать все ее возможные параметры, даже не обращаясь к справочной системе (в стандартных оболочках Linux такой возможности нет).

Если ты помнишь только часть команды (необязательно сначала), то по ней можно найти подходящие варианты среди тех команд, которые выполнялись в оболочке раньше. По умолчанию интерактивный поиск в таком режиме активируется нажатием клавиш Ctrl + r (поиск по истории команд назад) или Ctrl + s (поиск по истории команд вперед).

При наборе команды PowerShell может cразу выдавать подходящий вариант из списка вводившихся команд, который можно принять одним нажатием стрелки вправо. Активируется этот режим следующей командой: Set-PSReadLineOption -PredictionSource 'History'.

Текущие сочетания клавиш, назначенные в PSReadLine для выполнения действий, можно посмотреть с помощью команды Get-PSReadlineKeyHandler.

Изменить сочетания клавиш позволяет команда Set-PSReadlineKeyHandler. Например, назначим клавишам со стрелками вверх и вниз функции HistorySearchBackward (поиск назад по истории команд) и HistorySearchForward (поиск вперед по истории команд) соответственно.

Теперь можно будет подставлять в командную строку команды из истории, набрав в командной строке их начальные символы и нажимая стрелку вверх или вниз.
Чтобы не набирать при каждом запуске PowerShell команды для настройки PSReadLine, их нужно поместить в свой профиль — это скрипт, который автоматически выполняется при каждом запуске PowerShell. Путь к профилю хранится в переменной $PROFILE.

ВЫВОДЫ
Оболочка PowerShell вполне пригодна для комфортного использования в Linux, особенно если ты уже работал с ней в Windows, привык к объектной природе этой оболочки, оценил ее возможности и особенности. В состав PowerShell входит множество стандартных командлетов, в том числе для работы с файловой системой, структурированными данными (в форматах CSV и JSON) и веб‑ресурсами по протоколу HTTP.
Кроме внутренних командлетов, в оболочке можно выполнять любые консольные утилиты, установленные в операционной системе. Поэтому получится комбинировать возможности команд Linux с собственными механизмами PowerShell (конвейерная обработка объектов, гибкая система форматирования выводимой информации, обработка возникающих ошибок), а также пользоваться всей функциональностью библиотек платформы .NET Core/.NET 5 (например, для обработки символьной информации или работы с датами и временем).
Отдельного внимания заслуживают скрипты PowerShell. Для автоматизации работы в Linux необязательно углубляться в дебри Bash-скриптинга или отказываться от удобств и простоты командного языка, полностью переходя на Python. Если ты уже писал скрипты PowerShell в Windows, то и в Linux сможешь пользоваться своими наработками и создавать новые решения.
Особых отличий в скриптах PowerShell для разных платформ нет, однако интегрированная среда для разработки PowerShell ISE доступна только в PowerShell для Windows, в состав PowerShell 6/7 она не входит. Для разработки скриптов в Linux Microsoft рекомендует использовать редактор Visual Studio Code с расширением для поддержки языка PowerShell.
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei