Настройка рабочего окружения powershell в windows и linux
Компания 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.
В прошлой статье я обещал рассмотреть механизм удаленного подключения с Windows на серверы под управлением *nix, и наоборот при помощи PowerShell. Обещанного обычно ждут три года, но я успел чуть раньше. Что ж, если хочется с верного макбука управлять гетерогенной инфраструктурой, или наоборот ― с Surface Pro рулить Linux-серверами без всяких putty, ― прошу под кат.
Еще в 2015 году Microsoft торжественно объявила о запуске программы «Microsoft Linux». Сюда вошла как банальная поддержка гостевых *nix-like OS на Hyper-V, так и встроенная в Windows 10 Ubuntu и возможность запуска в Docker продуктов Microsoft, таких как SQL Server.
Компания также опубликовала исходный код PowerShell, что позволило запускать «Ракушку Мощи» не только на Windows. Из-под одноименного аккаунта на Github, помимо исходного кода, выложены и бинарники под большинство современных систем (лицензия MIT).
Это позволяет настроить удаленное управление с помощью единого инструмента ― PowerShell. Помимо подключения к консоли компьютера, можно запускать отдельные команды, в том числе и на нескольких серверах одновременно. Довольно удобно для автоматизации задач администрирования, таких как массовое изменение настроек, инвентаризация, сбор логов.
Порой удобно совмещать традиционные консольные команды со вставками PowerShell:
Для подключения к Windows-машинам при помощи PowerShell используется протокол WS-Man. Для GNU\Linux привычен SSH. Так как сегодня становятся универсальными оба протокола, разберем их подробнее.
PowerShell 6.0 под Windows и *nix, пока еще находится в бете. Поэтому не рекомендую без хорошего тестирования применять на боевых серверах описанное ниже.
Когда технология удаленного доступа при помощи PowerShell только набирала обороты, единственным универсальным способом подключения к разным системам был протокол WS-Man. Для тестового стенда я взял Windows Server 2016 и Centos 7, для которых и буду настраивать возможность удаленного подключения и выполнения команд при помощи этого протокола.
Для начала установим на Centos свежий PowerShell:
После установки появилась возможность запускать привычные Windows-администратору командлеты. Например, посмотрим версию PS и получим список запущенных процессов командлетами $PSVersionTable и Get-Process:
Работаем в консоли PowerShell на CentOS.
Чтобы подключаться к Linux-машине с консоли Windows, нам понадобится установить и настроить:
- OMI (Open Management Infrastructure) ― адаптация WMI, которую также можно использовать для управления компьютерами с ОС, отличными от Windows;
- PSRP (PowerShell Remoting Protocol) ― библиотека, необходимая для удаленного подключения PowerShell.
Подробно с работой и эволюцией OMI и PSRP можно ознакомиться в отличном материале от Matt Wrock, я же просто установлю OMI командой:
Далее нужно настроить порты и аутентификацию в конфигурационном файле /etc/opt/omi/conf/omiserver.conf, после чего перезапустить сервер командой:
Для упрощения эксперимента я не буду настраивать ни NTLM-аутентификацию, ни Kerberos. Еще и шифрование отключу ― разумеется, в боевой среде делать этого не стоит. Для включения текстовой аутентификации и шифрования на стороне Windows в работе winrm достаточно выполнить следующие команды:
После настройки можно проверить работу OMI из консоли Windows:
Подключаемся к CentOS из cmd.
Теперь проверим работу обратным подключением ― из Linux к Windows:
… а затем с CentOS подключаемся к Windows.
После того, как WMI\OMI заработал, нужно установить и настроить PSRP. К сожалению и вопреки инструкции, бинарник отсутствует. Библиотеку пришлось компилировать, долго и нудно исправляя возникающие ошибки зависимостей:
Теперь мы сможем подключаться с Windows на Linux и наоборот при помощи PowerShell. Начнем с Windows на Linux:
С Windows на Linux.
Аналогичным образом можно провести и обратное подключение.
Invoke-Command можно «натравить» на список компьютеров, и с рабочей станции Windows создать пользователя на всех серверах Linux командой вида:
Надо сказать, что способ не самый удобный и эффективный. Минусов добавляет компиляция библиотек, разнообразные баги ― например, на момент написания статьи PSRP не позволял нормально подключиться из Linux в Windows.
Да и сами разработчики рекомендуют не плясать вокруг WS-Man, а обратиться к проверенному способу ― SSH. Что ж, попробуем и его.
На этот раз машина с Windows получит чуть больше специфической подготовки ― нужно установить свежий PowerShell и OpenSSH.
После можно проверить синтаксис командлета New-PSSession. Если все произошло как надо, то командлет, помимо привычного параметра ComputerName, будет поддерживать и HostName.
PowerShell 6.0.0-beta.9 и обновленный синтаксис командлета.
Качаем последний релиз или используем пакет из репозитория Chocolatey. Все это разархивируем в \Program Files\OpenSSH.
В консоли с правами администратора переходим в папку с разархивированным содержимым и запускаем установку командой:
Теперь генерируем ключи:
В тестовой среде мы будем использовать парольную аутентификацию, поэтому стоит убедиться что она включена в файле sshd_config:
Если вы также хотите автоматически запускать PowerShell при подключении по SSH, то в параметре subsystem нужно прописать путь к желаемой версии PS:
Для работы клиента SSH нужно добавить директорию в %PATH% любым удобным способом. Например, таким:
Остается только настроить и запустить службы:
После установки уже можно наслаждаться подключением к серверу Windows по ssh.
C Windows через Putty на Linux, с Linux обратно на Windows по SSH.
На достигнутом останавливаться не будем и перейдем к настройке Linux. При настройке сервера SSH по умолчанию достаточно прописать PowerShell в Subsystem:
Теперь проверим подключение через командлет New-PSSession и Invoke-Command.
Работаем из PowerShell с Linux-сервером.
Теперь подключимся из Linux к Windows:
Работаем из PowerShell с Windows-сервером.
В отличие от WS-Man, SSH настраивается намного проще и работает стабильнее. Да и беспарольное подключение по ключам настраивать привычнее.
С однозначным «советом потребителю» все опять сложно: SSH проще в настройке и стабильнее, но WS-Man использует API и позволяет применять инструменты вроде JEA. На боевых серверах использовать WS-Man я бы не стал однозначно, а вот реализация OpenSSH в Windows как сервера, так и клиента мне понравилась. Для самопальной автоматизации вполне подойдет даже без PowerShell.
В любом случае, границы между Linux и Windows хоть и медленно, но начинают стираться, что безусловно радует.
PowerShell сегодня является открытой кроссплатформенной оболочкой и языком сценариев, который можно установить и использовать как в Windows, так и в Linux, MacOS и других платформах. В этой статье мы рассмотрим, как установить PowerShell в популярных дистрибутивах Linux (CentOS, RHEL, Debian, Kali, Mint, Ubuntu). Статья скорее всего будет полезна Windows администраторам, знакомым с PowerShell, перенести свой опыт в Linux.
На данный момент пакет PowerShell отсутствует почти во всех стандартных репозиториях Linux. Поэтому для установки PowerShell на Linux сначала нужно скачать пакет репозитория Microsoft, импортировать ключи и использовать стандартный менеджер пакетов вашего Linux дистрибутива для установки PowerShell.
Как установить PowerShell Core в Ubuntu 20.04 и Linux Mint 20?
Перед установкой PowerShell в Ubuntu и Linux Mint нужно обновить список пакетов:
sudo apt-get update -y
Скачайте GPG ключи репозитория Microsoft:
Установите GPG ключи Microsoft:
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update
Установите PowerShell:
sudo apt-get install powershell -y
Пакет powershell будет автоматически обновляться менеджером пакетов apt:
sudo apt update
Если на компьютере была установлена предыдущая версия PowerShell Core, она будет удалена.Также вы можете скачать и установить DEB пакет powershell вручную:
Разрешить зависимости и закончить установку:
sudo apt-get install -f
Установка PowerShell Core в Debian 11
Для установки PowerShell Core версии 7.0+ в Debian 11 bullseye, сначала нужно загрузить GPG ключи репозитория Microsoft:
Теперь нужно зарегистрировать скачанный GPG ключ:
sudo dpkg -i packages-microsoft-prod.deb
Обновите список программ в менеджере пакетов:
sudo apt update
sudo apt install -y powershell
Обновление PowerShell будет происходить автоматически, когда вы запускаете обновление всех пакетов командой:
sudo apt update
Если нужно обновить только пакет PowerShell:
sudo apt install powershell
Установка PowerShell в CentOS и Red Hat Enterprise Linux (RHEL) 7 и 8
Установка PowerShell в Linux CentOS и Red Hat Enterprise Linux (RHEL), Oracle Linux выполняется одинаково:
Зарегистрируйте в yum новый репозиторий Microsoft RedHat:
Установите последнюю доступную версию PowerShell Core с помощью менеджера пакета yum (dnf):
sudo yum install -y powershell
Обновляется пакет стандартно через yum:
sudo yum update powershell
Также можно установить PowerShell из RPM файла:
Установка PowerShell Core 7.x в Kali Linux.
Чтобы установить PowerShell в Kali, достаточно выполнить команду:
apt update && apt -y install powershell
Установка PowerShell в Linux с помощью Snap
Вы можете использовать snap для установки PowerShell в различных дистрибутивах Linux. Так же этот метод установки можно рекомендовать для дистрибутивов Linux для которых нет официальной поддержки posh.
Команда установки PowerShell через snap:
sudo snap install powershell --classic
Обновление PowerShell через snap выполняется автоматически, но вы можете обновить его вручную:
sudo snap refresh powershell
Как удалить PowerShell в Linux?
Рассмотрим команды удаления PowerShell в различных дистрибутивах Linux:
- Удалить PowerShell Core в Ubuntu/Linux Mint: sudo apt remove powershell
- Удалить PowerShell в Debian: sudo apt remove powershell
- Удалить PowerShell в Kali Linux: sudo apt -y remove powershell
- Удаление PowerShell в CentOS и Red Hat Enterprise Linux (RHEL): sudo yum remove powershell
- Удалить PowerShell через Snap: sudo snap remove powershell
Запуск и использование PowerShell в Linux
Чтобы запустить командную оболочку PowerShell в Linux, выполните команду:
Проверить какая версию PowerShell установлена на данном хосте Ubuntu можно командой:
При наборе команд PowerShell можно использовать стандартное автодополнение с клавишей TAB.В нашем примере установлен PowerShell Core 7.2.0:
time pwsh -Command Get-History
time bash -c history
По умолчанию в Linux доступен небольшой список встроенных модулей:
- Microsoft.PowerShell.Archive
- Microsoft.PowerShell.Host
- Microsoft.PowerShell.Management
- Microsoft.PowerShell.Security
- Microsoft.PowerShell.Utility
- PackageManagement
- PowerShellGet
- PSReadLine
- ThreadJob
Можно установить другие модули, в том числе VMWare PowerCLI.
Получить текущую дату:
Узнать аптайм хоста:
Вывести содержимое текущшего каталога:
Получить справку по команде:
Для запуска скрипта PowerShell из bash:
Более подробно об особенностях и сценариях использования PowerShell для администрирования и автоматизации в Linux мы рассмотрим в следующей статье. Предыдущая статьяВсё о PowerShell в Windows и на Linux. Системное администрирование Windows
Оглавление
PowerShell для Linux
Все пакеты в скомпилированном виде доступны на странице выпусков GitHub.
В настоящее время, за редким исключением, PowerShell отсутствует в стандартных репозиториях дистрибутива. Обычный процесс установки на производные Debian заключается в скачивании пакета, который добавляет новый репозиторий и импортирует ключи, после этого PowerShell и предварительную версию PowerShell можно установить обычным менеджером пакетов.
После установки для запуска PowerShell выполните:
Если вы установили предварительную версию, то команда запуска следующая:
Установка PowerShell 7 удаляет PowerShell Core 6.x.
Обратите внимание, что в настоящее время по умолчанию в Windows предустановлен PowerShell 5, а здесь показана установка последней версии PowerShell 7. На Windows также можно установить PowerShell 7, но это версия не заменит предустановленную — будет 2 версии PowerShell, причём при запуске через «Меню продвинутого пользователя» (Win+x) будет открываться PowerShell 5, а при запуске Windows Terminal будет открываться PowerShell 7.
Ubuntu 16.04
Установка PowerShell 7 в Ubuntu 16.04.
Обновите список пакетов
Установите необходимые пакеты
Загрузите GPG ключи репозитория Microsoft
Зарегистрируйте GPG ключи репозитория Microsoft
Обновление PowerShell будет проходить автоматически при обновлении всех пакетов в системе. Вы можете отдельно запустить обновление PowerShell командами:
Удаление в Ubuntu 16.04
Ubuntu 18.04
Установка PowerShell 7 в Ubuntu 18.04.
Обновите список пакетов
Установите необходимые пакеты
Загрузите GPG ключи репозитория Microsoft
Зарегистрируйте GPG ключи репозитория Microsoft
Включите репозитории "universe"
Обновление PowerShell будет проходить автоматически при обновлении всех пакетов в системе. Вы можете отдельно запустить обновление PowerShell командами:
Удаление в Ubuntu 18.04
Ubuntu 20.04 и Linux Mint 20.*
Установка PowerShell 7 в Ubuntu 20.04 и Linux Mint 20.*.
Обновите список пакетов
Установите необходимые пакеты
Загрузите GPG ключи репозитория Microsoft
Зарегистрируйте GPG ключи репозитория Microsoft
Включите репозитории "universe"
Обновление PowerShell будет проходить автоматически при обновлении всех пакетов в системе. Вы можете отдельно запустить обновление PowerShell командами:
Удаление в Ubuntu 20.04 и Linux Mint 20.*
Ubuntu 18.10
Установка PowerShell 7 в Ubuntu 18.10.
Установка поддерживается через snapd. Смотрите инструкции в разделе «Установка с помощью Snap».
Ubuntu 18.10 — это промежуточный выпуск, поэтому для него отсутствует официальная поддержка PowerShell.
Ubuntu 19.10 и 20.10
Установка PowerShell 7 в Ubuntu 19.10 и 20.10.
Установка поддерживается через snapd. Смотрите инструкции в разделе «Установка с помощью Snap».
Ubuntu 19.10 и 20.10 — это промежуточные выпуски, поэтому для них отсутствует официальная поддержка PowerShell.
Debian 8
Установка PowerShell 7 в Debian 8.
Установка необходимых пакетов
Импорт публичных GPG ключей репозитория
Обновление списка программ
Обновление PowerShell будет проходить автоматически при обновлении всех пакетов в системе. Вы можете отдельно запустить обновление PowerShell командами:
Удаление в Debian 8
Debian 9
Установка PowerShell 7 в Debian 9.
Установка необходимых пакетов
Импорт публичных GPG ключей репозитория
Обновление списка программ
Обновление PowerShell будет проходить автоматически при обновлении всех пакетов в системе. Вы можете отдельно запустить обновление PowerShell командами:
Удаление в Debian 9
Debian 10
Установка PowerShell 7 в Debian 10.
Примечание: Debian 10 поддерживает только PowerShell 7.0 и новее.
Загрузка GPG ключей репозитория Microsoft
Обновление списка программ
Обновление PowerShell будет проходить автоматически при обновлении всех пакетов в системе. Вы можете отдельно запустить обновление PowerShell командами:
Удаление в Debian 10
Kali Linux
Установка PowerShell 7 в Kali Linux.
Удаление PowerShell в Kali Linux
Arch Linux, Manjaro, BlackArch
Установка PowerShell 7 в Arch Linux, Manjaro, BlackArch.
Рекомендуется установить утилиту pikaur по статье «Автоматическая установка и обновление пакетов AUR» и затем достаточно выполнить команду:
Если вы не хотите устанавливать pikaur то для установки PowerShell выполните следующую последовательность команд:
Alpine 3.9 и 3.10
Установка PowerShell 7 в Alpine 3.9 и 3.10.
Примечание: Alpine 3.9 и 3.10 только поддерживаются в PowerShell 7.0 и более новых.
Загрузите пакет tar.gz package powershell-7.1.*-linux-alpine-x64.tar.gz со страницы выпусков на машину Alpine.
В терминале выполните следующие команды.
Создайте целевую папку, где будет размещён powershell:
Распакуйте powershell в целевую папку:
Добавьте разрешение на выполнение:
Создайте символическую ссылку, которая указывает на pwsh:
CentOS 7
Установка PowerShell 7 в CentOS 7.
Примечание: этот пакет работает на Oracle Linux 7.
Зарегистрируйте репозиторий Microsoft RedHat:
Обновление PowerShell будет выполнять вместе с обновлением остальных пакетов в системе. Запустить отдельное обновление PowerShell можно командой:
Удаление из CentOS 7:
Red Hat Enterprise Linux (RHEL) 7
Установка PowerShell 7 в Red Hat Enterprise Linux (RHEL) 7.
Зарегистрируйте репозиторий Microsoft RedHat:
Обновление PowerShell будет выполнять вместе с обновлением остальных пакетов в системе. Запустить отдельное обновление PowerShell можно командой:
Удаление из Red Hat Enterprise Linux (RHEL) 7
openSUSE
Установка PowerShell 7 в openSUSE 42.3
Создайте целевую папку, где будет размещён powershell:
Распакуйте powershell в целевую папку:
Добавьте разрешение на выполнение:
Создайте символическую ссылку, которая указывает на pwsh:
Установка PowerShell 7 в openSUSE Leap 15
Создайте целевую папку, где будет размещён powershell:
Распакуйте powershell в целевую папку:
Добавьте разрешение на выполнение:
Создайте символическую ссылку, которая указывает на pwsh:
Удаление из openSUSE 42.3, openSUSE Leap 15:
Fedora
Примечание: Fedora 28 поддерживается только в PowerShell 6.1 и новее.
Примечание: Fedora 29 и 30 поддерживаются только в PowerShell 7.0 и новее.
Установка PowerShell 7 в Fedora 28, 29, и 30.
Зарегистрируйте GPG ключи репозитория Microsoft:
Зарегистрируйте репозиторий Microsoft RedHat:
Обновите список пакетов:
Snap пакет
Установка PowerShell с помощью Snap.
Для установки предварительной версии используйте следующий метод.
Установка PowerShell Preview:
После установки Snap автоматически будет обновлять PowerShell. Вы можете принудительно запустить обновления используя одну из следующих команд:
Поддержка ARM процессоров
Raspbian
Установка PowerShell 7 в Raspbian.
Поддержка Raspbian является эксперементальной.
В настоящее время, PowerShell только поддерживается на Raspbian Stretch.
CoreCLR и PowerShell будут работать только на устройствах Pi 2 и Pi 3, а другие устройства, такие как Pi Zero, имеют неподдерживаемый процессор.
Загрузитье Raspbian Stretch и следуйте последующим инструкциям по установки чтобы получить PowerShell на вашем устройстве Pi.
Обновите кэш установочных файлов:
Установка libunwind8 и libssl1.0. Используется регулярное выражение, чтобы убедиться, что мы не будем устанавливать libssl1.0-dev, так как этот пакет не нужен:
Загрузите и извлеките PowerShell. Поменяйте ссылку на самую последую версию в формате tar.gz:
Сделайте папку для powershell:
Распакуйте tar.gz файл:
Опционально, вы можете сделать символическую ссылку для запуска PowerShell без указания пути до исполнимого файла pwsh.
Запустите PowerShell из bash с sudo для создания символической ссылки:
В качестве альтернативы, вы можете запустить следующую команду для создания символической ссылки:
Теперь для запуска PowerShell достаточно просто набрать "pwsh".
Удаление из Raspbian:
Установка предварительных выпусков
При установке версии PowerShell Preview для Linux через репозиторий пакетов имя пакета меняется с powershell на powershell-preview.
Установка через прямую загрузку не меняется, кроме имени файла.
В следующей таблице приведены команды для установки пакетов стабильной и предварительной версии с помощью различных менеджеров пакетов:
Читайте также: