Аналог powershell в linux
Этичный хакинг и тестирование на проникновение, информационная безопасность
PowerShell — это платформа, инструмент автоматизации и настройки, который работает в различных операционных системах. PowerShell это больше чем просто скриптовый язык программирования, PowerShell содержит функции для управления локальным и удалённым компьютером. В зависимости от установленного ПО (в первую очередь административного и серверного программного обеспечения) количество функций (командлетов) PowerShell может быть различным.
Знание PowerShell необходимы системным администраторам Windows, а также аудиторам безопасности, поскольку имеется достаточно много отличных и уникальных инструментов, написанных на PowerShell (в первую очередь направленных на пентест Windows). Для продвинутых пользователей Windows знание PowerShell не будет лишним, т. к. с его помощью можно автоматизировать рутинные задачи и более тонко (или просто быстрее чем через графический интерфейс) настроить свою систему Windows.
PowerShell имеет богатые возможности, активно развивается, портирован на Linux, имеет огромную справку, которая также активно поддерживается и развивается. Эта статья посвящена не языку PowerShell, а настройке рабочего окружения для поддержки PowerShell и запуску скриптов — хотя PowerShell предустановлен в каждую Windows, свои особенности (трудности) есть даже там. Проще говоря, эта статья посвящена не тому, как написать свою первую программу «Hello, World!» на PowerShell, а тому, как запустить готовую программу «Hello, World!» в PowerShell.
Отличия PowerShell и CMD в Windows
В Windows PowerShell уже давно устанавливается по умолчанию.
Чтобы открыть PowerShell, нажмите Win+x и выберите Windows PowerShell (администратор):
В приглашении командной строки вы увидите PS и текущую рабочую директорию:
Чтобы открыть CMD нужно нажать Win+r, напечатать cmd и нажать ENTER:
Приглашение командной строки CMD выглядит так:
В CMD можно запустить:
- утилиты командной строки Windows
- встроенные функции CMD
- файлы .bat
В PowerShell можно запустить всё то же самое, что и в CMD, а также дополнительно:
- команды языка PowerShell
- скрипты PowerShell
В PowerShell сработает такая простая команда как dir:
Но если выполнить эту команду в PowerShell и в CMD, то можно увидеть, что вывод этих команд различается.
А если попытаться выполнить эту команду с опцией, например:
То в CMD она сработает, а в PowerShell завершится ошибкой.
Дело в том, что вместо реализации таких же утилит как в CMD, в PowerShell используются собственные командлеты, работа которых различается, например, выводом или поддержкой опций. В PowerShell сработают команды cd, ls, dir, cat, man, kill, mount, move, sort, pwd, wget, curl и другие, знакомые по Linux, но это НЕ ОЗНАЧАЕТ что эти команды поддерживают те же самые опции, что и опции в Linux. Это просто аналоги, причём довольно грубые. Точнее говоря, это псевдонимы команд PowerShell. Полный список псевдонимов вы можете просмотреть командой:
Как установить PowerShell в Linux
PowerShell работает также и в Linux, но некоторые команды PowerShell отсутствуют в Linux. При запуске скриптов PowerShell в Linux возникнут проблемы в следующих случаях:
- в скрипте используются команды, которые отсутствуют в Linux версии PowerShell (например, из-за того, что связаны с настройками Windows или неприменимы для Linux по другим причинам)
- скрипт обращается к переменным окружения Windows
- в скрипте используются утилиты Windows, отсутствующие в Linux
Могут быть и другие причины проблем, но много всё равно работает.
Многие дистрибутивы Linux поддерживаются официально и простые инструкции по установке PowerShell в свой дистрибутив, а также установочные файлы вы найдёте здесь: Как установить PowerShell в Linux.
Установка PowerShell в Kali Linux
PowerShell добавлен в стандартные репозитории Kali Linux, поэтому установка очень простая:
Установка PowerShell в Arch Linux, BlackArch
Чтобы узнать версию PowerShell выполните команду:
Как запустить скрипт PowerShell в Windows
Для запуска скрипта с расширением .ps1 нужно открыть консоль PowerShell и затем указать полный путь до файла. Вы также можете перейти в папку со скриптом либо с помощью команды cd, либо, если вы хотите полностью окунуться в стиль PowerShell, то можете использовать Set-Location.
Например, мне нужно перейти в папку C:\Users\Администратор\Downloads\WinPwn-master\:
Если вы просто попытаетесь запустить скрипт, то почти наверняка столкнётесь с ошибкой, что запуск скриптов запрещён. Для исправления ошибки выполните команду:
Запуск скрипта с помощью Import-Module
При запуске некоторых скриптов может ничего не происходить. Дело в том, что скрипт может содержать в себе функцию, которую нужно импортировать, а затем запустить. Поищите в документации по интересующей вас программе примеры со строкой Import-Module.
Например для запуска WinPwn нужно вначале импортировать файл с функциями:
А после этого можно вызывать содержащиеся в файле функции:
Как запустить скрипт PowerShell в Linux
В Linux для вызова консоли PowerShell нужно набрать:
Затем в консоли PowerShell либо просто запустите желаемый скрипт:
Либо запустите функцию после импорта файла с помощью Import-Module. Пример запуска через импорт одной из функции Invoke-TheHash:
Как получить справку по командам в PowerShell
Если вы хотите получить справку по опциям функции, команды или программы в PowerShell, то используйте команду Get-Help, после которой укажите другую команду, по которой вы хотите получить справку:
Для получения справки по Set-Location:
Для получения справки по Invoke-SMBEnum (после импорта функции из файла):
Как обновить PowerShell до последней версии
По умолчани в Windows 10 предустановлена версия PowerShell 5, но в настоящее время последней версией является PowerShell 7. Чтобы обновиться до последней версии смотрите статью «Как установить PowerShell 7 в Windows 10». Обратите внимание, что PowerShell 7 не заменит PowerShell 5. То есть в системе будут доступны обе версии PowerShell.
Адаптация скриптов PowerShell для Linux
Я сам только начинаю знакомство с PowerShell, но хочу привести интересный пример, как можно самостоятельно решить проблему и запустить скрипт PowerShell в Linux не смотря на то, что он выдавал ошибку.
В Invoke-TheHash есть функция Invoke-SMBEnum, которая выполняет перечисление пользователей, групп, сетевых сессий и совместных ресурсов. В Windows эта функция работает отлично. Попробую использовать её в Linux.
Запускаю консоль PowerShell:
Перехожу в папку с уже скаченными скриптами:
Импортирую файл с нужной функцией:
Если попытаться выполнить отдельно команду из этой строки:
то она вызовет эту же самую ошибку:
Можно предположить (лучше посмотреть в справке, но мне лень туда лезть), что env имеет отношение к переменным окружения, а computername — это имя переменной, которая содержит (как следует из названия) имя компьютера. Судя по всему, в Linux эта переменная окружения не существует.
Самое простое решение — прописать это имя вручную. Для этого открываю файл Invoke-SMBEnum.ps1 текстовым редактором, нахожу там строку
И меняю её на такую строку:
То есть я просто прописал имя компьютера вместо получения его с помощью функции.
Важно помнить, что после импорта функция будет считываться не из файла, который я изменил, а из памяти. Поэтому чтобы PowerShell увидел сохранённые в файле изменения, нужно заново выполнить импорт файла — для этого пришлось закрыть (CTRL+d) и открыть заново PowerShell:
И после этого вновь запускаю команду:
В этот раз команда сработала.
- после внесения изменений в файл нужно заново его импортировать (возможно, даже перезайти в PowerShell)
- некоторые проблемы с запуском скриптов PowerShell в Linux достаточно просто решить самостоятельно
Задать вопрос по PowerShell
На этой странице я планирую добавлять ответы на часто возникающие вопросы и решения для частых проблем у новичков с PowerShell, поэтому если вам что-то ещё не понятно, то спрашивайте здесь в комментариях.
Про общий синтаксис и основы языка PowerShell написано немало, есть огромное количество литературы, статей и видео на данную тему. Те же циклы и счетчики описаны уже не по одному десятку раз, поэтому в данной статье о них ничего не рассказано. Если вдруг про пошик ты узнал совсем недавно, то есть смысл обратиться в гугл с банальным запросом вида «powershell tutorial for beginners pdf».
Общие правила игры
Сперва давай разберемся с наиболее простым, но не менее важным — с тем, как работать с переменными. Скажем, если в bash для объявления переменной достаточно написать foo=1 , то для PowerShell нужно добавить знак доллара — $foo=1 . Для вывода значения переменной на экран можно воспользоваться универсальным echo или, если работаешь с пошиком, командлетом Write-Host . Длиннее? Да, безусловно, но при этом с помощью данного командлета можно весьма интересно управлять выводом:
К примеру, данный код выведет последовательность цифр в скобках, между цифрами поставит знак -> плюс раскрасит бэкграунд и сам текст. Конечно, для скрипта на коленке это не нужно, но вот для каждодневного отчета почему бы и нет.
Пример работы командлета Write-Host
Нужно что-либо сравнить? Для этого есть целая таблица, которая так или иначе знакома любому линуксоиду:
Аргумент | Тип | Описание |
---|---|---|
eq | Equal | Равно |
ne | Not equal | Не равно |
ge | Greater than or equal | Больше или равно |
gt | Greater than | Больше |
lt | Less than | Меньше |
le | Less than or equal | Меньше или равно |
like | Wildcard comparison | Использование символов подстановки для поиска соответствия образцу. Пример: "file.doc" -like "f*.do?" |
notlike | Wildcard comparison | Использование символов подстановки для поиска несоответствия образцу. Пример: "file.doc" -notlike "p*.doc" |
match | Regular expression comparison | Использование регулярных выражений для поиска соответствия образцу |
notmatch | Regular expression comparison | Использование регулярных выражений для поиска несоответствия образцу |
replace | Replace operator | Заменяет часть или все значение слева от оператора |
contains | Containment operator | Определяет, содержит ли значение слева от оператора значение справа. В отличие от предыдущих операторов результатом является булево значение. Пример: 1,2,3 -contains 1 |
notcontains | Containment operator | Определяет, что значение слева от оператора не содержит значения справа. Результат — булево значение. Пример: 1,2,3 -notcontains 4 |
Для логических операторов это:
Аргумент | Описание |
---|---|
and | Оба условия должны быть истинны, чтобы выражение было истинно. Пример: (1 -eq 1) -and (2 -eq 2) |
or | Одно или оба условия должны быть истинны, чтобы выражение было истинно. Пример: (1 -eq 1) -or (1 -eq 2) |
xor | Одно условие должно быть истинно, а второе должно иметь значение «ложь», чтобы выражение было истинно |
not | Указанные условия должны иметь значение «ложь», чтобы выражение было истинно. Пример: -not (1 -eq 2) |
! | Указанное условие должно иметь значение «ложь», чтобы выражение было истинно. Пример: ! (1 -eq 2) |
Также будет полезно для типов:
Аргумент | Описание |
---|---|
is | Является типом |
isnot | Не является типом |
as | Как тип, без ошибки, если возникает неудача преобразования |
Если использовать данный код без типа int, мы получим дробное значение, что нам не очень нужно.
Алиасы
Для упрощения работы с PowerShell можно использовать алиасы. Думаю, тебе будет интересно самому взглянуть на список актуальных алиасов в своей системе. Для этого нужно выполнить командлет Get-Alias.
С помощью алиасов можно ссылаться даже на программы. К примеру, сделаем алиас на запуск калькулятора.
Теперь при вводе calc у нас будет запускаться калькулятор. Если хочется записать на алиас какую-нибудь команду с параметрами, то нужно использовать функцию
Стоит отметить, что после закрытия оболочки PowerShell все созданные алиасы будут удалены. Чтобы этого не происходило, их нужно сохранить в свой пользовательский профиль. Вообще для PowerShell существует аж четыре профиля. Посмотреть их можно командой
А протестировать на наличие в системе — командой
Если в ответ возвращается False, то их просто нет. Создадим наш файл, к примеру по первому пути:
и в него напишем наши алиасы:
После сохранения и перезапуска пошик будет автоматически подгружать данный файл, и теперь настройки никуда не денутся. Стоит упомянуть и что по умолчанию в системе отключен запуск любых сценариев и, скорее всего, наш внешний файл будет забракован системой. Чтобы этого не произошло, давай посмотрим, что стоит в политике. Выполни в консоли PowerShell:
Скорее всего, система вернет значение Restricted, что как раз означает запрет выполнения сценариев. Чтобы это обойти, выполни из-под администратора:
После подтверждения сценарии будут запускаться без ошибок и наш файл тоже будет работать.
Погружаемся глубже
Теперь давай перейдем к наиболее востребованным тулзам «Линукса» и их аналогам в PowerShell. Начнем, как обычно, от простого к сложному.
Продолжение доступно только участникам
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Windows и Linux являются очень производительными операционными системами, и у каждой из них есть множество плюсов и минусов, которые мы можем обсудить. Но как часто вы задумываетесь о потенциале сценариев и автоматизации двух операционных систем? Мы решили посмотреть, что можно делать с помощью скриптовых функций, поставляемых с Windows и Linux.
Немного истории: PowerShell
PowerShell - это среда автоматизации и задач Microsoft, удобная для управления конфигурацией. PowerShell использует компоненты, называемые командлетами, которые встроены в PowerShell. Дополнительные функции доступны через модули. Они устанавливаются из галереи PowerShell непосредственно из командной строки.
Немного истории: Bash
Системы Linux и Unix всегда выигрывали от структурирования многопользовательской терминальной среды. Это означает, что вы можете запускать дополнительные сессии в той же системе и запускать сценарии и приложения, не влияя на основные сессии, в которые вошли другие пользователи. Это сильно отличалось от ранних систем Windows и DOS, которые были однопользовательскими средами с одной сессией, до появления Windows NT в середине 90-х годов.
Первоначальная оболочка, поставляемая с Unix, была известна как оболочка Bourne , названная в честь ее создателя Стивена Борна. Bash (Bourne again Shell) является преемником оболочки Bourne с открытым исходным кодом. Bash получил широкое распространение, когда Linux был создан в начале 90-х годов, поэтому он используется до сих пор.
Существует множество функций, которые делают Bash очень популярным, главными из которых являются стабильность системы и то, что это открытый исходный код. Из-за этого он встречается практически в каждом дистрибутиве Linux. Все эти факторы делают его одной из наиболее часто используемых сред сценариев для ИТ-специалистов.
Когда использовать PowerShell
Администрирование Windows стало намного проще с тех пор, как разработка PowerShell стала частью среды Microsoft. Вместо того, чтобы бороться с неудобными пакетными файлами и планировщиком Windows, системные администраторы получают доступ к новому набору инструментов с впечатляющими приложениями и функциями.
PowerShell может уточнять детали для создания эффективных скриптов, а также некоторых коммерчески доступных приложений. PowerShell может извлекать данные прямо из подсистемы WMI, предоставляя вам в режиме реального времени глубокую информацию обо всем, от идентификаторов процессов и счетчиков обработчиков.
Когда использовать Bash
Если вы используете системы Linux, значит, вы знаете о необходимости автоматизации задач. Ранние ленточные накопители использовались для резервного копирования с архивированием tar. Эти операции могут быть написаны в Bash, а затем запущены через расписание cron. Сегодня мы воспринимаем подобные вещи как должное, но многие задачи приходилось выполнять вручную до создания таких сред, как Bash. Все, что связано с манипуляциями с файлами, такими как архивирование, копирование, перемещение, переименование и удаление файлов, подходит Bash.
Также возможны более сложные манипуляции с файлами. Вы можете найти файлы, созданные в определенные даты, и для каких файлов были изменены права доступа CHMOD и владельца. Bash также отлично подходит для создания интерактивных меню для запуска скриптов и выполнения системных функций. Они выполняются в неграфической среде, но работают очень хорошо. Это отлично подходит для обмена вашими библиотеками скриптов с другими.
Отличия
PowerShell и Bash в чем-то похожи, но также очень разные. Вот четыре основных отличия.
PowerShell по-разному обрабатывает данные
PowerShell отличается от Bash способом обработки данных. PowerShell - это язык сценариев, но он может передавать данные в разных форматах таким образом, чтобы он выглядел как язык программирования. PowerShell также имеет дело с областями действия в своих скриптах.
Использование переменных с $session, $script и $cache дает вашим сценариям дополнительную гибкость, позволяя передавать переменные другим командам в том же сценарии или сеансе PowerShell.
Bash - это CLI
Bash - это CLI (Command Language Interpreter) , что означает интерпретатор командного языка. Как и PowerShell, Bash может передавать данные между командами по каналам. Однако эти данные отправляются в виде строк. Это ограничивает некоторые вещи, которые вы можете делать с выводом ваших скриптов, например математические функции.
PowerShell - это и CLI, и язык
Интегрированная среда сценариев PowerShell по умолчанию ( ISE - Integrated Scripting Environment ), поставляемая с Windows, показывает, как можно быстро и легко создавать сценарии, не жертвуя прямым доступом к командной строке. По умолчанию верхний раздел позволяет набирать строки кода сценария и быстро его тестировать.
Окно ниже представляет собой командную строку PowerShell, которая дает вам быстрый доступ для выполнения отдельных команд. Это дает вам лучшее из обоих миров между языком сценариев и оболочкой командной строки. ISE - отличный инструмент для быстрого создания прототипов решений.
Компания Microsoft уже несколько лет развивает свободную версию командной оболочки PowerShell Core. Она использует открытый код, а её реализация, хоть и в урезанном виде, доступна и на Linux.
Мы рассмотрим особенности PowerShell, основные команды и способ установки. Это поможет определиться тем, кто хочет перейти с Windows на Linux, но при этом продолжить использование PowerShell. Скажем сразу, PowerShell не способна заменить Bash.
Что такое PowerShell?
В Linux PowerShell не столь функционален, как в Windows. Во многом это связано с тем, что оболочка создавалась для администрирования операционной системы от Microsoft. Так что просто перенести скрипты на Linux не получится, в них наверняка есть обращения к реестру, планировщику и прочим программам, относящимся к Windows.
Также к особенностям PowerShell стоит отнести наличие алиасов у команд. Тем самым вы можете даже не заметить, но при использовании оболочки она будет задействовать собственные команды, практически не отличимые от родных команд. К слову, команды Bash также доступны в этой оболочке. Стоит отметить и то, что при удалённой работе через SSH PowerShell не даст использовать sudo.
В PowerShell при вызове pwd на самом деле исполняется get-location
Установка PowerShell в Linux
Несмотря на то, что PowerShell появился на Linux более пяти лет назад, его не спешат добавлять в репозитории. Он прописался в списках Альт, Arch, CentOS и Slackware. В остальных дистрибутивах лучше воспользоваться snap-пакетом.
Для установки PowerShell используйте команду:
sudo snap install powershell --classic
Вызвать оболочку можно командой:
Работа с PowerShell в Linux
Давайте рассмотрим несколько основных команд PowerShell. Они не чувствительны к регистру, поэтому сложные команды запишем с использованием CamelCase.
- $PSVersionTable – узнать версию оболочки;
- get-command – вывести список доступных команд;
- get-alias – вывести список алиасов;
- set-alias -name имя_алиаса -value имя команды – создать алиас;
- remove-item alias:имя_алиаса – удалить алиас в текущей сессии;
- find-module – вывести список доступных модулей;
- install-module имя_модуля – установить модуль;
- get-help имя_команды – получить описание команды, её синтаксис и алиасы;
- get-ChildItem – вывести содержимое папки;
- new-item -ItemType directory -name 'имя_папки' – создать новую папку;
- new-item имя_файла.abc – создать новый файл с расширением abc;
- get_content имя_файла – вывести содержимое файла;
- select_string -path имя_файла -pattern 'текст' – вывести имя файла, номер строки и содержимое строки, содержащее искомый текст.
Например, для того чтобы найти модуль bash выполните:
Модуль Bash относится к WSL, на Linux он бесполезен
Теперь рассмотрим get-СhildItem подробнее, с её помощью можно также искать файлы. Вот полезные параметры:
- -path – указать путь;
- -force – включить отображение скрытых файлов;
- -recurse – поиск в подкаталогах;
- -name – вывести только имена файлов;
- -FollowSymLink – следовать по символическим ссылкам;
- -include – имя должно содержать указанный текст. Например, -include ('*error*'+'*.log'), где '' ограничивают запрос, * указывает на позицию текста в имени, + (И) объединяет два условия, также можно использовать , (ИЛИ);
- -exclude – исключает из выдачи файлы, содержащие указанный текст.
Нельзя не отметить то, что PowerShell опирается на объекты. К сожалению, в Linux эту функциональность нельзя задействовать в полной мере, да и перевод строк в объекты -нетривиальная задача, поэтому совмещать команды Bash и PowerShell – не лучшая идея.
Выводы
Теперь вы знаете как пользоваться PowerShell в Linux. В текущем виде едва ли может стать заменой Bash, для этого надо проделать большую работу по переносу команд или их адаптации под особенности и возможности этой оболочки. Пока что использование PowerShell в Linux превращается в комбинирование собственных команд и тех, что есть в системе изначально.
Если же говорить о переносе скриптов из Windows, то корректно заработают лишь единичные образцы, всё же Windows во многих ситуациях обращается к собственным библиотекам и реестру. Также могут быть проблемы с тем, что оболочка использует алиасы и команды, перекрывающие родные команды Linux.
К плюсам PowerShell можно отнести лишь более понятные команды и синтаксис, но всё это перевешивают минусы. При использовании в Linux происходит путаница с командами, логика Bash (работа со строками) плохо сочетается с принципами PowerShell (работа с объектами), подключаемые модули написаны для Windows, да и в целом набор команд не позволит писать полноценные скрипты для Linux.
При переходе с bash на PowerShell часто возникают неудобства, связанные с незнанием, какие есть аналоги в PowerShell и как ими пользоваться. К примеру, лично мне очень нравится bash своей логикой. Вот нужно вам из текстового файла найти только что-то определенное, и вы знаете, что для этого нужно задействовать, скажем, cat и grep. А вот при написании подобного на PowerShell часто возникает полный ступор. И вроде вся логика понятна, и скрипт-то в одну строку, а как реализовать — неясно. Именно с этим и предлагаю разобраться в сегодняшней статье.
Про общий синтаксис и основы языка PowerShell написано немало, есть огромное количество литературы, статей и видео на данную тему. Те же циклы и счетчики описаны уже не по одному десятку раз, поэтому в данной статье о них ничего не рассказано. Если вдруг про PowerShell вы узнали совсем недавно, то есть смысл обратиться в поисковую систему с банальным запросом вида «powershell tutorial for beginners pdf».
Общие правила в PowerShell
Сперва давайте разберемся с наиболее простым, но не менее важным — с тем, как работать с переменными. Скажем, если в bash для объявления переменной достаточно написать foo=1 , то для PowerShell нужно добавить знак доллара — $foo=1 . Для вывода значения переменной на экран можно воспользоваться универсальным echo или, если работаешь с пошиком, командлетом Write-Host . Длиннее? Да, безусловно, но при этом с помощью данного командлета можно весьма интересно управлять выводом:
Write - Host ( 2 , 4 , 6 , 8 , 10 , 12 ) - Separator "->" - ForegroundColor DarkMagenta - BackgroundColor WhiteК примеру, данный код выведет последовательность цифр в скобках, между цифрами поставит знак -> плюс раскрасит бэкграунд и сам текст. Конечно, для скрипта на коленке это не нужно, но вот для каждодневного отчета почему бы и нет.
Пример работы командлета Write-Host
Нужно что-либо сравнить? Для этого есть целая таблица, которая так или иначе знакома любому линуксоиду:
Читайте также: