Чем может быть полезен PowerShell в Linux? Именно на этот вопрос я постарался ответить в статье. Тут приведены несколько примеров использования PowerShell для настройки Linux: работа с файлами, запуск программ Linux, редактирование. Это лишь идеи о том как можно использовать PowerShell Core на Linux. И статья написана все же для администраторов знакомых с PowerShell. Как минимум ознакомьтесь с введением в PowerShell
Работа с файлами Linux в PowerShell Core
Работать с файлами вы можете привычным для себя образом, как это делали в bash или cmd. Однако помните, что команды cd, dir, pwd и т.п. теперь алиасы PowerShell и работают не совсем так как обычно. Например, pwd -L выдает ошибку, хотя принимает параметры командлета get-location. А вот ls, cp, rm это не алиасы и работают как обычно в bash.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
PS /home/pnck> Get-Alias -Definition set-location,get-location,get-childitem CommandType Name Version Source ----------- ---- ------- ------ Alias cd -> Set-Location Alias chdir -> Set-Location Alias sl -> Set-Location Alias gl -> Get-Location Alias pwd -> Get-Location Alias dir -> Get-ChildItem Alias gci -> Get-ChildItem PS /home/pnck> pwd -L Get-Location : A parameter cannot be found that matches parameter name 'L'. At line:1 char:5 + pwd -L + ~~ + CategoryInfo : InvalidArgument: (:) [Get-Location], ParameterBindingException + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetLocationCommand PS /home/pnck> pwd -PSDrive Env Path ---- Env:/ |
В общем-то PowerShell Core работает с файлами одинаково и в Windows и в Linux. Я приведу лишь несколько примеров.
Копирование файлов можно производить или unix командой cp, или используя Copy-Item. В первом примере ниже копируется файл. Во втором — каталог целиком с объединением содержимого каталогов.
1 2 |
copy ./Загрузки/WP_002769.jpg '/media/Data/Document/Мои рисунки' copy ./Изображения '/media/Data/Document/Мои рисунки' -Recurse -Force |
Создание каталога можно произвести или unix командой md, или используя New-Item
1 |
PS /home/pnck> New-Item -Name MyDocs -ItemType Directory |
Копирование файлов между Windows и Linux
А вот копирование файлов между Windows и Linux используя PowerShell я решил вынести в отдельный раздел
Вариантов тут два, или использовать WS-Man или SSH. Начнем пожалуй с WS-Man. Для его использования необходимо:
- Установить gss-ntlmssp — для аутентификации NTLM. В моем дистрибутиве это команда sudo apt-get install gss-ntlmssp
- Создать сессию до Windows компьютера, конечно на нем уже должен быть выполнен Enable-PSRemoting
- Копировать файлы используя Сopy-Item и в зависимости от направления с параметрами FromSession или ToSession
1 2 3 4 5 6 7 8 9 10 11 |
PS /home/pnck> $session = New-PSSession -ComputerName 192.168.100.104 -Credential 'toshiba\pnck' -Authentication Negotiate PowerShell credential request Enter your credentials. Password for user toshiba\pnck: ************** PS /home/pnck> Copy-Item c:\users\pnck\Documents\Database3.accdb ./Загрузки -FromSession $session PS /home/pnck> Copy-Item ./Загрузки/WP_002770.jpg d:\Загрузки -ToSession $session PS /home/pnck> $session Id Name Transport ComputerName ComputerType State ConfigurationName Availability -- ---- --------- ------------ ------------ ----- ----------------- ------------ 28 Runspace28 WSMan 192.168.100.104 RemoteMachine Opened Microsoft.PowerShell Available |
С SSH последовательность действий идентичная. Единственное, что нужно сделать — это установить и настроить ssh на Windows компьютере. О том как это сделать я писал в статье
Дружим PowerShell и SSH на Windows и Linux .
1 2 3 4 5 6 7 8 |
PS /home/pnck> $session = New-PSSession -SSHTransport -HostName 192.168.100.104 -UserName pnck PS /home/pnck> Copy-Item ./Загрузки/WP_002767.jpg d:\Загрузки -ToSession $session PS /home/pnck> Copy-Item c:\users\pnck\Documents\Database10.accdb ./Загрузки -FromSession $session PS /home/pnck> $session Id Name Transport ComputerName ComputerType State ConfigurationName Availability -- ---- --------- ------------ ------------ ----- ----------------- ------------ 5 Runspace4 SSH 192.168.100.104 RemoteMachine Opened DefaultShell Available |
Запуск программ и команд Bash
Большинство способов выполнения команд bash и программ будут работать одинаково в PowerShell Core на Linux и на Windows. Хочу заметить, что PowerShell можно использовать как Shell по умолчанию в Linux, поэтому с запуском программ сложностей быть не должно.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# просто выполняем привычные команды, если в них нет управляющих символов PowerShell они должны выполнится без проблем ls -ls ping get-powershell.ru # Используем команду Invoke-Expression $str = "ls -ls" Invoke-Expression $str # используем команды Invoke-Command Invoke-Command -ScriptBlock {ping ya.ru} # используем вызов & $bash = "ping" $arg = "ya.ru" & $bash $arg # используем команды Start-Process Start-Process ping -ArgumentList "get-powershell.ru" # используя последовательность --%, которая останавливает анализ аргументов ls --% -ls |
Подробнее о способах запуска команд вы можете поглядеть в Wiki Technet.
Заметьте, что отлично работает и конвеер. Причем не важно в какой последовательности (слева или справа) стоят команды Powershell и команды Bash. Однако, помним, что результат выполнения Bash команд — это строка!
1 2 |
ls -ls | grep -i работа ls | Where-Object Length -gt 70 |
Работа с текстовыми файлами в PowerShell в Linux
Классические для PowerShell варианты создания файла работают на ура:
1 2 |
Get-Process | Out-File process.txt Get-Process | Export-Csv process.csv |
Чтение файлов и их анализ, так же можно делать с использованием возможностей PowerShell. Впрочем, можно использовать и команду cat.
1 |
Import-Csv ./process.csv | ? name -like "pwsh*" | ft |
Добавление строчек в текстовый файл можно реализовать используя Out-File с параметром Append. Делать это можно построчно, а можно сразу несколько строк.
1 2 3 4 5 6 |
# добавляем одну строку $NewLine = "# new virtual host" $NewLine | Out-File ./apache2.conf -Append # добавляем массив строк $NewVirtualHost = "<VirtualHost *:80>"," ServerName www.get-powershell.ru"," Redirect Permanent / http://get-powershell.ru/","</VirtualHost>" $NewVirtualHost | Out-File ./apache2.conf -Append |
Заменить какую-либо строку можно используя Get-Content, ForEach-Object (алиас %)
1 2 |
$ApacheConf = Get-Content ./apache2.conf $ApacheConf | % {$PSItem -replace 'LogLevel warn','LogLevel error'} | Out-File ./apache2.conf |
Что все это нам дает?
Известно, что большинство программ работающих на Linux настраивается используя конфигурационные файлы и запуск консольных приложений. Получается, что редактируя текстовые файлы, описанным в статье образом, запуская исполняемые файлы, описанным в статье образом можно настраивать и конфигурировать почти все возможности Linux, используя широкий функционал PowerShell.
Что почитать еще?
get-help about_FileSystem_Provider
get-help Set-Content
Microsoft Wiki running executables