久しぶりにGNS3（その22：スクリプトその3）

# Linux Shell
[久しぶりにGNS3（その20：スクリプトその1）](https://qiita.com/infinite1oop/items/244c32b55187b26bd978)および[久しぶりにGNS3（その21：スクリプトその2）](https://qiita.com/infinite1oop/items/462686ea24477f8ffbab)の続きである。今回はシェル（Linux Shell）を扱う。

## 参考URL
1. [本家サイト Cisco IOS Shell Configuration Guide](https://www.cisco.com/c/en/us/td/docs/ios/netmgmt/configuration/guide/Convert/IOS_Shell/nm_ios_shell.html)
1. [Cisco IOS.sh Shell](https://www.virtualpackets.com/cisco-ios-sh-shell/)
1. [Cisco IOS Shell Command Reference](https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/ios_shl/command/ios-shell-cr-book/ios-shell-cr-a1.html)

## 環境
[前回](https://qiita.com/infinite1oop/items/462686ea24477f8ffbab)と同じ。ただし、Shellに関して特徴的なところはない。
![topology.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/7a3a8050-ccc8-76c0-f9ff-065506ad85e7.png)

## トライ
まずは、下記コマンドで、Shellモードを起動。
```
Router#terminal shell
```

### スクリプトの作成および実行
あまり適切な例ではないかもしれないが、Routerの各I/Fの状況を表示するコマンド”show ip int br”の結果から、”grep”を用いて”Up”のI/Fだけを表示するスクリプトを作成する。まずは、スクリプト作成前のコマンド実行状況。
```
Router#show ip int br
Interface                  IP-Address      OK? Method Status                Protocol
Ethernet0/0                192.168.122.118 YES DHCP   up                    up      
Ethernet0/1                unassigned      YES NVRAM  up                    up      
Ethernet0/2                unassigned      YES NVRAM  administratively down down    
Ethernet0/3                unassigned      YES NVRAM  administratively down down    
Ethernet1/0                unassigned      YES NVRAM  administratively down down    
Ethernet1/1                unassigned      YES NVRAM  administratively down down    
Ethernet1/2                unassigned      YES NVRAM  administratively down down    
Ethernet1/3                unassigned      YES NVRAM  administratively down down    
Serial2/0                  unassigned      YES NVRAM  administratively down down    
Serial2/1                  unassigned      YES NVRAM  administratively down down    
Serial2/2                  unassigned      YES NVRAM  administratively down down    
Serial2/3                  unassigned      YES NVRAM  administratively down down    
Serial3/0                  unassigned      YES NVRAM  administratively down down    
Serial3/1                  unassigned      YES NVRAM  administratively down down    
Serial3/2                  unassigned      YES NVRAM  administratively down down    
Serial3/3                  unassigned      YES NVRAM  administratively down down    
Router#
Router#show ip int br | grep up
Ethernet0/0                192.168.122.118 YES DHCP   up                    up      
Ethernet0/1                unassigned      YES NVRAM  up                    up      
```
次に作成。
```
Router#function upif() {
{..} >show ip int br | grep up
{..} >}
Router#
Router#upif
Ethernet0/0                192.168.122.118 YES DHCP   up                    up      
Ethernet0/1                unassigned      YES NVRAM  up                    up      
```
参考URLの情報をもとにした。”function 関数名()”以下を、マニュアルで入力する。

### スクリプトの確認
作成したスクリプトを、”show shell functions”や”show shell environment”で確認する。
```
Router#show shell functions 
#User defined functions:

Function namespace: DEFAULT
function upif() 
{
 show ip int br  |  grep up
}

続く、、、

Router#show shell environment 
# Environment Variables:
# User Environment Variables:
?=0
prc_change_mode=PRC_INVALID
prc_change_type=PRC_INVALID
prc_error_code=PRC_INVALID
prc_failure_type=PRC_INVALID
prc_ha_sync=PRC_INVALID
# Global Environment Variables:
# Builtin Environment Variables:
PATH=CLI%Userfunctions%Builtins%SYSTEM
# Environment Functions:

# User Environment Functions:

Function namespace: DEFAULT
function upif() 
{
 show ip int br  |  grep up
}

続く、、、、
```
### スクリプトのSave
参考URL#3に記載あり。”shell environment save ファイル”コマンドを用いる。場所は”nvram”、ファイル名は”test.env”とした。Save前後のNVRAMの状況も記載。
```
Router#dir nvram:
Directory of nvram:/

   28  -rw-        2551                    <no date>  startup-config
   29  ----           0                    <no date>  private-config
    1  ----         361                    <no date>  persistent-data
    2  -rw-          17                    <no date>  ecfm_ieee_mib
    4  -rw-          88                    <no date>  pingTest.tcl

32768 bytes total (27093 bytes free)
Router#shell environment save nvram:test.env
Router#
Router#dir nvram:
Directory of nvram:/

   28  -rw-        2551                    <no date>  startup-config
   29  ----           0                    <no date>  private-config
    1  ----         361                    <no date>  persistent-data
    2  -rw-          17                    <no date>  ecfm_ieee_mib
    3  -rw-         265                    <no date>  test.env
    4  -rw-          88                    <no date>  pingTest.tcl

32768 bytes total (26069 bytes free)
Router#

Router#cat nvram:test.env
# Shell Environment File.
# Environment Variables:
?=0
prc_change_mode=PRC_INVALID
prc_change_type=PRC_INVALID
prc_error_code=PRC_INVALID
prc_failure_type=PRC_INVALID
prc_ha_sync=PRC_INVALID
# Environment Functions:
function upif() 
{
 show ip int br  |  grep up
}
Router#
```
上記のように、catコマンドで保存された内容の確認ができる。

### スクリプトのLoad
”shell environment load ファイル 'replace'or'merge'”コマンドで、Saveした環境をLoadする。Load前はコマンドが実行できず、Load後は実行できる。
```
Router#terminal shell
Router#
Router#upif
Translating "upif"...domain server (192.168.122.1)
 (192.168.122.1)
Translating "upif"...domain server (192.168.122.1)

% Bad IP address or host name
% Unknown command or computer name, or unable to find computer address
Router#dir nvram:
Directory of nvram:/

   28  -rw-        2551                    <no date>  startup-config
   29  ----           0                    <no date>  private-config
    1  ----         361                    <no date>  persistent-data
    2  -rw-          17                    <no date>  ecfm_ieee_mib
    3  -rw-         265                    <no date>  test.env
    4  -rw-          88                    <no date>  pingTest.tcl

32768 bytes total (26069 bytes free)

Router#shell environment load nvram:test.env replace
Router#
Router#upif
Ethernet0/0                192.168.122.118 YES DHCP   up                    up      
Ethernet0/1                unassigned      YES NVRAM  up                    up      

```


## おまけ
### 保存領域（NVRAM）のファイル削除
NVRAMの状況は下記となっている。
```
Router# dir nvram:         
Directory of nvram:/

   28  -rw-        2551                    <no date>  startup-config
   29  ----           0                    <no date>  private-config
    1  ----         361                    <no date>  persistent-data
    2  -rw-          17                    <no date>  ecfm_ieee_mib
    3  -rw-          26                    <no date>  H.tcl
    4  -rw-          88                    <no date>  pingTest.tcl

32768 bytes total (26069 bytes free)
```
ここで、deleteコマンドにより、H.tclを削除。
```
Router#delete nvram:H.tcl
Delete filename [H.tcl]? 
Delete nvram:H.tcl? [confirm]
Router#
Router# dir nvram:       
Directory of nvram:/

   28  -rw-        2551                    <no date>  startup-config
   29  ----           0                    <no date>  private-config
    1  ----         361                    <no date>  persistent-data
    2  -rw-          17                    <no date>  ecfm_ieee_mib
    4  -rw-          88                    <no date>  pingTest.tcl

32768 bytes total (27093 bytes free)
```

## 最後に
tcl、EEM、shellを組み合わせた（部分的にでも）何かを考えてみたい。