2017/06/06

JP1/AJS3環境でRHEL7/CentOS7ファイアウォールを設定する

はじめに

JP1/Automatic Job Management System 3 (JP1/AJS3)環境において、firewalldを設定する方法を紹介する。

参考: 『JP1/AJS3環境でWindowsファイアウォールを設定する

JP1/Automatic Job Management System 3 (JP1/AJS3)は、業務を自動化する製品。
詳細は、マニュアルを参照。

JP1/AJS3 を構成する主な要素には、マネージャホスト・エージェントホストがある。
マネージャホストは、エージェントホストを制御し、ジョブを実行させる。
マネージャホストは、エージェントホストの機能を含む。
このため、マネージャホスト自身にジョブを実行させることもできる。

JP1/AJS3 は、企業内ネットワーク内部で使用されることが多い。
このため、各構成要素のパーソナルファイアウォールが無効化されていても、一概に安全でないとは言えない。
しかし、無効化しない方がセキュリティ上より安全である。

RHEL 7/CentOS 7では、firewalld がパーソナルファイアウォール機能を提供する。

JP1/AJS3 環境でのファイアウォール設定要件については、以下を参考にした。


ファイアウォールの設定方針

RHEL 7/CentOS 7では、パーソナルファイアウォールとして、firewalld と iptables が利用できる。この iptables は、TCP/UDP ポートを一つづつ追加していくか、連続した TCP/UDP ポートを追加するかのいずれかの方法でルールを定義する。
一方、firewalld は、iptables と同様の方法に加えて、複数の TCP/UDP ポートをひとまとめにして扱うことができる。
ひとまとめにした TCP/UDP ポートは、サービスと呼ばれ、名前を付けて扱うことが出来る。

マネージャホストおよびエージェントホストの両方で同じサービスを定義し、必要に応じてサービス単位で通信を許可する。


Firewalldサービスの定義

Firewalld のサービスは、/etc/firewalld/services以下に XML ファイルを作成することで定義する。

Firewalldサービスの定義/設定前状態の確認

マネージャホストおよびエージェントホストで以下の通り実行する。
定義したサービスの一覧をfirewall-cmd --get-servicesで得ることができる。

[root@agent ~]# cd /etc/firewalld/services
[root@agent services]# ls *JP1*
ls: cannot access *JP1*: No such file or directory
[root@agent services]# for SERVICE in $(firewall-cmd --get-services); do [[ $SERVICE = *JP1* ]] && echo $SERVICE; done
[root@agent services]#

何も定義されていないことが解る。

Firewalldサービスの定義/設定


マネージャホストおよびエージェントホストで以下の通り実行する。

[root@agent services]# cat <<'EOF' > JP1Base-to-JP1Base.xml
> <?xml version="1.0" encoding="utf-8"?>
> <service>
>   <short>JP1Base-to-JP1Base</short>
>   <description>JP1/Base to JP1/Base</description>
>   <port protocol="tcp" port="20098"/>
>   <port protocol="tcp" port="20306"/>
> </service>
> EOF
[root@agent services]# cat <<'EOF' > JP1AJS3-to-JP1Base.xml
> <?xml version="1.0" encoding="utf-8"?>
> <service>
>   <short>JP1AJS3-to-JP1Base</short>
>   <description>JP1/AJS3 (both Manager and Agent) to JP1/Base</description>
>   <port protocol="tcp" port="20240"/>
> </service>
> EOF
[root@agent services]# cat <<'EOF' > JP1AJS3-View-to-Manager.xml
> <?xml version="1.0" encoding="utf-8"?>
> <service>
>   <short>JP1AJS3-View-to-Manager</short>
>   <description>JP1/AJS3 View to JP1/AJS3 Manaer</description>
>   <port protocol="tcp" port="20244"/>
> </service>
> EOF
[root@agent services]# cat <<'EOF' > JP1AJS3-Agent-to-Manager.xml
> <?xml version="1.0" encoding="utf-8"?>
> <service>
>   <short>JP1AJS3-Agent-to-Manager</short>
>   <description>JP1/AJS3 Agent to JP1/AJS3 Manaer</description>
>   <port protocol="tcp" port="20241"/>
>   <port protocol="tcp" port="20243"/>
>   <port protocol="tcp" port="20246"/>
>   <port protocol="tcp" port="20301"/>
>   <port protocol="tcp" port="22251"/>
> </service>
> EOF
[root@agent services]# cat <<'EOF' > JP1AJS3-Manager-to-Agent.xml
> <?xml version="1.0" encoding="utf-8"?>
> <service>
>   <short>JP1AJS3-Manager-to-Agent</short>
>   <description>JP1/AJS3 Manager to JP1/AJS3 Aent</description>
>   <port protocol="tcp" port="20242"/>
>   <port protocol="tcp" port="20247"/>
>   <port protocol="tcp" port="20300"/>
>   <port protocol="tcp" port="22251"/>
>   <port protocol="tcp" port="23139"/>
> </service>
> EOF
[root@agent services]# cat <<'EOF' > JP1AJS3-Manager-to-Manager.xml
> <?xml version="1.0" encoding="utf-8"?>
> <service>
>   <short>JP1AJS3-Manager-to-Manager</short>
>   <description>JP1/AJS3 Manager to JP1/AJS3 Manager</description>
>   <port protocol="tcp" port="20241"/>
>   <port protocol="tcp" port="20244"/>
>   <port protocol="tcp" port="20245"/>
>   <port protocol="tcp" port="23160"/>
> </service>
> EOF
[root@agent services]# cat <<'EOF' > JP1AJS3-SDK-to-Manager.xml
> <?xml version="1.0" encoding="utf-8"?>
> <service>
>   <short>JP1AJS3-SDK-to-Manager</short>
>   <description>JP1/AJS3 SDK to JP1/AJS3 Manager</description>
>   <port protocol="tcp" port="22250"/>
> </service>
> EOF
[root@agent services]# cat <<'EOF' > JP1AJS3-Agent-to-Agent.xml
> <?xml version="1.0" encoding="utf-8"?>
> <service>
>   <short>JP1AJS3-Agent-to-Agent</short>
>   <description>JP1/AJS3 Agent to JP1/AJS3 Agent</description>
>   <port protocol="tcp" port="22251"/>
>   <port protocol="udp" port="22251"/>
> </service>
> EOF
[root@agent services]# cat <<'EOF' > JP1AJS3-Web-Console-to-Manager.xml
> <?xml version="1.0" encoding="utf-8"?>
> <service>
>   <short>JP1AJS3-Web-Console-to-Manager</short>
>   <description>JP1/AJS3 Web Console to JP1/AJS3 Manager</description>
>   <port protocol="tcp" port="22250"/>
> </service>
> EOF
[root@agent services]# cat <<'EOF' > Web-Browser-to-JP1AJS3-Web-Console.xml
> <?xml version="1.0" encoding="utf-8"?>
> <service>
>   <short>Web-Browser-to-JP1AJS3-Web-Console</short>
>   <description>Web Browser to JP1/AJS3 Web Console</description>
>   <port protocol="tcp" port="22252"/>
>   <port protocol="tcp" port="22253"/>
> </service>
> EOF
[root@agent services]#


