«Сан­кции», «импорто­заме­щение» — эти сло­веч­ки в пос­леднее вре­мя все чаще встре­чают­ся в прес­се и сетевых пуб­ликаци­ях. Под дав­лени­ем обсто­ятель­ств некото­рые ком­пании перехо­дят на 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).

Командная строка в Linux
Ко­ман­дная стро­ка в Linux

Фун­кци­ональ­ность этих коман­дных интер­пре­тато­ров и набор кон­соль­ных ути­лит базиру­ются на стан­дарте 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
PowerShell в Linux
 

PowerShell как командная оболочка

Для эффектив­ной и удоб­ной работы в коман­дной стро­ке важ­ны два момен­та.

  1. Нуж­но знать наз­вания команд и их клю­чей. Запом­нить их будет про­ще, если син­таксис команд инту­итив­но понятен и одно­роден. Если мы не пом­ним клю­чи у коман­ды, то дол­жна быть воз­можность быс­тро най­ти справ­ку по этой коман­де и при­меры ее исполь­зования.
  2. Са­ми коман­ды и их клю­чи дол­жны быть крат­кими и удоб­ными для быс­тро­го набора на кла­виату­ре. Обо­лоч­ка дол­жна под­держи­вать механиз­мы авто­допол­нения, поис­ка и пов­тора выпол­нявших­ся ранее команд.

Ес­ли со вто­рым пун­ктом у стан­дар­тных обо­лочек Linux все хорошо, то пох­валить­ся понят­ностью имен и клю­чей команд они не могут: наз­вания мно­гих ути­лит пред­став­ляют собой аббре­виату­ры, при­думан­ные еще в 1960-е годы, а одни и те же клю­чи в раз­ных коман­дах могут иметь раз­ный смысл. В PowerShell такой проб­лемы нет.

 

Структура команд и псевдонимы

В PowerShell име­на всех внут­ренних команд соот­ветс­тву­ют шаб­лону «дей­ствие‑объ­ект», нап­ример Get-Process (получить информа­цию о про­цес­се), Get-Content (получить содер­жимое фай­ла), Clear-Host (очис­тить экран). Для оди­нако­вых парамет­ров команд исполь­зуют­ся стан­дар­тные име­на, струк­тура парамет­ров во всех коман­дах иден­тична, все коман­ды обра­баты­вают­ся одним син­такси­чес­ким ана­лиза­тором. Это дела­ет семан­тику команд оче­вид­ной и зна­читель­но упро­щает запоми­нание и исполь­зование команд PowerShell.

С дру­гой сто­роны, иног­да PowerShell руга­ют имен­но за этот мно­гос­ловный и необыч­ный для дру­гих обо­лочек син­таксис. Нап­ример, нам нуж­но соз­дать в текущем катало­ге пус­той файл 1.txt. В Bash это дела­ется коман­дой touch из пяти букв:

~ touch 1.txt

При соз­дании фай­ла в PowerShell с помощью коман­ды New-Item с парамет­рами пот­ребу­ется ввес­ти боль­ше двад­цати сим­волов.

Создание файла 1.txt c помощью команды New-Item
Соз­дание фай­ла 1.txt c помощью коман­ды New-Item

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

Создание файла 2.txt c помощью команды ni
Соз­дание фай­ла 2.txt c помощью коман­ды ni

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

Та­ким обра­зом, стан­дар­тные псев­донимы PowerShell, пол­ный спи­сок которых мож­но получить с помощью коман­ды Get-Alias, помога­ют быс­тро вво­дить коман­ды и соз­давать ком­пак­тные и лаконич­ные кон­вей­еры из нес­коль­ких команд.

Получение полного списка псевдонимов c помощью команды Get-Alias
По­луче­ние пол­ного спис­ка псев­донимов c помощью коман­ды 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 необ­ходимо учи­тывать осо­бен­ности опе­раци­онной сис­темы.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Подписаться
Уведомить о
2 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии