コンソールからのコマンド入力を補助する機能として、変数、エイリアス、マクロ、ヒストリー機能が利用できます。変数、エイリアス、マクロを利用すると、長いコマンドの入力を簡略化したり、複数のコマンドを一度に実行することができます。ヒストリーを利用すると、過去に入力したコマンドを簡単に呼び出せるようになります。
また、変数はLuaスクリプトから環境変数として利用することができます。
ヤマハルーターでは以下の機種およびファームウェアで、変数、エイリアス、マクロ、ヒストリー機能をサポートしています。
機種 | ファームウェア |
---|---|
vRX VMware ESXi版 | すべてのリビジョン |
vRX Amazon EC2版 | |
RTX3510 | |
RTX1300 | |
RTX1220 | |
RTX830 | Rev.15.02.03以降 |
NVR510 | Rev.15.01.13以降 |
NVR700W | Rev.15.00.14以降 |
RTX1210 | Rev.14.01.26以降 |
RTX5000 | Rev.14.00.26以降 |
RTX3500 |
set
コマンドで変数に設定した値を、その後のコマンドで利用することができます。コマンド中に何度も同じ値が出てくる場合、それを変数にまとめておくことでコマンドの入力を簡単にすることができます。
変数は$
の後に変数名を記述することで呼び出せます。例えば変数VAR
を呼び出すためには、$VAR
と記述します。後続の文字列と明確に分離する必要がある場合には、${VAR}
のようにブレースで変数名を囲みます。
$
の後ろにある文字列が変数として定義されていない文字列の場合には、文字列の展開は行われず、$
を含め、もともとの文字列が保持されます。
# set NET=192.168.10 # ip route $NET.1 gateway 10.10.10.1 ⇒ ip route 192.168.10.1 gateway 10.10.10.1 # pp select 1 # pp auth myname userid Passwd$NETx ⇒ pp auth myname userid Passwd$NETx (NETxという変数は定義されていないので'$NETx'は変換されない)
また、他の変数の定義の中で、${{VAR}}
とブレースを二重にして記述した場合、変数VAR
が展開されるのはset
コマンド実行時ではなく、定義された変数が展開されるときになります。この展開は再帰的に定義できますが、無限ループを防ぐために再帰の深さを最大10に制限しています。最大の深さは変数MAX_VAREXP_RECURSIVE
で変更できます。
二重ブレースによる変数定義は、他の変数の内容を引用するときに便利です。
# set NET=192.168.10 # set HOST1=${NET}.1 ⇒ set HOST1=192.168.10.1 # set HOST2=${{NET}}.1 ⇒ set HOST2=${NET}.1 # ip route $HOST1 gateway 10.10.10.1 ⇒ ip route 192.168.10.1 gateway 10.10.10.1 # ip route $HOST2 gateway 10.10.10.1 ⇒ ip route 192.168.10.1 gateway 10.10.10.1 # set NET=10.20.30 # ip route $HOST1 gateway 10.10.10.1 ⇒ ip route 192.168.10.1 gateway 10.10.10.1 # ip route $HOST2 gateway 10.10.10.1 ⇒ ip route 10.20.30.1 gateway 10.10.10.1
変数名には、半角文字の英大文字、英小文字、数字、アンダースコア(_
)が使用できます。英大文字、英小文字は区別されます。set
コマンドで設定する変数は必ず英文字で始まらなければいけません。
変数は、すべてのコンソールで共通で管理されます。変数はLuaスクリプトからも、os.getenv関数により環境変数として利用することができます。また、一部の変数はLuaスクリプト機能などの動作に影響を与えます。
LUA_INIT |
Luaスクリプト開始時に事前に実行させるスクリプト |
LUA_PATH |
require関数がLuaモジュールをロードするために使用するパス |
PWD |
ファイルを指定するコマンドにおいて、相対パスの起点となるパス |
MAX_VAREXP_RECURSIVE |
変数の再帰展開の最大の深さ。変数未設定時は10 |
MAX_MACRO_RECURSIVE |
マクロの再帰呼び出しの最大の深さ。変数未設定時は10 |
HISTSIZE |
ヒストリーの保存数。変数未設定時は50 |
コマンド行の先頭に@
がある場合、続く文字列をエイリアスあるいはマクロとして展開します。エイリアスはalias
コマンドで設定した文字列にエイリアスを置き換えます。マクロは、macro
コマンドで設定した複数のコマンドを順次実行していきます。
call
コマンドによりRTFSや外部メモリーに保存したファイルをマクロとして呼び出すこともできます。エイリアスとマクロは、すべてのコンソールで共通で管理されます。
エイリアスとマクロの名前には、半角文字の英大文字、英小文字、数字、アンダースコア(_
)が使用できます。英大文字、英小文字は区別されます。同じ名前のエイリアスとマクロがある場合、エイリアスの方が優先されて展開されます。
マクロの呼び出しでは、引数を与えることができます。引数はマクロ内でのみ有効な変数として機能します。マクロ引数には以下の2種類があります。
名前付き引数 | NAME=VALUE の形で引数を指定すると、マクロ内では値VALUE を持つ変数NAME を利用できます。 |
位置引数 | 名前付き引数以外の引数は、位置引数として、$ の後に数字を続けることでマクロ内で利用できます。先頭の引数は$1 、2番目は$2 となり、コマンドとして入力できる限りいくつでも指定できます。$0 はマクロ名(@ によるマクロ展開の場合)またはファイル名(call コマンドの場合)です。$* は$1 から最後の位置引数までを空白を挟んで連結した文字列となります。 |
# alias s="show ip route" # @s ⇒ show ip route # @s summary ⇒ show ip route summary # @s detail ⇒ show ip route detail # macro m <<EOM echo Called macro "'$0'" with argument $* ip route $1.0/25 gateway $2 ip route $1.128/25 gateway $3 EOM # @m 192.168.10 10.10.10.1 10.20.20.2 ⇒ 以下のコマンドを順次実行 ⇒ echo Called macro "'m'" with argument 192.168.10 10.10.10.1 10.20.20.2 ⇒ ip route 192.168.10.0/25 gateway 10.10.10.1 ⇒ ip route 192.168.10.128/25 gateway 10.20.20.2 # macro m2 <<EOM ip route $NET.0/25 gateway $1 ip route $NET.128/25 gateway $2 EOM # @m2 10.10.10.1 10.20.20.2 NET=192.168.10 ⇒ 以下のコマンドを順次実行 ⇒ ip route 192.168.10.0/25 gateway 10.10.10.1 ⇒ ip route 192.168.10.128/25 gateway 10.20.20.2 # call /file.mac 192.168.10 10.10.10.1 ⇒ ファイル"/file.mac"をマクロとして呼び出す
マクロの中で他のマクロを呼び出すこともできますが、無限ループを防ぐために再帰の深さを最大10に制限しています。最大の深さは、変数MAX_MACRO_RECURSIVE
で変更できます。エイリアスから他のエイリアスやマクロを呼び出すことはできません。
# macro loop <<EOM echo loop @loop EOM # @loop loop loop loop loop loop loop loop loop loop Error: Too depth macro call # set MAX_MACRO_RECURSIVE=3 # @loop loop loop Error: Too depth macro call #
対話的コンソール(シリアル、TELNET、SSH等)では、過去に入力されたコマンドをヒストリーとして参照、再利用することが可能です。
ヒストリーは、上下の矢印キーで呼び出せます。上矢印(↑)キーで一つずつ過去にさかのぼりながらヒストリーを呼び出せます。下矢印(↓)キーでは元に戻ります。
また、コマンド行の先頭に以下の記号を入力すると、ヒストリー参照となります。
!! |
直前のコマンドが参照されます。 |
! n |
nで示される番号のコマンドが参照されます。番号はshow command history コマンドで確認できます。 |
!- n |
現在のコマンド行からnで示される番号だけ前のコマンドが参照されます。!-1 は直前のコマンドであり、!! と同じです。!-2 は2つ前のコマンドになります。 |
! str!{ str} |
strで始まるコマンドのうち、一番最近入力されたコマンドが参照されます。{ } を使う記法の場合は、str に空白文字を含めることができます。str では変数やエイリアスの展開は行われません。 |
# show ip Error: Invalid command name # !! route show ip route : : # !-2 connection show ip connection : : # show command history 1 2018/01/01 08:00:00 administrator 2 2018/01/01 08:00:10 show ip 3 2018/01/01 08:00:20 show ip route 4 2018/01/01 08:00:30 show ip connection # !1 administrator Error: You are administrator #!2v6 route show ipv6 route : : # !show show ipv6 route : :
参照されたコマンドは、置き換えの前に修正することができます。ヒストリー参照の直後に:s/BEFORE/AFTER/
または:gs/BEFORE/AFTER/
を置くと、ヒストリー中の文字列BEFORE
がAFTER
に置き換えられます。s
の場合は置き換えは最初の一回だけ行われ、gs
の場合は見つかったすべての文字列に対して置き換えが行われます。置き換え指示は複数列挙することができます。
置き換え指示の区切り文字である/
には、空白、TAB、バックスラッシュ(\
)を除く他の半角文字も利用でき、s
やgs
の直後の文字が区切り文字として使用されます。また、最後の区切り文字は省略することができます。
# show ip route : : # !!:s/ip/ipv6/ show ipv6 route : : # !!:s|ipv6|ip| show ip route : :
ヒストリーは最大50件保存されます。この値は変数HISTSIZE
で変更できます。ヒストリーは対話型コンソールごとに管理され、同時にログインしている他のコンソールとは共有されません。また、ヒストリーはコンソールからログアウトしたときにすべて削除され、次回のログイン時には引き継がれません。
NAME | ... 変数名 |
VALUE | ... 値となる文字列 |
NAMEに使用できる文字は、英大文字、英小文字、数字、アンダースコア(_)のみで、先頭は必ず英文字でなければならない。VALUEに空白等の特殊文字を含む場合は、VALUE全体を引用符で囲む必要がある。
NAME | ... 変数名 |
[表示例] # set A=123 # set NET=192.168.10 # set TEST="This is a test" # show set A='123' NET='192.168.10' TEST='This is a test' #
NAME | ... エイリアス名 |
VALUE | ... 値となる文字列 |
NAMEに使用できる文字は、英大文字、英小文字、数字、アンダースコア(_)のみで、先頭は必ず英文字でなければならない。VALUEに空白等の特殊文字を含む場合は、VALUE全体を引用符で囲む必要がある。
NAME | ... エイリアス名 |
[表示例] # alias s='show ip route' # alias e='exit' # show alias e='exit' s='show ip route' #
NAME | ... マクロ名 |
EOM | ... マクロの終端文字列 |
このコマンド入力後、マクロ入力状態になるので、マクロの内容を入力していく。マクロの最後には、EOMで指定した終端文字列だけを入力すれば、マクロ入力が終了する。マクロ入力中でも、Ctrl-Cを入力すればコマンドを中断できる。
[設定例(下線部がユーザーの入力内容)]
# macro m <<EOM
show ip route
show ip connection
EOM
#
-vオプションを指定すると、マクロを実行するときに、実行する各行について、変数とエイリアスの展開前の内容を表示しながら実行する。-xオプションは、変数とエイリアスを展開した後の行を表示しながらマクロを実行する。
NAMEに使用できる文字は、半角の英大文字、英小文字、数字、アンダースコア(_)のみで、先頭は必ず英文字でなければならない。
Luaスクリプトのrt.command()で複数行からなるコマンドを実行する場合には、各行を改行文字('\n'
)で連結した文字列をコマンドとして渡す。改行文字は'\n'
でなくてはならず、'\r'
や'\r\n'
ではエラーとなる。
rtn, err = rt.command("macro x <<EOM\necho This is x\nEOM")
NAME | ... マクロ名 |
[表示例(下線部がユーザーの入力内容)] # macro m <<EOM show ip route show ip connection EOM # macro m6 <<EOM show ipv6 route EOM # # show macro macro m <<EOM show ip route show ip connection EOM macro m6 <<EOM show ipv6 route EOM #
FILENAME | ... ファイル名 |
PARAMETER | ... マクロ引数 |
マクロには引数を渡すことができる。引数が、NAME=VALUEの形をしている場合、マクロ内では変数NAMEとしてVALUEを参照できる。他の形の引数は位置引数として、指定された順番に、$1、$2等でアクセスできる。$0はファイル名、$*はすべての位置引数を空白で結合した文字列となる。引数はすべてマクロ内でのみ利用可能な変数である。
-vオプションを指定すると、マクロを実行するときに、実行する各行について、変数とエイリアスの展開前の内容を表示しながら実行する。-xオプションは、変数とエイリアスを展開した後の行を表示しながらマクロを実行する。
STRING | ... 表示したい文字列 |
[表示例] # echo Hello World Hello World # set A=123 # echo $A 123 #
NUM | ... ヒストリー番号 (1 .. 2147483647) |
NUMを指定した場合は、指定した番号のコマンドから直前のコマンドまで表示する。NUMを省略した場合には、新しいものからさかのぼって最大20個のコマンドを表示する。
[表示例] # show command history 1 2018/01/01 08:00:00 administrator 2 2018/01/01 08:00:10 show ip route 3 2018/01/01 08:00:20 show ip connection 4 2018/01/01 08:00:30 ip route 192.168.10.1 #