Firewalld サービスの定義/設定後状態の確認

マネージャホストおよびエージェントホストで以下の通り実行する。
定義されたサービスは、定義をfirewall-cmd --reloadでリロードすることによって反映される。

[root@agent services]# ls *JP1*
JP1AJS3-Agent-to-Agent.xml      JP1AJS3-SDK-to-Manager.xml          JP1Base-to-JP1Base.xml
JP1AJS3-Agent-to-Manager.xml    JP1AJS3-View-to-Manager.xml         Web-Browser-to-JP1AJS3-Web-Console.xml
JP1AJS3-Manager-to-Agent.xml    JP1AJS3-Web-Console-to-Manager.xml
JP1AJS3-Manager-to-Manager.xml  JP1AJS3-to-JP1Base.xml
[root@agent services]# firewall-cmd --reload
success
[root@agent services]# for SERVICE in $(firewall-cmd --get-services); do [[ $SERVICE = *JP1* ]] && echo $SERVICE; done
JP1AJS3-Agent-to-Agent
JP1AJS3-Agent-to-Manager
JP1AJS3-Manager-to-Agent
JP1AJS3-Manager-to-Manager
JP1AJS3-SDK-to-Manager
JP1AJS3-View-to-Manager
JP1AJS3-Web-Console-to-Manager
JP1AJS3-to-JP1Base
JP1Base-to-JP1Base
Web-Browser-to-JP1AJS3-Web-Console
[root@agent services]# for SERVICE in $(firewall-cmd --get-services); do if [[ $SERVICE = *JP1* ]]; then echo "### $SERVICE"; firewall-cmd --info-service=$SERVICE; fi; done
### JP1AJS3-Agent-to-Agent
JP1AJS3-Agent-to-Agent
  ports: 22251/tcp 22251/udp
  protocols:
  source-ports:
  modules:
  destination:
### JP1AJS3-Agent-to-Manager
JP1AJS3-Agent-to-Manager
  ports: 20241/tcp 20243/tcp 20246/tcp 20301/tcp 22251/tcp
  protocols:
  source-ports:
  modules:
  destination:
### JP1AJS3-Manager-to-Agent
JP1AJS3-Manager-to-Agent
  ports: 20242/tcp 20247/tcp 20300/tcp 22251/tcp 23139/tcp
  protocols:
  source-ports:
  modules:
  destination:
### JP1AJS3-Manager-to-Manager
JP1AJS3-Manager-to-Manager
  ports: 20241/tcp 20244/tcp 20245/tcp 23160/tcp
  protocols:
  source-ports:
  modules:
  destination:
### JP1AJS3-SDK-to-Manager
JP1AJS3-SDK-to-Manager
  ports: 22250/tcp
  protocols:
  source-ports:
  modules:
  destination:
### JP1AJS3-View-to-Manager
JP1AJS3-View-to-Manager
  ports: 20244/tcp
  protocols:
  source-ports:
  modules:
  destination:
### JP1AJS3-Web-Console-to-Manager
JP1AJS3-Web-Console-to-Manager
  ports: 22250/tcp
  protocols:
  source-ports:
  modules:
  destination:
### JP1AJS3-to-JP1Base
JP1AJS3-to-JP1Base
  ports: 20240/tcp
  protocols:
  source-ports:
  modules:
  destination:
### JP1Base-to-JP1Base
JP1Base-to-JP1Base
  ports: 20098/tcp 20306/tcp
  protocols:
  source-ports:
  modules:
  destination:
### Web-Browser-to-JP1AJS3-Web-Console
Web-Browser-to-JP1AJS3-Web-Console
  ports: 22252/tcp 22253/tcp
  protocols:
  source-ports:
  modules:
  destination:
[root@agent services]#


Firewalld ルールの定義

Firewalld ルールの定義/設定前状態の確認

マネージャホストおよびエージェントホストで以下の通り実行する。

[root@agent services]# firewall-cmd --get-default-zone
public
[root@agent services]# firewall-cmd --info-zone=public
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: dhcpv6-client http https ntp smtp ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

[root@agent services]#

Firewalld ルールの定義/設定

エージェントホストで以下の通り実行する。

[root@agent services]# firewall-cmd --permanent --zone=public --add-service=JP1Base-to-JP1Base --add-service=JP1AJS3-to-JP1Base
success
[root@agent services]# firewall-cmd --permanent --zone=public --add-service=JP1AJS3-Manager-to-Agent --add-service=JP1AJS3-Agent-to-Agent
success
[root@agent services]#

マネージャホストでは、これらのサービスの他に、JP1AJS3-Agent-to-Manager、JP1AJS3-Manager-to-Manager、JP1AJS3-SDK-to-Manager、JP1AJS3-View-to-ManagerおよびJP1AJS3-Web-Console-to-Managerを追加する。

Firewalld ルールの定義/設定後状態の確認

マネージャホストおよびエージェントホストで以下の通り実行する。

[root@agent services]# firewall-cmd --reload
success
[root@agent services]# firewall-cmd --info-zone=public
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: JP1AJS3-Agent-to-Agent JP1AJS3-Manager-to-Agent JP1AJS3-to-JP1Base JP1Base-to-JP1Base dhcpv6-client http https ntp smtp ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

[root@agent services]#

2017/05/29

