Another round of clever commands from the depths of /usr/bin
Take a stroll through /usr/bin
on most Linux or macOS systems and you’ll find hundreds if not thousands of available commands. The amount of options at your disposal seems dizzying. Although some of these commands won’t be the most relevant or useful every day, the majority of them are quite handy and some are just downright clever.
If we count the number of commands available on a fresh installation of Debian 10 (Buster) it is over 2,000 (you can run compgen -c
to see the list for yourself). It would take you years to comb through that many options and master them all. Luckily, you don’t have to do that.
In this article (a sequel to 6 Terminal Commands You Should Know) we’ll look at a set of six more interesting and useful commands that will make you a productivity master when you add them to your repertoire.
Let’s start exploring a few!
1. Compare differences in files with cmp
cmp <file1> <file2>
Let’s assume you have two text files. In each file are some simple lines of text like this:
file1.txt file2.txt
-------- --------
line1 line1
line2 line2
line4 line3
If you didn’t want to open each file up and examine it by looking for lines that weren’t the same, you could use cmp
to quickly determine any divergence in the files.
If you pass cmp file1.txt file2.txt
you’ll see the following output:
file1.txt file2.txt differ: char 17, line 3
This quickly shows you exactly where the two files diverged by identifying the line and the character number. This utility is super handy for making on-the-fly file comparisons. You could check the basic validity of a copy job by verifying files were the same or hunt down bugs in code by comparing some source files to see where they differ.
2. Find lines common in files with comm
comm <file1> <file2>
On the flip side, instead of finding differing lines like cmp
the comm
utility scans for similar lines. With this command, you can identify lines that are common to two files.
Let’s use the same two files from the previous example and see how this utility works:
file1.txt file2.txt
-------- --------
line1 line1
line2 line2
line4 line3
Now if we run comm file1.txt file2.txt
we should see the following output:
line1
line2
line3
line4
This output can be a little confusing at first, but all its showing you is three specific columns of results:
- The first column contains lines present only from the first input file
- The second column only lines from the second input file
- The last column lines common to both files
With this utility, we can quickly identify files containing identical lines. This could be useful for finding variables defined in multiple files or hunting for duplicate entries in some text output.
If you need case insensitivity you can also pass the -i
flag to comm
.
3. Preload trusted SSH keys using ssh-keyscan
ssh-keyscan <hostname> >> ~/.ssh/known_hosts
How many times have you connected to a new machine and received the generic warning:
"The authenticity of host <foo> can't be established.Are you sure you want to continue connecting? (yes/no)?"
If you’re connecting to hosts that you know already to be authentic (from an internal network or a publicly available service like GitHub) then this message isn’t protecting you from much.
Most of the time users simply type “yes” faster than you can say “security vulnerability” anyway. So is there any way to reduce how many times we see this message if we connect to a lot of hosts? Yes!
Using ssh-keyscan
you can scan a particular host or a list of hosts for public SSH keys and add them to your known_hosts
file. Now when you connect to that host you won’t be prompted because the key will already exist in your known_hosts
file. For example, let’s say you wanted to scan GitLab for keys and automatically add them:
ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
Now you should be able to SSH to public GitLab hosts without being prompted to add the keys before proceeding.
4. Record a log of your terminal session with script
Have you ever been working on something complex or frustrating in a terminal session and wished you could automatically save all the output for later? The script
command lets you do exactly that.
This simple program was originally designed for students to save logs of all their work in order to show how they arrived at a solution. The usefulness, however, doesn’t stop in academia.
I’ve used this utility to save logs during sensitive operations where I had to be doubly sure I ran a particular command. This has also been implemented as a rudimentary way to log specific user sessions for security reviews later.
5. Generate test data with jot
jot <number>
Need a lot of random or sequential data really fast? Use jot
. This nifty and ultra-simple utility lets you generate a huge list of numbers and create some pretty large data output.
With jot
you can build sequential sets of numbers, strings, and bytes or just spew random data. The following command will generate a list of sequential numbers from 1–100:
jot 1001 2 ... 100
See how easy that was? Now, what about some random numbers?
jot -r 10019 27 ... 49
How about a few big long strings?
jot -s abc 1001abc2abc3abc4abc5abc6abc7abc8abc9abc10abc11abc12abc13abc14abc15abc16abc17abc18abc19abc20abc21abc22abc23abc24abc25abc26abc27abc28abc29abc30abc31abc32abc33abc34abc35abc36abc37abc38abc39abc40abc41abc42abc43abc44abc45abc46abc47abc48abc49abc50abc51abc52abc53abc54abc55abc56abc57abc58abc59abc60abc61abc62abc63abc64abc65abc66abc67abc68abc69abc70abc71abc72abc73abc74abc75abc76abc77abc78abc79abc80abc81abc82abc83abc84abc85abc86abc87abc88abc89abc90abc91abc92abc93abc94abc95abc96abc97abc98abc99abc100
This command is fast, simple, and way easier than anything else I’ve used to quickly generate simple test data.
6. Quick reference for networking with iptab
iptab
This is one I cannot believe I overlooked. Its brutally simple but incredibly helpful when you’re in a rush trying to make networking changes. Firing off the iptab
command with no arguments will display a reference table of subnet masks and other IP address space details:
+----------------------------------------------+
| addrs bits pref class mask |
+----------------------------------------------+
| 1 0 /32 255.255.255.255 |
| 2 1 /31 255.255.255.254 |
| 4 2 /30 255.255.255.252 |
| 8 3 /29 255.255.255.248 |
| 16 4 /28 255.255.255.240 |
| 32 5 /27 255.255.255.224 |
| 64 6 /26 255.255.255.192 |
| 128 7 /25 255.255.255.128 |
| 256 8 /24 1C 255.255.255.0 |
| 512 9 /23 2C 255.255.254.0 |
| 1K 10 /22 4C 255.255.252.0 |
| 2K 11 /21 8C 255.255.248.0 |
| 4K 12 /20 16C 255.255.240.0 |
| 8K 13 /19 32C 255.255.224.0 |
| 16K 14 /18 64C 255.255.192.0 |
| 32K 15 /17 128C 255.255.128.0 |
| 64K 16 /16 1B 255.255.0.0 |
| 128K 17 /15 2B 255.254.0.0 |
| 256K 18 /14 4B 255.252.0.0 |
| 512K 19 /13 8B 255.248.0.0 |
| 1M 20 /12 16B 255.240.0.0 |
| 2M 21 /11 32B 255.224.0.0 |
| 4M 22 /10 64B 255.192.0.0 |
| 8M 23 /9 128B 255.128.0.0 |
| 16M 24 /8 1A 255.0.0.0 |
| 32M 25 /7 2A 254.0.0.0 |
| 64M 26 /6 4A 252.0.0.0 |
| 128M 27 /5 8A 248.0.0.0 |
| 256M 28 /4 16A 240.0.0.0 |
| 512M 29 /3 32A 224.0.0.0 |
| 1024M 30 /2 64A 192.0.0.0 |
| 2048M 31 /1 128A 128.0.0.0 |
| 4096M 32 /0 256A 0.0.0.0 |
+----------------------------------------------+
There are no arguments for this command, just a simple table for you to reference and then get back to making those critical network changes.
That’s it for this one — thanks for reading!
By: Tate Galbraith