website/blog/The Joy of One-Liners/index.md

147 lines
6.5 KiB
Markdown
Raw Permalink Normal View History

2023-07-12 00:08:49 +02:00
2022-05-29
2023-07-08 17:00:40 +02:00
# The Joy of One-Liners
There is an engineering idiom which withstands time like no other. As
old as the hills but never forgotten. In informational technology
relations, one could say it is ancient. Its dawn proclaimed from the
shores of Seattle, defeated by an apocalyptic horseman with the
melodious name *NT*. Shot! Point blank into the chest. Buried under the
hills of an IT dark age which we call the nineties, dead. But is it?
Well, not exactly. There is still life in the old dog. Like Beatrix
Kiddo, it one-inch punches itself back to daylight. Coal black as a
miner. Topsoil sticks to its beige 1978's leather jacket, it trickles to
the ground with every step taken to the nearest diner. The door opens
again. "May I have a glass of water, please?"
An art passed down from the ancestors. Its most visible interface: *The
Shell*. Its name: *The Unix Philosophy*.
Coined by Doug McIlroy in the [Bell System Technical
Journal](https://archive.org/details/bstj57-6-1899/mode/2up) as a
foreword to the UNIX Time-Sharing System. There is an even more concise
2023-07-15 23:53:43 +02:00
version[[1]](#references) and
2023-07-08 17:00:40 +02:00
according to [Eric Steven
Raymond](http://www.catb.org/~esr/writings/taoup/html/ch01s06.html) this
2023-07-15 23:53:43 +02:00
is [[2]](#references):
2023-07-08 17:00:40 +02:00
> "This is the Unix philosophy: Write programs that do one thing and do
> it well. Write programs to work together. Write programs to handle
> text streams, because that is a universal interface."
> --- Doug McIlroy ---
In some way, this is similar to the concept of the on vogue philosophy
of microservices everywhere. Services are written to do one thing and do
it well. They work together. Also, text is the connecting link between
programs, services, and humans. The possibility to read a program's
output as text seems benign, as long as everything is working well. The
advantage is interactivity at any time, testability of every component,
and debuggability at every step of the process in an on the fly manner.
Impromptu, out of reflex like a punch.
2023-07-15 23:53:43 +02:00
## [Pipe Dreams](#pipe-dreams)
2023-07-08 17:00:40 +02:00
------------------------------------------------------------------------
Mc Ilroy made another very important contribution, which is the Unix
pipe. It is the practical implementation of connecting the programs
inside the shell. He saw the programs as tools, plugged together via
pipes building a
[toolbox](http://www.princeton.edu/~hos/Mahoney/expotape.htm). Program
A's `stdout` is put into the `stdin` of program B. This leaves us with a
single line of chained, well-defined programs to solve a problem that
would otherwise be an extensive, multi-line program in any programming
language of your choice.
Let's say we've got two programs. The first is one is *fortune*, the
fortune cookie program from BSD games, which outputs random quotes as
text. The second one is *cowsay*, which displays various kinds of
animals as ASCII art. In order to work in a coherent manner a `|` is
used. The pipe connects the first one to the second one.
```sh
fortune | cowsay
_________________________________________
/ Gil-galad was an Elven-king. Of him the \
| harpers sadly sing: the last whose |
| realm was fair and free between the |
| Mountains and the Sea. |
| |
| His sword was long, his lance was keen, |
| his shining helm afar was seen; the |
| countless stars of heaven's field were |
| mirrored in his silver shield. |
| |
| But long ago he rode away, and where he |
| dwelleth none can say; for into |
| darkness fell his star in Mordor where |
| the shadows are. |
| |
\ -- J. R. R. Tolkien /
-----------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
```
To mix in some colors pipe everything through lolcat. Try it out!
```sh
fortune | cowsay | lolcat
```
So far so good, let us gain some real-world practice.
2023-07-15 23:53:43 +02:00
## [Punching Lines and Retire Your Password Generator](#punching-lines-and-retire-your-password-generator)
2023-07-08 17:00:40 +02:00
------------------------------------------------------------------------
Have you ever questioned the integrity of your one-click, GUI,
proprietary password generator? Is its randomness really as
unpredictable as it proclaims? Are you the only one which ends up
knowing your generated password? There is a one-liner that ups your
opsec instantly. Right from the source of randomness:
```sh
head -n 42 /dev/urandom | tr -cd '[:alnum:]' | cut -c-12
```
So, what is going on here? Everything is a file, that is the way \*nix
systems see it, even the device which puts out random data. To read the
upper part of a file we use `head`. It will be sent to `stdout` and
displayed via the shell. Parameter `-n` reads exactly 42 lines of the
file given to gather enough randomness. The output of `head` will be
sent to `tr`. In order to select only alphanumeric characters for our
password, we use `'[:alnum:]'`. Parameters `-c` selects the complement
of alphanumeric characters and `-d` deletes them. `cut` does exactly
what it says, `-c-12` cuts after 12 characters with leaves us with a
random password of length 12. Every time you execute this one-liner a
freshly made random password is returned.
To extend the pool of possible symbols the manual of `tr` lists various
sets of filtered symbols. In the case of a password generator, further
sensible filters are `'[:alpha:]'` or `'[:digit:]'`. While `'[:graph:]'`
is also viable in this case it returns one of the greater sets of
symbols. Use it with caution, especially if you create passwords for
database users. These might be terminated prematurely through `` ` `` or
`'` inside the returned string.
2023-07-15 23:53:43 +02:00
## [Sunday Punch](#sunday-punch)
2023-07-08 17:00:40 +02:00
------------------------------------------------------------------------
This blog entrance can be seen as a prelude to a series of one-liners I
use time and time again. The are multiple in the pipeline. One-liners
should save you the time you otherwise would spend coding a complex
solution. There is little better than solving a challenging problem in a
single line.
2023-07-15 23:53:43 +02:00
## [References](#references)
2023-07-08 17:00:40 +02:00
[[1] A Quarter Century of Unix, 1994, Peter Salus,
ISBN:9780201547771](https://www.bookfinder.com/?isbn=9780201547771)
[[2] The Art of UNIX Programming, 2003, Eric Raymond,
ISBN:9780131429017](https://www.bookfinder.com/?isbn=9780131429017)