JP1/AJS3環境でWindowsファイアウォールを設定する

はじめに

JP1/Automatic Job Management System 3 (JP1/AJS3)環境において、「セキュリティが強化された Windows ファイアウォール」を Windows Powershell を用いて設定する方法を紹介する。

参考: 『JP1/AJS3環境でRHEL7/CentOS7ファイアウォールを設定する

JP1/Automatic Job Management System 3 (JP1/AJS3)は、業務を自動化する製品。
詳細は、マニュアルを参照。

JP1/AJS3 を構成する主な要素には、マネージャホスト・エージェントホストがある。
マネージャホストは、エージェントホストを制御し、ジョブを実行させる。
マネージャホストは、エージェントホストの機能を含む。
このため、マネージャホスト自身にジョブを実行させることもできる。

JP1/AJS3 は、企業内ネットワーク内部で使用されることが多い。
このため、各構成要素のパーソナルファイアウォールが無効化されていても、一概に安全でないとは言えない。
しかし、無効化しない方がセキュリティ上より安全である。

Windows Serverでは、「セキュリティが強化された Windows ファイアウォール」がパーソナルファイアウォール機能を提供する。
これをGUIで設定する方法もあるが、今回はPowershellを用いて設定する。

JP1/AJS3 環境でのファイアウォール設定要件については、以下を参考にした。

ファイアウォールの設定方針

「セキュリティが強化された Windows ファイアウォール」の流儀に従い、マネージャホストおよびエージェントホストの両方で同じルールを定義し、必要に応じてルールを有効化して使うことにする。
JP1/Base、JP1/AJS3 - ManagerおよびJP1/AJS3 - Agent必要となるファイアウォールルールをグループ化し、グループ名をぞれぞれ、JP1Base、JP1AJS3-ManagerおよびJP1AJS3-Agentとする。
エージェントホストでは、JP1BaseおよびJP1AJS3-Agentに属するルールのみを有効化する。
マネージャホストでは、JP1Base、JP1AJS3-ManagerおよびJP1AJS3-Agentすべてのグループに属するルールを有効化する。
これは、前述の通り、マネージャホストがエージェントホストの機能も併せ持つためである。

なお、以下の実行例では、Powershell のリモート処理機能を用いて作業した。
このため、実行例中のコマンドプロンプトには、[ホスト名]の様にホスト名が含まれている。
マネージャホストのホスト名をmanager、エージェントホストのホスト名をagentとしている。

ルールの定義

Powershellでは、「セキュリティが強化された Windows ファイアウォール」を操作するコマンドレットが提供されている。
新規にルールを作成するためには、New-NetFirewallRuleコマンドレットを使う。
このコマンドレットをそのまま使うとコマンドが長くなるため、作業に先立って、ヘルパ関数fwrhelperを定義する。

このヘルパ関数で定義されるルールは、一旦無効化(-Enabled False)されていることに注意。
従って、定義に続いて、必要なルールのみを有効化する必要がある。

また、適用対象のプロファイルは、Public以外のDomainおよびPrivateとしている。
Publicプロファイルは、信頼性の低い接続の場合に使われるため、JP1/AJS3環境には適切でない場合が多いだろう。

ヘルパ関数fwrhelperの定義

マネージャホストおよびエージェントホストで以下の通り実行する。

