マルチプラットホームになった
PowerShell 6 で
クロスプラットホームする
Syuichi Murashima
アジェンダ
• PowerShell って何でしたっけ?
• OSS に生まれ変わった PowerShell
• PowerShell でクロスプラットホーム
自己紹介
• MURA/村嶋修一
• 千葉県松戸市在住
• Windows系プラットフォーム全般担当 @ ソシャゲ屋さん
• MS MVP for Cloud and Datacenter Management
• http://www.vwnet.jp
• mura@vwnet.jp
3
こんな本書きました
4
PowerShell って何でしたっけ?
PowerShell の特徴
• 従来のスクリプトを刷新したWindows用シェルスクリプト
• 新たな管理インターフェイス( PS > GUI )
• 様々なリソースがハンドリングできる
• リモート操作も得意
• オブジェクト
• プログラミング言語に迫る高機能
ライトにも、ヘビーにも、ディープにも
• ライト
• 電卓
• プログラム ランチャー
• ヘビー
• 大量台数の環境構築/設定変更
• 大量台数へのプログラムインストール
• ディープ
• .NET Framework
• WMI
• Win32API
コマンドレットとオブジェクト
• コマンドレット = PowerShell 専用コマンド
• オブジェクト
• プロパティにアクセス
• メソッドも準備されている
ハンドリングできる豊富なリソース
• OS、役割、ミドルウェア設定
• ファイルシステム、共有、レジストリ、イベントログ
• テキスト、CSV、JSON、XML、DB
• DOS コマンド実行と結果処理
• WebAPI、SOAP を使った Web Service Client
• Azure、AWS 管理
.NET Framework / WMI ハンドリング
• .NET Framework / WMI が簡単に使える
• コマンドレットで実現出来ない事が実現可能
• 高度な処理も簡単に実装可能
OSS に生まれ変わった
PowerShell
OSS対応バージョン
• 6.0 から OSS 対応に進化
• 5.1 と 6.0 の互換性は高いが別物
• 今後の機能拡張は 6 以降だけ
• 5.1 は、セキュリティ update と bug fix のみ
• 5.1 のサポートは今後も続く
GitHub で公開
• GitHub - PowerShell/PowerShell: PowerShell for every system!
• https://github.com/PowerShell/PowerShell
動作可能なプラットフォーム
Windows 7 SP1+/2008 R2+
Linux
Red Hat Enterprise 6, 7
CentOS, Oracle Linux 7
Fedora 26,27
Debian 9,8.7+
Ubuntu 14,16,17,18
Linux Mint 18,17
openSUSE 42.3+
SUSE Enterprise 12 SP2+
macOS X 10.12+
6.0 のプラットフォーム間互換性
本体プログラム名
Windows : pwsh.exe
CentOS 7 : pwsh
文法 互換(試した限り)
コマンドレット数
Windows : 482
CentOS 7 : 318
コマンドレットオプション 互換(試した限り)
.NET Core 2.0
5.1 と 6.0 の互換性(Windows 10)
本体プログラ名
5.1 : C:¥Windows¥System32¥WindowsPowerShell¥v1.0¥powershell.exe
6.0 : C:¥Program Files¥PowerShell¥6.0.2¥pwsh.exe
文法 互換(試した限り)
コマンドレット数
5.1 : 1530
6.0 : 482
コマンドレット
オプション
若干違う所あり
.NET
5.1 : Framework 4.5.2 以降 (最新 4.7.2)
6.0 : Core 2.0
PowerShell で
クロスプラットホーム
従来のリモーティング アーキテクチャ
接続元(Windows)
PowerShell
接続先(Windows)
PowerShell
WinRM ServiceWinRM(PS/Object) FW
5.1 以前環境を Linux から操作する場合
接続元(Linux)
pywinrm 等
接続先(Windows)
PowerShell
WinRM ServiceWinRM(Text) FW
クロスプラットホーム
リモーティング アーキテクチャ
接続元(Windows/Linux/Mac)
PowerShell
PowerShell
sshdssh(PS/Object) FW
接続先(Windows/Linux/Mac)
ssh
WinRM と ssh の切り替え
• リモーティング コマンドレットのオプションで切り替え
• WinRM
• Enter-PSSession
-ComputerName 172.24.58.68
-Credential administrator
• ssh
• Enter-PSSession
-HostName 172.24.58.68
-UserName administrator
オプション WinRM ssh
接続先指定 -ComputerName -HostName
アカウント指定 -Credential -UserName
Windows 10(1803) を
クロスプラットフォーム Client にする
• PowerShell 6 インストール
(1803 から Open-SSH Client が default インストール済み)
PowerShell 6 インストール
• GitHub からインストーラーをダウンロード
• https://github.com/PowerShell/PowerShell/releases/download/v6.0.2/P
owerShell-6.0.2-win-x64.msi
• https://github.com/PowerShell/PowerShell/releases/download/v6.0.2/P
owerShell-6.0.2-win-x86.msi
• .msi をインストール
CentOS 7 を
クロスプラットフォーム Server にする
• PowerShell 6 インストール
• sshd 設定
• sshd 再起動
CentOS 7 に PowerShell 6 インストール
# Install PowerShell
sudo yum install
https://github.com/PowerShell/PowerShell/releases/download/v6.
0.2/powershell-6.0.2-1.rhel.7.x86_64.rpm
# Start PowerShell
pwsh
sshd 設定と再起動
• sshd 設定ファイル
/etc/ssh/sshd_config
• sshd_config を編集
• Subsystem powershell /usr/bin/pwsh -sshs -NoLogo –NoProfile
を追加
• (“Subsystem powershell” + pwsh のフルパス + “-sshs -NoLogo -NoProfile” を追加)
• PubkeyAuthentication の有効化(# を外す)
• PasswordAuthentication の有効化(# を外す)
• sshd 再起動
sudo service sshd restart
Demo 環境
Demo
• Windows 10 → CentOS 7 Server
Windows Server を
クロスプラットフォーム Server にする
• PowerShell 6 インストール
• Win32-OpenSSH インストール
• ssh 受信用に Windows ファイヤーウォール穴あけ(tcp/22)
• ssh へ Path を通す
• sshd サービス自動起動設定/起動
• sshd サービス設定/サービス再起動
Win32-OpenSSH インストール
• GitHub からダウンロード
• https://github.com/PowerShell/Win32-OpenSSH/releases
• 直リン
• https://github.com/PowerShell/Win32-OpenSSH/releases/download/v7.6.1.0p1-
Beta/OpenSSH-Win64.zip
• https://github.com/PowerShell/Win32-OpenSSH/releases/download/v7.6.1.0p1-
Beta/OpenSSH-Win32.zip
• 展開したファイルを適当なフォルダにコピー
• C:¥Program Files¥OpenSSH¥
• インストールスクリプトを実行
• C:¥Program Files¥OpenSSH¥install-sshd.ps1
ssh ファイヤーウォール穴あけ
• GUI か PowerShell で TCP/22 を開く
New-NetFirewallRule `
-Name sshd `
-DisplayName “OpenSSH Server (sshd)” `
-Enabled True `
-Direction Inbound `
-Protocol TCP `
-Action Allow `
-LocalPort 22
ssh へ Path を通す
• GUI か setx で ssh へ Path を通す
# Add Path
setx /m Path ($env:Path + ";" + (Join-Path $env:ProgramFiles OpenSSH))
サービス自動起動設定/起動
• GUI か PowerShell で sshd サービスの自動起動設定
Set-Service sshd -StartupType Automatic
• sshd 起動
Start-Service sshd
sshd サービス設定と起動
• sshd 設定ファイル
• C:¥ProgramData¥ssh¥sshd_config
• sshd_config を編集
• Subsystem powershell C:¥Program Files¥PowerShell¥6.0.2¥pwsh.exe
-sshs -NoLogo -NoProfile
を追加
(“Subsystem powershell” + pwsh.exe のフルパス + “-sshs -NoLogo -NoProfile” を追加)
• PubkeyAuthentication の有効化(# を外す)
• PasswordAuthentication の有効化(# を外す)
• sshd 再起動
Restart-Service sshd
CentOS 7 を
クロスプラットフォーム Client にする
• PowerShell 6 インストール
Demo
• CentOS 7 Client → Windows Server
• Windows 10 → Windows Server
公開鍵を使う
接続元(Windows/Linux/Mac)
PowerShell
PowerShell
sshdssh(PS/Object) FW
接続先(Windows/Linux/Mac)
ssh
公開鍵
秘密鍵
ssh-agent
公開鍵環境作成
• Client(Windows 10 1803)
• 鍵ペア作成
• ssh-agent の自動起動設定と起動
• 秘密鍵のパスフレーズを ssh-agent に登録
• Server
• 公開鍵配置
• パーミッション設定
Client でキーペア作成
• ユーザープロファイルディレクトリ直下の「.ssh」フォルダに
鍵ペアを作る
• ssh-keygen -t rsa -f 鍵ファイル名
ssh-agent の自動起動設定と起動
• GUI か PowerShell で ssh-agent を自動起動設定し起動
# start setting ssh-agent
Set-Service ssh-agent -StartupType Automatic
# start service
Start-Service ssh-agent
パスフレーズを ssh-agent に登録
• 秘密鍵のパスフレーズを ssh-agent に登録
• ssh-add 秘密鍵ファイルパス
Server へ
公開鍵の設置とパーミッション設定
• ユーザープロファイルディレクトリ直下の
「.ssh¥authorized_keys」に公開鍵を追加
• 「.ssh¥authorized_keys」のパーミッションを設定
CentOS 7 へ公開鍵セット
• 公開鍵コピー(Windows 10)
scp C:¥Users¥mura¥.ssh¥mura_rsa.pub`
root@192.168.33.75:~/
• 公開鍵セット(CentOS 7 Server)
cd ~
mkdir -p .ssh
chmod 700 .ssh
cat mura_rsa.pub >> .ssh/authorized_keys
• パーミッション調整(CentOS 7 Server)
chmod 640 .ssh/authorized_keys
Windows Server へ公開鍵セット
• 公開鍵コピー(Windows 10)
scp C:¥Users¥mura¥.ssh¥mura_rsa.pub`
Administrator@192.168.33.83:C:¥Users¥Administrator
• 公開鍵セット(Windows Server)
Get-Content C:¥Users¥Administrator¥mura_rsa.pub |
Add-Content C:¥Users¥Administrator¥.ssh¥authorized_keys
• パーミッション調整(Windows Server)
. “C:¥Program Files¥OpenSSH¥FixHostFilePermissions.ps1” `
-Confirm:$false
公開鍵接続
• パスワードと同様に接続
• 初回のみ明示的に秘密鍵を –KeyFilePath で指定
• Enter-PSSession `
-HostName 172.24.58.55 `
-UserName root `
-KeyFilePath ~¥.ssh¥mura_rsa
Demo
• Windows 10 → CentOS 7 Server 公開鍵
• Windows 10 → Windows Server 公開鍵
Linux で PowerShell が使えると
何がうれしいの?
• プラットフォームを気にせずにスクリプトが書ける
• オブジェクトなので、プロパティがそのまま使える
• Linux から Windows の管理が簡単にできる
• Linux のシェルスクリプトとして普通に使える
• Windows なエンジニアの Linux 敷居が下がる
まとめ
• マルチプラットフォームで使えるようになった PowerShell
• 5.1 以前とは別物
• クロスプラットフォーム接続は ssh を使う
• Server 側には sshd が必要
• 公開鍵認証が使える
Q&A
参考情報
• リモート コンピューターの対話操作(Enter-PSSession)
• http://www.vwnet.jp/Windows/PowerShell/EnterPSSession.htm
• リモート コンピューターのバッチ操作(Invoke-Command)
• http://www.vwnet.jp/Windows/PowerShell/InvokeCommand.htm
• リモート コンピューターのパラレル バッチ操作(Invoke-Command -AsJob)
• http://www.vwnet.jp/Windows/PowerShell/Invoke-CommandAsJob.htm
• PowerShell 6 へリモート接続する(Windows 編)
• http://www.vwnet.jp/Windows/PowerShell/2018020501/ConnectRemotePS6.htm
• PowerShell 6 へリモート接続する(クロスプラットフォーム/パスワード認証編)
• http://www.vwnet.jp/Windows/PowerShell/2018031701/PsRemoteOverSSH.htm
• PowerShell 6 へリモート接続する(クロスプラットフォーム/公開鍵認証編)
• http://www.vwnet.jp/Windows/PowerShell/2018032101/PsRemoteOverSSHwKey.htm
• 今日から使う PowerShell
• http://www.vwnet.jp/Windows/etc.asp#GettingStartedWithPowerShell

マルチプラットホームになった PowerShell 6 でクロスプラットホームする