Bash Command Wrapper
Problem this snippet solves:
As you know, aliases have always been a powerful and essential tool to any administrator. Beginning in v11.1, administrators can create "global aliases" which all users can access. Before, aliases were only available to the user who created them. For now, we can start using them by pointing them to built-in commands to allow your users to run those commands from any context and prevent the need for running the full command path, ex. needing to type "run /util ping" if your not specifically in the "/util" context.
How to use this snippet:
ex.
root@bigip1(Active)(/Common)(tmos)# create cli alias shared ping { command "run /util ping" } root@bigip1(Active)(/Common)(tmos)# list cli alias cli alias shared ping { command "run /util ping" } cli alias shared ping6 { command "run /util ping6" } cli alias shared tcpdump { command "run /util tcpdump" } ...
Voila, another "Operator" user:
test-operator@bigip1(Active)(/Common)(tmos)# ping 10.60.65.1 PING 10.60.65.1 (10.60.65.1) 56(84) bytes of data. 64 bytes from 10.60.65.1: icmp_seq=1 ttl=64 time=0.303 ms --- 10.60.65.1 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.303/0.303/0.303/0.000 ms
Future versions (with ID377568 - Add global aliases for useful utilities and enable by default) will have built-in global aliases for the default utilities provided /util but for now, this makes running those basic commands a little easier for your users and more like other devices they may be used to working on.
Notes:
They will still only work for those users who have permissions to those particular commands of course.
Do not make aliases for built-in commands like save, load, etc. as aliases don't process arguments. To process arguments you will need a script like below.
Or use them to create commands to customize the output you would commonly like to focus on:
root@bigip1(Active)(/Common)(tmos)# create cli alias shared showtmm { command "show /sys tmm-traffic | grep -E 'Sys|--|Conn' | grep -v -E 'Mem|Red'" } root@bigip1(Active)(/Common)(tmos)# showtmm ---------------------------------------------- Sys::TMM: 0.0 ---------------------------------------------- Current Connections 9 9 Maximum Connections 12 12 Total Connections 89.8K 89.8K
In addition, by pointing to a tmsh script, global aliases also allow an adminstrator to extend the utilitilties provided by default in tmsh /util. For instance, you love tmsh but there are always those bash commands you can't live without.
ex. First create a tmsh script as a bash wrapper:
root@bigip1(Active)(/Common)(tmos)# list cli script bash_cmd cli script /Common/bash_cmd { proc script::run {} { if { [ catch { exec /bin/bash -c [lrange $tmsh::argv 1 end] >&@ stdout } result ] } { puts "bash command returned error. exiting." } } }
Then create global aliases to common bash commands:
cli alias shared scp { command "run /cli script bash_cmd scp" } cli alias shared ls { command "run /cli script bash_cmd ls" } cli alias shared less { command "run /cli script bash_cmd less" }
Now all other users, who have bash permissions of course, can use all your favorite commands.
test-admin-user@bigip1(Active)(/Common)(tmos)# ls -lash /var/tmp/*my-capture*.pcap 12K -rw-r--r-- 1 root webusers 4.6K Dec 29 16:33 /var/tmp/my-capture-2.pcap 12K -rw------- 1 root root 4.4K Nov 14 21:37 /var/tmp/my-capture.pcap
You can even use that script to create an all purpose wrapper alias which you can use to access any bash command (i.e. you can simply type "shell" before any bash command and don't really need to create an alias for each individual command).
cli alias shared shell { command "run /cli script bash_cmd" }
ex.
test-admin-user@bigip1(Active)(/Common)(tmos)# shell scp /var/tmp/my-capture.pcap user1@10.60.65.1:/var/tmp/ user1@10.60.65.1's password: my-capture.pcap 100% 4505 4.4KB/s 00:00 test-admin-user@bigip1(Active)(/Common)(tmos)# shell ls -lash /var/tmp/*my-capture*.pcap | sed 's/capture/tmsh/' 12K -rw-r--r-- 1 root webusers 4.6K Dec 29 16:33 /var/tmp/my-tmsh-2.pcap 12K -rw------- 1 root root 4.4K Nov 14 21:37 /var/tmp/my-tmsh.pcap
For commands you commonly use, it might be worth still creating specific aliases for them to avoid the exta typing.
However, to prevent all interopolation issues when stringing together longer one-liners, you would really need the simple alias like below:
cli alias shared shell_script { command "run /util bash -c" }
And surround the command string in double quotes.
ex.
test-admin-user@bigip1(Active)(/Common)(tmos)# shell_script "for i in {1..5}; do top -cbn 1 | awk '{print $5,$6,$7,$9,$12}' | egrep -i '/usr/bin/tmm' | sed 's/tmm/tmsh is fun/' ; done" 512m 120m 119m 5.5 /usr/bin/tmsh is fun 512m 120m 119m 5.8 /usr/bin/tmsh is fun 512m 120m 119m 5.9 /usr/bin/tmsh is fun 512m 120m 119m 9.9 /usr/bin/tmsh is fun 512m 120m 119m 8.9 /usr/bin/tmsh is fun
This allows you to string together more complex commands like awk which have their own interpolation.
Now power users don't really need to exit out to bash as much!
Note: I tend to use both the "shell" and "shell_script" aliases quite frequently so you may chose to keep both around.
TECH TIP
Your TMSH preferences are located here:
root@bigip1(Active)(/Common)(tmos.cli.preference)# list all-properties cli preference { alias-path { /Common } app-service none confirm-edit enabled display-threshold 100 editor vi history-date-time disabled history-file-size 10000 history-size 500 keymap default list-all-properties disabled pager enabled partition Common prompt { host user status current-folder } show-aliases enabled stat-units default table-indent-width 2 tcl-syntax-highlighting disabled video enabled warn bell } root@bigip1(Active)(/Common)(tmos.cli.preference)# modify tcl-syntax-highlighting enabled root@bigip1(Active)(/Common)(tmos.cli.preference)# modify history-size 1000 root@bigip1(Active)(/Common)(tmos.cli.preference)# modify history-file-size 20000 root@bigip1(Active)(/Common)(tmos.cli.preference)# list cli preference { alias-path { /Common } editor nano history-file-size 20000 history-size 1000 prompt { host user status current-folder } tcl-syntax-highlighting enabled }
Which is located in /config/bigip_user.conf tagged with "user root".
cli preference { alias-path { /Common } history-file-size 20000 history-size 1000 prompt { host user status current-folder } tcl-syntax-highlighting enabled user root }
Code :
# see above