[agent]: PS C:\> function fwrhelper($Group,$Name,$DisplayName,$Protocol,$LocalPort){
>>     New-NetFirewallRule -Profile Domain,Private -Action Allow -Enabled False -Direction Inbound `
>>         -Group $Group `
>>         -Name $Name `
>>         -DisplayName $DisplayName `
>>         -Protocol $Protocol `
>>         -LocalPort $LocalPort | ft
>> }
[agent]: PS C:\>

JP1/Base 用ルールの定義

JP1/Base 用のルールを定義する。
マネージャホストおよびエージェントホストで以下の通り実行する。

[agent]: PS C:\> fwrhelper JP1AJS3-Manager JP1AJS3-Agent-to-Manager 'JP1/AJS3 Agent to JP1/AJS3 Manaer' TCP @(20241,20243,20246,20301,22251)

Name                     DisplayName                       DisplayGroup    Enabled Profile         Direction Action
----                     -----------                       ------------    ------- -------         --------- ------
JP1AJS3-Agent-to-Manager JP1/AJS3 Agent to JP1/AJS3 Manaer JP1AJS3-Manager False   Domain, Private Inbound   Allow


[agent]: PS C:\> fwrhelper JP1AJS3-Agent JP1AJS3-Manager-to-Agent 'JP1/AJS3 Manager to JP1/AJS3 Aent' TCP @(20242,20247,20300,22251,23139)

Name                     DisplayName                       DisplayGroup  Enabled Profile         Direction Action
----                     -----------                       ------------  ------- -------         --------- ------
JP1AJS3-Manager-to-Agent JP1/AJS3 Manager to JP1/AJS3 Aent JP1AJS3-Agent False   Domain, Private Inbound   Allow


[agent]: PS C:\> fwrhelper JP1AJS3-Manager JP1AJS3-Manager-to-Manager 'JP1/AJS3 Manager to JP1/AJS3 Manager' TCP @(20241,20244,20245,23160)

Name                       DisplayName                          DisplayGroup    Enabled Profile         Direction Actio
                                                                                                                  n
----                       -----------                          ------------    ------- -------         --------- -----
JP1AJS3-Manager-to-Manager JP1/AJS3 Manager to JP1/AJS3 Manager JP1AJS3-Manager False   Domain, Private Inbound   Allow


[agent]: PS C:\> fwrhelper JP1AJS3-Manager JP1AJS3-SDK-to-Manager 'JP1/AJS3 SDK to JP1/AJS3 Manager' TCP @(22250)

Name                   DisplayName                      DisplayGroup    Enabled Profile         Direction Action
----                   -----------                      ------------    ------- -------         --------- ------
JP1AJS3-SDK-to-Manager JP1/AJS3 SDK to JP1/AJS3 Manager JP1AJS3-Manager False   Domain, Private Inbound   Allow


[agent]: PS C:\> fwrhelper JP1AJS3-Agent JP1AJS3-Agent-to-Agent-TCP 'JP1/AJS3 Agent to JP1/AJS3 Agent (TCP)' TCP @(22251)

Name                       DisplayName                            DisplayGroup  Enabled Profile         Direction Actio
                                                                                                                  n
----                       -----------                            ------------  ------- -------         --------- -----
JP1AJS3-Agent-to-Agent-TCP JP1/AJS3 Agent to JP1/AJS3 Agent (TCP) JP1AJS3-Agent False   Domain, Private Inbound   Allow


[agent]: PS C:\> fwrhelper JP1AJS3-Agent JP1AJS3-Agent-to-Agent-UDP 'JP1/AJS3 Agent to JP1/AJS3 Agent (UDP)' UDP @(22251)

Name                       DisplayName                            DisplayGroup  Enabled Profile         Direction Actio
                                                                                                                  n
----                       -----------                            ------------  ------- -------         --------- -----
JP1AJS3-Agent-to-Agent-UDP JP1/AJS3 Agent to JP1/AJS3 Agent (UDP) JP1AJS3-Agent False   Domain, Private Inbound   Allow


[agent]: PS C:\> fwrhelper JP1AJS3-Manager JP1AJS3-Web-Console-to-Manager 'JP1/AJS3 Web Console to JP1/AJS3 Manager' TCP @(22250)

Name                           DisplayName                              DisplayGroup    Enabled Profile         Directi
                                                                                                                on
----                           -----------                              ------------    ------- -------         -------
JP1AJS3-Web-Console-to-Manager JP1/AJS3 Web Console to JP1/AJS3 Manager JP1AJS3-Manager False   Domain, Private Inbound


[agent]: PS C:\> fwrhelper JP1AJS3-Web-Console Web-Browser-to-JP1AJS3-Web-Console 'Web Browser to JP1/AJS3 Web Console' TCP @(22252,22253)

Name                               DisplayName                         DisplayGroup        Enabled Profile         Dire
                                                                                                                   ctio
                                                                                                                   n
----                               -----------                         ------------        ------- -------         ----
Web-Browser-to-JP1AJS3-Web-Console Web Browser to JP1/AJS3 Web Console JP1AJS3-Web-Console False   Domain, Private I...


[agent]: PS C:\>

定義されたルールの確認

定義されたルールを確認してみよう。
マネージャホストおよびエージェントホストで以下の通り実行する。

[agent]: PS C:\> Get-NetFirewallRule -Group JP1* | ft

Name                               DisplayName                              DisplayGroup        Enabled Profile
----                               -----------                              ------------        ------- -------
JP1Base-to-JP1Base                 JP1/Base to JP1/Base                     JP1Base             False   Domain, Private
JP1AJS3-to-JP1Base                 JP1/AJS3 to JP1/Base                     JP1Base             False   Domain, Private
JP1AJS3-Agent-to-Manager           JP1/AJS3 Agent to JP1/AJS3 Manaer        JP1AJS3-Manager     False   Domain, Private
JP1AJS3-Manager-to-Agent           JP1/AJS3 Manager to JP1/AJS3 Aent        JP1AJS3-Agent       False   Domain, Private
JP1AJS3-Manager-to-Manager         JP1/AJS3 Manager to JP1/AJS3 Manager     JP1AJS3-Manager     False   Domain, Private
JP1AJS3-SDK-to-Manager             JP1/AJS3 SDK to JP1/AJS3 Manager         JP1AJS3-Manager     False   Domain, Private
JP1AJS3-Agent-to-Agent-TCP         JP1/AJS3 Agent to JP1/AJS3 Agent (TCP)   JP1AJS3-Agent       False   Domain, Private
JP1AJS3-Agent-to-Agent-UDP         JP1/AJS3 Agent to JP1/AJS3 Agent (UDP)   JP1AJS3-Agent       False   Domain, Private
JP1AJS3-Web-Console-to-Manager     JP1/AJS3 Web Console to JP1/AJS3 Manager JP1AJS3-Manager     False   Domain, Private
Web-Browser-to-JP1AJS3-Web-Console Web Browser to JP1/AJS3 Web Console      JP1AJS3-Web-Console False   Domain, Private


[agent]: PS C:\>

すべてのルールが無効化されていることに注意。

必要なルールの有効化

マネージャホストおよびエージェントホストそれぞれで、その役割に必要となるルールを有効化する。

必要なルールの有効化 @ エージェントホストt

ファイアウォールグループ JP1Base および JP1AJS3-Agent を有効化する。

[agent]: PS C:\> Enable-NetFirewallRule -Group JP1Base,JP1AJS3-Agent
[agent]: PS C:\> Get-NetFirewallRule -Group JP1* | ft

Name                               DisplayName                              DisplayGroup        Enabled Profile
----                               -----------                              ------------        ------- -------
JP1Base-to-JP1Base                 JP1/Base to JP1/Base                     JP1Base             True    Domain, Private
JP1AJS3-to-JP1Base                 JP1/AJS3 to JP1/Base                     JP1Base             True    Domain, Private
JP1AJS3-Agent-to-Manager           JP1/AJS3 Agent to JP1/AJS3 Manaer        JP1AJS3-Manager     False   Domain, Private
JP1AJS3-Manager-to-Agent           JP1/AJS3 Manager to JP1/AJS3 Aent        JP1AJS3-Agent       True    Domain, Private
JP1AJS3-Manager-to-Manager         JP1/AJS3 Manager to JP1/AJS3 Manager     JP1AJS3-Manager     False   Domain, Private
JP1AJS3-SDK-to-Manager             JP1/AJS3 SDK to JP1/AJS3 Manager         JP1AJS3-Manager     False   Domain, Private
JP1AJS3-Agent-to-Agent-TCP         JP1/AJS3 Agent to JP1/AJS3 Agent (TCP)   JP1AJS3-Agent       True    Domain, Private
JP1AJS3-Agent-to-Agent-UDP         JP1/AJS3 Agent to JP1/AJS3 Agent (UDP)   JP1AJS3-Agent       True    Domain, Private
JP1AJS3-Web-Console-to-Manager     JP1/AJS3 Web Console to JP1/AJS3 Manager JP1AJS3-Manager     False   Domain, Private
Web-Browser-to-JP1AJS3-Web-Console Web Browser to JP1/AJS3 Web Console      JP1AJS3-Web-Console False   Domain, Private


[agent]: PS C:\>

必要なルールの有効化 @ マネージャホストt

ファイアウォールグループ JP1Base、JP1AJS3-Manager および JP1AJS3-Agentを有効化する。
Manager は、Agent の機能も併せ持つため、Agent 用のルールも有効化する必要がある。

[manager]: PS C:\> Enable-NetFirewallRule -Group JP1Base,JP1AJS3-Manager,JP1AJS3-Agent
[manager]: PS C:\> Get-NetFirewallRule -Group JP1* | ft

Name                               DisplayName                              DisplayGroup        Enabled Profile
----                               -----------                              ------------        ------- -------
JP1Base-to-JP1Base                 JP1/Base to JP1/Base                     JP1Base             True    Domain, Private
JP1AJS3-to-JP1Base                 JP1/AJS3 to JP1/Base                     JP1Base             True    Domain, Private
JP1AJS3-Agent-to-Manager           JP1/AJS3 Agent to JP1/AJS3 Manaer        JP1AJS3-Manager     True    Domain, Private
JP1AJS3-Manager-to-Agent           JP1/AJS3 Manager to JP1/AJS3 Aent        JP1AJS3-Agent       True    Domain, Private
JP1AJS3-Manager-to-Manager         JP1/AJS3 Manager to JP1/AJS3 Manager     JP1AJS3-Manager     True    Domain, Private
JP1AJS3-SDK-to-Manager             JP1/AJS3 SDK to JP1/AJS3 Manager         JP1AJS3-Manager     True    Domain, Private
JP1AJS3-Agent-to-Agent-TCP         JP1/AJS3 Agent to JP1/AJS3 Agent (TCP)   JP1AJS3-Agent       True    Domain, Private
JP1AJS3-Agent-to-Agent-UDP         JP1/AJS3 Agent to JP1/AJS3 Agent (UDP)   JP1AJS3-Agent       True    Domain, Private
JP1AJS3-Web-Console-to-Manager     JP1/AJS3 Web Console to JP1/AJS3 Manager JP1AJS3-Manager     True    Domain, Private
Web-Browser-to-JP1AJS3-Web-Console Web Browser to JP1/AJS3 Web Console      JP1AJS3-Web-Console False   Domain, Private


[manager]: PS C:\>

2017/03/21

section フィルタ / Cisco IOS の小技

Cisco IOS で「show running-config」などを実行すると、出力が長くなり、本当に見たい部分を探すのに手間がかかる。
従来から、includeexclude および begin 等のフィルタは準備されていたが、コンフィグの文法に基づいて動作するものではないため、少々不便。
そこで今回紹介するのが section フィルタ。
文字通り、指定したセクションのみを週出してくれるフィルタ。

以下の様に使うことができる:
Switch#sh run | section line
line con 0
line vty 0 4
 transport input ssh
line vty 5 15
 transport input ssh
Switch#

|」(パイプ)の後で使えるフィルタのバリエーションが限られているため、省略形「s」のみで使用することができる。
Switch#sh run | s interface
interface FastEthernet0
 no ip address
interface GigabitEthernet1/0/1
interface GigabitEthernet1/0/2
<<略>>
interface GigabitEthernet1/0/27
interface GigabitEthernet1/0/28

空白で区切って、長いセクション名を指定することができる。
Switch#show conf | s interface FastEthernet
interface FastEthernet0
 no ip address
Switch#

ただし、省略形を使用できない(場合がある)。
Switch#show run | s int Fas
Switch#

正規表現が使えるので、以下の様に実行すれば、期待した動作になる。
Switch#show run | s int.* Fas.*
interface FastEthernet0
 no ip address
Switch#

GigabitEthernet ポートの 20 番台のみを表示しようとして、以下の様に実行しても、ポート 2 が表示され、思った結果にならない。
Switch#show run | s interface GigabitEthernet1/0/2
interface GigabitEthernet1/0/2
interface GigabitEthernet1/0/20
interface GigabitEthernet1/0/21
interface GigabitEthernet1/0/22
interface GigabitEthernet1/0/23
interface GigabitEthernet1/0/24
interface GigabitEthernet1/0/25
interface GigabitEthernet1/0/26
interface GigabitEthernet1/0/27
interface GigabitEthernet1/0/28
Switch#
この場合は、以下の様に実行すればよい。
Switch#show run | s interface GigabitEthernet1/0/2.
interface GigabitEthernet1/0/20
interface GigabitEthernet1/0/21
interface GigabitEthernet1/0/22
interface GigabitEthernet1/0/23
interface GigabitEthernet1/0/24
interface GigabitEthernet1/0/25
interface GigabitEthernet1/0/26
interface GigabitEthernet1/0/27
interface GigabitEthernet1/0/28
Switch#

show コマンドではなく、more コマンドの後でも来した通り動作する。
Switch#$/archive/config-Mar-19-14-03-06.375-41 | section interface Vlan
interface Vlan1
 no ip address
interface Vlan1000
 ip address 10.0.0.1 255.255.255.0
Switch#

2017/02/27

システム起動時のfsck

現状の確認

インストール直後の既定値を確認する。

/etc/fstab

[root@centos01 ~]# cat /etc/fstab | grep /dev/mapper/vg_centos01-lv_root
/dev/mapper/vg_centos01-lv_root /                       ext4    defaults        1 1
[root@centos01 ~]#
第6フィールドが「1」となっている。
この設定では、起動の際にfsck実施条件をチェックし、適宜fsckを実施する。

ボリュームのパラメータ

CentOS 6/RHEL 6の場合、既定ではext4のボリュームは、fsckを実施しない様設定されている。
# ちなみに、CentOS 7/RHEL 7では、既定でxfsのため、起動にfsckは実行されない。
[root@centos01 ~]# tune2fs -l /dev/mapper/vg_centos01-lv_root | egrep -i 'mount count|check'
Mount count:              4
Maximum mount count:      -1
Last checked:             Thu Feb 23 06:06:05 2017
Check interval:           0 (<none>)
[root@centos01 ~]#

現在は、以下の通り設定されていることが判る。
  • マウントされた回数(Mount count)が4、
  • マウント回数によるfsck実行(Maximum mount count)は無し、
  • 最後にfsckが実行されたの(Last checked)が2017.2.23(木) 06:06:05、
  • 経過時間によるfsck実行(Check interval)は無し
結果、既定状態では起動時のfsckは、実行されないことが判る。

マウント回数による条件の検証

Maximum mount countの設定

前に確認した通り、現在のマウント回数は4回なので、Maximum mount countを5に設定する。
[root@centos01 ~]# tune2fs -c 5 /dev/mapper/vg_centos01-lv_root
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to 5
[root@centos01 ~]# tune2fs -l /dev/mapper/vg_centos01-lv_root | egrep -i 'mount count|check'
Mount count:              3
Maximum mount count:      5
Last checked:             Thu Feb 23 06:06:05 2017
Check interval:           0 (<none>)
[root@centos01 ~]#

確認1: fsckされない場合

再度再起動する。
[root@centos01 ~]# shutdown -r now
起動後、確認する。
この時点でマウント回数5回だが、Maximum mount countの設定値5を超えていないため、fsckされない。
最後にfsckした時刻(Last checked)が変わっていないことで確認できる。
[root@centos01 ~]# tune2fs -l /dev/mapper/vg_centos01-lv_root | egrep -i 'mount count|check'
Mount count:              5
Maximum mount count:      5
Last checked:             Thu Feb 23 06:06:05 2017
Check interval:           0 (<none>)
[root@centos01 ~]#

確認2: fsckされる場合

再度再起動する。
[root@centos01 ~]# shutdown -r now
起動後、確認する。
この時点でマウント回数6回に達し、Maximum mount countの設定値5を超えるため、fsckされる。
最後にfsckした時刻(Last checked)が変わったことで確認できる。
[root@centos01 ~]# tune2fs -l /dev/mapper/vg_centos01-lv_root | egrep -i 'mount count|check'
Mount count:              1
Maximum mount count:      5
Last checked:             Sat Feb 25 13:42:42 2017
Check interval:           0 (<none>)
[root@centos01 ~]#

復旧

設定を元に戻す。
[root@centos01 ~]# tune2fs -c -1 /dev/mapper/vg_centos01-lv_root
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to -1
[root@centos01 ~]#

/fastbootの検証

ファイル/fastbootを作成すると、次回起動時にfsckされなくなることを確認する。

設定

[root@centos01 ~]# tune2fs -c 1 /dev/mapper/vg_centos01-lv_root
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to 1
[root@centos01 ~]# tune2fs -l /dev/mapper/vg_centos01-lv_root | egrep -i 'mount count|check'
Mount count:              1
Maximum mount count:      1
Last checked:             Sat Feb 25 13:42:42 2017
Check interval:           0 (<none>)
[root@centos01 ~]#

確認1: fsckされない場合

/fastbootを作成し、再起動する。
[root@centos01 ~]# touch /fastboot
[root@centos01 ~]# shutdown -r now
起動後、確認する。
この時点でマウント回数2回で、Maximum mount countの設定値2を超えているが、/fastbootが作成されていたため、fsckされない。
最後にfsckした時刻(Last checked)が変わっていないことで確認できる。
[root@centos01 ~]# tune2fs -l /dev/mapper/vg_centos01-lv_root | egrep -i 'mount count|check'
Mount count:              2
Maximum mount count:      1
Last checked:             Sat Feb 25 13:42:42 2017
Check interval:           0 (<none>)
[root@centos01 ~]#
再起動前に作成した/fastbootは削除されている。
[root@centos01 ~]# ls /fastboot
ls: cannot access /fastboot: そのようなファイルやディレクトリはありません
[root@centos01 ~]#

確認2: fsckされる場合

/fastbootが設定されていない状態で再起動する。
[root@centos01 ~]# shutdown -r now
起動後、確認する。
この時点でマウント回数3回に達し、Maximum mount countの設定値1を超えるため、fsckされる。
最後にfsckした時刻(Last checked)が変わったことで確認できる。
[root@centos01 ~]# tune2fs -l /dev/mapper/vg_centos01-lv_root | egrep -i 'mount count|check'
Mount count:              1
Maximum mount count:      1
Last checked:             Sat Feb 25 14:35:52 2017
Check interval:           0 (<none>)
[root@centos01 ~]#

復旧

設定を戻す。
[root@centos01 ~]# tune2fs -c -1 /dev/mapper/vg_centos01-lv_root
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to -1
[root@centos01 ~]#

/forcefsckの検証

ファイル/forcefsckを作成すると、強制的にfsckを実行させることができる。
これを確認する。

現在状態の確認

現在の状態を確認する。
[root@centos01 ~]# tune2fs -l /dev/mapper/vg_centos01-lv_root | egrep -i 'mount count|check'
Mount count:              1
Maximum mount count:      -1
Last checked:             Sat Feb 25 14:35:52 2017
Check interval:           0 (<none>)
[root@centos01 ~]#
マウント回数、経過時間共にfsckされる条件を満たしていないことが判る。

確認

/forcefsckを作成し、再起動する。
[root@centos01 ~]# touch /forcefsck
[root@centos01 ~]# shutdown -r now
強制的にfsckが実行される。
起動後、確認する。
最後にfsckした時刻(Last checked)が変わったことで確認できる。
[root@centos01 ~]# tune2fs -l /dev/mapper/vg_centos01-lv_root | egrep -i 'mount count|check'
Mount count:              1
Maximum mount count:      -1
Last checked:             Sat Feb 25 14:48:14 2017
Check interval:           0 (<none>)
[root@centos01 ~]#

/etc/fstabの第6フィールドの検証

/etc/fstabの第6フィールドを0に設定すると、fsckが抑制される。

設定

/etc/fstabの第6フィールドを0に設定する。
[root@centos01 ~]# cp -p /etc/fstab /etc/fstab.orig
[root@centos01 ~]# grep lv_root /etc/fstab
/dev/mapper/vg_centos01-lv_root /                       ext4    defaults        1 1
[root@centos01 ~]# sed -i '/lv_root/s/1$/0/' /etc/fstab
[root@centos01 ~]# grep lv_root /etc/fstab
/dev/mapper/vg_centos01-lv_root /                       ext4    defaults        1 0
[root@centos01 ~]#

Maximum mount countを1に設定する。
[root@centos01 ~]# tune2fs -l /dev/mapper/vg_centos01-lv_root | egrep -i 'mount count|check'
Mount count:              1
Maximum mount count:      -1
Last checked:             Sat Feb 25 14:48:14 2017
Check interval:           0 (<none>)
[root@centos01 ~]# tune2fs -c 1 /dev/mapper/vg_centos01-lv_root
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to 1
[root@centos01 ~]# tune2fs -l /dev/mapper/vg_centos01-lv_root | egrep -i 'mount count|check'
Mount count:              1
Maximum mount count:      1
Last checked:             Sat Feb 25 14:48:14 2017
Check interval:           0 (<none>)
[root@centos01 ~]#

確認1: fsckされない

再起動する。
[root@centos01 ~]# shutdown -r now
起動後、確認する。
この時点でマウント回数2回に達し、Maximum mount countの設定値1を超えるが、/etc/fstabでfsckを抑制しているため、fsckされない。
最後にfsckした時刻(Last checked)が変わっていないことで確認できる。
[root@centos01 ~]# tune2fs -l /dev/mapper/vg_centos01-lv_root | egrep -i 'mount count|check'
Mount count:              2
Maximum mount count:      1
Last checked:             Sat Feb 25 14:48:14 2017
Check interval:           0 (<none>)
[root@centos01 ~]#

確認2: /etc/fstabの第6フィールド VS /forcefsck

/etc/fstabの第6フィールドを0にした状態で/forcefsckを作成した場合どうなるか検証する。

/forcefsckを作成し、再起動する。
[root@centos01 ~]# touch /forcefsck
[root@centos01 ~]# shutdown -r now
起動後、確認する。
この時点でマウント回数3回に達し、Maximum mount countの設定値1を超え、さらに/etc/forcefsckが作成されているが、/etc/fstabでfsckを抑制しているため、fsckされない。
最後にfsckした時刻(Last checked)が変わっていないことで確認できる。
[root@centos01 ~]# tune2fs -l /dev/mapper/vg_centos01-lv_root | egrep -i 'mount count|check'
Mount count:              3
Maximum mount count:      1
Last checked:             Sat Feb 25 14:48:14 2017
Check interval:           0 (<none>)
[root@centos01 ~]#

復元1: /etc/fstabのみ

/etc/fsckの第6フィールドのみ設定を戻す。
[root@centos01 ~]# mv -f /etc/fstab.orig /etc/fstab
[root@centos01 ~]# grep lv_root /etc/fstab
/dev/mapper/vg_centos01-lv_root /                       ext4    defaults        1 1
[root@centos01 ~]#

確認3: fsckされる

/etc/fsckの第6フィールドの設定を戻すと、fsckされることを確認する。
[root@centos01 ~]# shutdown -r now
起動後、確認する。
この時点でマウント回数4回に達し、Maximum mount countの設定値1を超えるので、fsckされる。
最後にfsckした時刻(Last checked)が変わったことで確認できる。
[root@centos01 ~]# tune2fs -l /dev/mapper/vg_centos01-lv_root | egrep -i 'mount count|check'
Mount count:              1
Maximum mount count:      1
Last checked:             Sat Feb 25 15:21:03 2017
Check interval:           0 (<none>)
[root@centos01 ~]#

復元2: Maximum mount count

Maximum mount countの設定を戻す。
[root@centos01 ~]# tune2fs -c -1 /dev/mapper/vg_centos01-lv_root
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to -1
[root@centos01 ~]#

2017/02/21

PowerShellからCMD.exeやpowershell.exeのフォントを追加する

Cmd.exeやpowershell.exeなどで、Windowsのコンソール(ターミナル)を使う場合、既定では日本語が表示できるTrueTypeフォントは、MSゴシックしか選べない。
今回は、PowerShellを使ってWindowsのコンソールにフォントを追加し、選択できるようにする方法を紹介する。

フォントの準備

Windowのコンソールに追加するフォントを準備する。
これらは、いわゆる等幅フォントでなければならない。
RictyMyrica等、好みのフォントをインストールしておく。

現状設定の確認

続いて、現状の設定を確認する。
PowerShellを管理者モードで起動し、以下の通り実行する
PS C:\> $ttf = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont'
PS C:\> Get-Item $ttf


    Hive: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console


Name                           Property
----                           --------
TrueTypeFont                   949 : *굴림체
                               0   : Lucida Console
                               950 : *細明體
                               932 : *MS ゴシック
                               936 : *新宋体
                               00  : Consolas


PS C:\>
「MS ゴシック」とある行の「932」は、いわゆるMicrosoftコードページ932 (CP932)のこと。
既定では、CP932に対して、MSゴシック一つのみが登録されており、唯一選択可能になっていることが解る。

CP932に対して、フォントを追加する場合、この部分を932.1, 932.2, 932.3,…の様に「コードページ.番号」の様な形で追加する必要がある。

なお、選択されたフォントは、フォント名の直前に「*」がついている。
上の例では、CP932に対しては、MSゴシックが選択されていることが解る(と言っても唯一の選択肢だが)。

フォントの追加

今回は、
  • Ricty Discord
  • Ricty
  • MyricaM M
  • Myrica M
を追加する。
フォント名の部分は、適宜読み替える。

以下の通り実行する。
PS C:\> New-ItemProperty $ttf -Name 932.1 -PropertyType string -Value 'Ricty Discord'


932.1        : Ricty Discord
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFon
               t
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console
PSChildName  : TrueTypeFont
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry



PS C:\> New-ItemProperty $ttf -Name 932.2 -PropertyType string -Value 'Ricty'


932.2        : Ricty
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFon
               t
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console
PSChildName  : TrueTypeFont
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry



PS C:\> New-ItemProperty $ttf -Name 932.3 -PropertyType string -Value 'MyricaM M'


932.3        : MyricaM M
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFon
               t
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console
PSChildName  : TrueTypeFont
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry



PS C:\> New-ItemProperty $ttf -Name 932.4 -PropertyType string -Value 'Myrica M'


932.4        : Myrica M
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFon
               t
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console
PSChildName  : TrueTypeFont
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry



PS C:\>

結果の確認

結果を確認する。
PS C:\> Get-Item $ttf


    Hive: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console


Name                           Property
----                           --------
TrueTypeFont                   949   : *굴림체
                               0     : Lucida Console
                               950   : *細明體
                               932   : *MS ゴシック
                               936   : *新宋体
                               00    : Consolas
                               932.1 : Ricty Discord
                               932.2 : Ricty
                               932.3 : MyricaM M
                               932.4 : Myrica M


PS C:\>
932.[1-4]にそれぞれフォントが追加されたのが判る。

この状態で、cmd.exeやpowershell.exeを起動し、プロパティ画面のフォントタブから、複数のフォントが選べるようになっていることを確認できる。

2017/02/06

IOS.shの実行中断

前回紹介したIOS.shの実行中断に関する補足。
前回は、以下のように紹介した:
他のコマンド(ping等)と同様、[Ctrl]+[Alt]+[6] (HEX 1E。MacのTerminalからだと[Ctrl]+[^]らしい)で実行を中断することができる。
しかし、実際には止まらない場合がある。例えば:
Switch#while true; do echo "#### `show clock`"; ping 10.0.0.3 repeat 1; sleep 1; done
#### 04:26:14.555 JST Tue Feb 7 2017
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 10.0.0.3, timeout is 2 seconds:
!
Success rate is 100 percent (1/1), round-trip min/avg/max = 7/7/7 ms
#### 04:26:15.569 JST Tue Feb 7 2017
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 10.0.0.3, timeout is 2 seconds:
!
Success rate is 100 percent (1/1), round-trip min/avg/max = 1/1/1 ms
#### 04:26:16.576 JST Tue Feb 7 2017
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 10.0.0.3, timeout is 2 seconds:
!
これを実行しているときに[Ctrl]+[Alt]+[6]を入力しても、実行中断することができない。

この場合、他のセッションを開いて、上のコマンドを実行中のセッションごと強制終了する。
例えば、上のコマンドを、シリアルコンソール(console 0)から実行している場合、SSHで新しいセッションを開いておいて、以下の通り実行する。
Switch#clear line console 0
[confirm]y [OK]
Switch#
もとのシリアルコンソールは、強制的にログアウトされ、ログインプロンプトが表示される。
Switch con0 is now available





Press RETURN to get started.









User Access Verification

Username:

2017/02/05

Cisco IOSでshell: IOS.sh

Cisco IOS (Apple iOSではない)は、CatalystやCiscoルータと言ったCiscoのネットワーク機器のOS。

コの業界、特にインフラ系では、Ciscoがデファクトスタンダードで、避けては通れない。

で、このIOSは主にCLIで操作するのだが、独自のコマンド体系で、UNIX/Linux系のシェルに慣れている技術者には、少々とっつきにくい。
例えば、パイプ(|)はサポートされているが、grepコマンドではなくincludeコマンドを使う、などなど。

これを少しだけ解決するのが、今回紹介するIOS.sh
IOS上でUNIX系のコマンドの一部と、Bourne Shell系の制御構造が使える。
バッチファイルを使うこともできる(エディタは無いが…)

IOS.shは、IOS 15.1(4)M、15.1(2)S以降のバージョンでサポートされている。
サポートしているIOS上で「cat ?」と入力すると、
Switch>cat ?
The command you have entered is available in the IOS.sh.
However, the shell is currently disabled. You can enable
it on this terminal by typing
   'term shell'
You can also enable it for all terminals by configuring the
   'shell processing full'
command. There is additional information in the man command.
For more information, enable shell, and then enter:
'man IOS.sh'
Switch>cat
と表示されることが確認できる。

起動と停止

IOSにログインして、「terminal shell」あるは短縮形で「term shell」と入力して起動する。
Switch>terminal shell
Switch>
停止は、「terminal no shell」もしくは「term no shell(「no term shell」じゃないんだな、これが)
Switch>terminal no shell
Switch>
または、ログアウトしても停止する。

現在状態の確認

「show terminal」コマンドで調べる。
Switch>show terminal | include Shell
Shell: enabled
Shell trace: off
Switch>

実行中断

他のコマンド(ping等)と同様、[Ctrl]+[Alt]+[6] (HEX 1E。MacのTerminalからだと[Ctrl]+[^]らしい)で実行を中断することができる。
Switch>i=0; while true; do echo $i; ((i=i+1)); done
0
1
2
<<略>>
[Shift]+[Ctrl]+[6]
105
106
107       ^
% Invalid input detected at '^' marker.

Switch>
ちょっとゴミが出てるが気にしない。
追記: [Shift]+[Ctrl]+[6]で実行停止できない場合について、補足した。

マニュアル

Linux/Unix同様、manコマンドが使える。
まずは、「man IOS.sh」を見よ。
Switch>man IOS.sh
NAME
    IOS.sh - process shell input

DESCRIPTION
The IOS.sh is a set of add-on features to the IOS
CLI. These features enables users to write scripts,
execute functions, evaluate numeric and logical expressions,
and perform loops over data using a standard, easy to learn
syntax.

In addition, the IOS.sh offers variable substitution, enhanced
quoting, and a series of builtin functions that are designed to
simplify the job of interacting with an IOS router.

In order to learn about the IOS.sh, a set of man pages such as
this one have been prepared to describe the various new features.
The following man pages may be used learn about the shell.

 man compatibility   -  gives a quick overview of compatibility between
                        shell and traditional IOS CLI
 man variables       -  describes the usage of variables
 man scripting       -  gives a quick overview of the scripting
                        capabilities of IOS.sh
 man expressions     -  describes the expression syntax built into the IOS.sh
 man loops           -  describes loop structures built into IOS.sh
 man functions       -  describes how to use and write functions
 man quoting         -  describes the new quoting facility
Switch>
ちなみに、上の「man .*」の内、手元の環境15.2(2)E5では、「man loops」のみエラーとなった。

なお、単に「man」だけ入力すると、manコマンドで調査可能な項目の一覧が表示される。
Switch>man
((              evaluate a numeric test expression
IOS.sh          The IOS shell
[[              evaluate a logical test expression
cat             output data from a pipe or file to the terminal
compatibility   compatibility information on IOS.sh
control         control constructs in IOS.sh
<<略>>
variables       usage of variables in IOS.sh
wc              count lines, words, and chars
while           iterate while an expression is TRUE

Switch>