IOS 15.1(4)M brought some nice cool new stuff with it. With it was shell processing, which opens up a plethora of linux commands.
Enabling shell processing on Cisco IOS
To enable shell processing we use the command:
R17(config)#shell processing full R17(config)#
This then allows us to use lot’s of new commands. To see the new commands type in “man”:
R17#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 cut edit piped output echo echo arguments to the terminal expressions usage of expressions in IOS.sh false return false in while or if expressions, and set the result fetch return values from the configuration database for IOS.sh for loops functions IOS.sh function facility grep search for regular expressions in piped output or files head print the first lines in the input if-else IOS.sh if command interface print interfaces that match the argument let evaluate a numeric expression, and set the result man print information for builtins more page piped output to the terminal nl number the lines in the input null ignore the input printf output formatted data to the terminal quoting IOS.sh quoting facility read read input into variables scripting how to script the IOS CLI set_oper set operational values sleep pause execution of the terminal sort sort the input tail print the tail of the input true return true in while or if expressions, and set the result uname print system information variables usage of variables in IOS.sh wc count lines, words, and chars while iterate while an expression is TRUE R17#
Using grep to limit output
Now that we have enabled shell processing, we can use “grep”:
R17#sh run int lo0 | grep 'address' ip address 22.214.171.124 255.255.255.255 R17#
This gives us the ip address.
Using cut to get an IP address
We can then use “cut” to return just the numbers:
R17#sh run int lo0 | grep 'address' | cut -c 13-24 126.96.36.199 R17#
This can be useful, as we can turn this command into a variable.
Why would we do this? Well, for certain things, such as setting router-ids for routing protocols, we would usually hard-code this to be the loopback interface’s IP address. When switching from one router to the next it’s easy to forget what the IP address is. You can always use “do sh run int lo0”, but then it’s easy to lose the flow, having it set as a variable makes life much easier.
Creating a variable in IOS shell
To create a variable we use the command “variable=variableoutput”:
R17#varMyLo0=`sh run int lo0 | grep 'address' | cut -c 13-24`
Here, we create a variable called “varMyLo0”. The backticks set the output of the command as the actual variable (the IP address).
Using a variable to set a router-id
We can then use this variable when configuring the device:
R17(config)#router bgp 100 R17(config-router)#bgp router-id $varMyLo0 R17(config-router)#do sh run | sec bgp router bgp 100 bgp router-id 188.8.131.52 bgp log-neighbor-changes R17(config-router)#exit
If we do this again, just to prove it works, for OSPF, we can see that OSPF is not running, we can create the OSPF process, and, again, use the variable to set the router ID:
R17#sh run | sec router ospf R17#conf t R17(config)#router ospf 100 R17(config-router)#router-id $varMyLo0 R17(config-router)#end R17#sh run | sec router ospf router ospf 100 router-id 184.108.40.206 R17#
So, now, you don’t need to keep looking at the “sh run int lo0” to remind yourself of the IP address, and type it in manually, or copy and paste it.
If the IP address is shorter (say 220.127.116.11) then the cut would be shorter (cut -c 13-21).
This could save some time during the exam!
If you have any good shell processing tips, then feel free to comment with them!