264 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			HTML
		
	
	
	
			
		
		
	
	
			264 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			HTML
		
	
	
	
<!doctype html>
 | 
						|
<html lang="en">
 | 
						|
    <center>
 | 
						|
    <head>
 | 
						|
        
 | 
						|
    
 | 
						|
        <meta charset="utf-8">
 | 
						|
        <link rel="stylesheet" href="/static/stylesheet.css">
 | 
						|
        <title>Stefan's Blog</title>
 | 
						|
        <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
						|
    <div class="menu">
 | 
						|
    <a href="/" style="text-decoration:none">Stefan Friese's Website</a>
 | 
						|
    </div>
 | 
						|
    <style>
 | 
						|
        /* Stylesheet 1 */
 | 
						|
        body { background: #2f333d; color: #979fad; }
 | 
						|
        hr{ color: #979fad; border-color: #979fad; }
 | 
						|
        pre { background: #282c34; color: #979fad; border: 1px solid #282c34; }
 | 
						|
        code { background: #282c34; color: #979fad; }
 | 
						|
        a:hover { color: #be5046; }
 | 
						|
        details > summary { background: #282c34; }
 | 
						|
        details > summary:hover { background: #2f333d; color: #979fad; }
 | 
						|
        ::selection { background: #668799; }
 | 
						|
        ::-moz-selection { background: #668799; }
 | 
						|
    </style>
 | 
						|
 | 
						|
<hr style="width: 36ch;"/>
 | 
						|
    <div class="menu">
 | 
						|
    <a href="/about.html" style="text-decoration:none">about </a>    
 | 
						|
    <a href="/contact.html" style="text-decoration:none">contact </a>
 | 
						|
    <a href="/rss.xml" style="text-decoration:none">rss </a>
 | 
						|
    <a href="https://git.stefan.works" style="text-decoration:none">git</a>
 | 
						|
    </div>
 | 
						|
    <br><br>
 | 
						|
<p></p>
 | 
						|
    <hr/>
 | 
						|
    </center>
 | 
						|
<p></p>
 | 
						|
        
 | 
						|
 | 
						|
    </head>
 | 
						|
    <body>
 | 
						|
        <div lang="en" class="content"> 
 | 
						|
       <span class="body">
 | 
						|
           <!-- 2022-05-29 -->
 | 
						|
           <style>pre { line-height: 125%; }
 | 
						|
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
 | 
						|
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
 | 
						|
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 | 
						|
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 | 
						|
.codehilite .hll { background-color: #ffffcc }
 | 
						|
.codehilite .c { color: #7F848E } /* Comment */
 | 
						|
.codehilite .err { color: #ABB2BF } /* Error */
 | 
						|
.codehilite .esc { color: #ABB2BF } /* Escape */
 | 
						|
.codehilite .g { color: #ABB2BF } /* Generic */
 | 
						|
.codehilite .k { color: #C678DD } /* Keyword */
 | 
						|
.codehilite .l { color: #ABB2BF } /* Literal */
 | 
						|
.codehilite .n { color: #E06C75 } /* Name */
 | 
						|
.codehilite .o { color: #56B6C2 } /* Operator */
 | 
						|
.codehilite .x { color: #ABB2BF } /* Other */
 | 
						|
.codehilite .p { color: #ABB2BF } /* Punctuation */
 | 
						|
.codehilite .ch { color: #7F848E } /* Comment.Hashbang */
 | 
						|
.codehilite .cm { color: #7F848E } /* Comment.Multiline */
 | 
						|
.codehilite .cp { color: #7F848E } /* Comment.Preproc */
 | 
						|
.codehilite .cpf { color: #7F848E } /* Comment.PreprocFile */
 | 
						|
.codehilite .c1 { color: #7F848E } /* Comment.Single */
 | 
						|
.codehilite .cs { color: #7F848E } /* Comment.Special */
 | 
						|
.codehilite .gd { color: #ABB2BF } /* Generic.Deleted */
 | 
						|
.codehilite .ge { color: #ABB2BF } /* Generic.Emph */
 | 
						|
.codehilite .gr { color: #ABB2BF } /* Generic.Error */
 | 
						|
.codehilite .gh { color: #ABB2BF } /* Generic.Heading */
 | 
						|
.codehilite .gi { color: #ABB2BF } /* Generic.Inserted */
 | 
						|
.codehilite .go { color: #ABB2BF } /* Generic.Output */
 | 
						|
.codehilite .gp { color: #ABB2BF } /* Generic.Prompt */
 | 
						|
.codehilite .gs { color: #ABB2BF } /* Generic.Strong */
 | 
						|
.codehilite .gu { color: #ABB2BF } /* Generic.Subheading */
 | 
						|
.codehilite .gt { color: #ABB2BF } /* Generic.Traceback */
 | 
						|
.codehilite .kc { color: #E5C07B } /* Keyword.Constant */
 | 
						|
.codehilite .kd { color: #C678DD } /* Keyword.Declaration */
 | 
						|
.codehilite .kn { color: #C678DD } /* Keyword.Namespace */
 | 
						|
.codehilite .kp { color: #C678DD } /* Keyword.Pseudo */
 | 
						|
.codehilite .kr { color: #C678DD } /* Keyword.Reserved */
 | 
						|
.codehilite .kt { color: #E5C07B } /* Keyword.Type */
 | 
						|
.codehilite .ld { color: #ABB2BF } /* Literal.Date */
 | 
						|
.codehilite .m { color: #D19A66 } /* Literal.Number */
 | 
						|
.codehilite .s { color: #98C379 } /* Literal.String */
 | 
						|
.codehilite .na { color: #E06C75 } /* Name.Attribute */
 | 
						|
.codehilite .nb { color: #E5C07B } /* Name.Builtin */
 | 
						|
.codehilite .nc { color: #E5C07B } /* Name.Class */
 | 
						|
.codehilite .no { color: #E06C75 } /* Name.Constant */
 | 
						|
.codehilite .nd { color: #61AFEF } /* Name.Decorator */
 | 
						|
.codehilite .ni { color: #E06C75 } /* Name.Entity */
 | 
						|
.codehilite .ne { color: #E06C75 } /* Name.Exception */
 | 
						|
.codehilite .nf { color: #61AFEF; font-weight: bold } /* Name.Function */
 | 
						|
.codehilite .nl { color: #E06C75 } /* Name.Label */
 | 
						|
.codehilite .nn { color: #E06C75 } /* Name.Namespace */
 | 
						|
.codehilite .nx { color: #E06C75 } /* Name.Other */
 | 
						|
.codehilite .py { color: #E06C75 } /* Name.Property */
 | 
						|
.codehilite .nt { color: #E06C75 } /* Name.Tag */
 | 
						|
.codehilite .nv { color: #E06C75 } /* Name.Variable */
 | 
						|
.codehilite .ow { color: #56B6C2 } /* Operator.Word */
 | 
						|
.codehilite .pm { color: #ABB2BF } /* Punctuation.Marker */
 | 
						|
.codehilite .w { color: #ABB2BF } /* Text.Whitespace */
 | 
						|
.codehilite .mb { color: #D19A66 } /* Literal.Number.Bin */
 | 
						|
.codehilite .mf { color: #D19A66 } /* Literal.Number.Float */
 | 
						|
.codehilite .mh { color: #D19A66 } /* Literal.Number.Hex */
 | 
						|
.codehilite .mi { color: #D19A66 } /* Literal.Number.Integer */
 | 
						|
.codehilite .mo { color: #D19A66 } /* Literal.Number.Oct */
 | 
						|
.codehilite .sa { color: #98C379 } /* Literal.String.Affix */
 | 
						|
.codehilite .sb { color: #98C379 } /* Literal.String.Backtick */
 | 
						|
.codehilite .sc { color: #98C379 } /* Literal.String.Char */
 | 
						|
.codehilite .dl { color: #98C379 } /* Literal.String.Delimiter */
 | 
						|
.codehilite .sd { color: #98C379 } /* Literal.String.Doc */
 | 
						|
.codehilite .s2 { color: #98C379 } /* Literal.String.Double */
 | 
						|
.codehilite .se { color: #98C379 } /* Literal.String.Escape */
 | 
						|
.codehilite .sh { color: #98C379 } /* Literal.String.Heredoc */
 | 
						|
.codehilite .si { color: #98C379 } /* Literal.String.Interpol */
 | 
						|
.codehilite .sx { color: #98C379 } /* Literal.String.Other */
 | 
						|
.codehilite .sr { color: #98C379 } /* Literal.String.Regex */
 | 
						|
.codehilite .s1 { color: #98C379 } /* Literal.String.Single */
 | 
						|
.codehilite .ss { color: #98C379 } /* Literal.String.Symbol */
 | 
						|
.codehilite .bp { color: #E5C07B } /* Name.Builtin.Pseudo */
 | 
						|
.codehilite .fm { color: #56B6C2; font-weight: bold } /* Name.Function.Magic */
 | 
						|
.codehilite .vc { color: #E06C75 } /* Name.Variable.Class */
 | 
						|
.codehilite .vg { color: #E06C75 } /* Name.Variable.Global */
 | 
						|
.codehilite .vi { color: #E06C75 } /* Name.Variable.Instance */
 | 
						|
.codehilite .vm { color: #E06C75 } /* Name.Variable.Magic */
 | 
						|
.codehilite .il { color: #D19A66 } /* Literal.Number.Integer.Long */</style>
 | 
						|
<p>2022-05-29</p>
 | 
						|
<h1 id="the-joy-of-one-liners">The Joy of One-Liners</h1>
 | 
						|
<p>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 <em>NT</em>. 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?"</p>
 | 
						|
<p>An art passed down from the ancestors. Its most visible interface: <em>The
 | 
						|
Shell</em>. Its name: <em>The Unix Philosophy</em>.</p>
 | 
						|
<p>Coined by Doug McIlroy in the <a href="https://archive.org/details/bstj57-6-1899/mode/2up">Bell System Technical
 | 
						|
Journal</a> as a
 | 
						|
foreword to the UNIX Time-Sharing System. There is an even more concise
 | 
						|
version<a href="#references">[1]</a> and
 | 
						|
according to <a href="http://www.catb.org/~esr/writings/taoup/html/ch01s06.html">Eric Steven
 | 
						|
Raymond</a> this
 | 
						|
is <a href="#references">[2]</a>:</p>
 | 
						|
<blockquote>
 | 
						|
<p>"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."<br />
 | 
						|
--- Doug McIlroy ---</p>
 | 
						|
</blockquote>
 | 
						|
<p>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.</p>
 | 
						|
<h2 id="pipe-dreams"><a href="#pipe-dreams">Pipe Dreams</a></h2>
 | 
						|
<hr />
 | 
						|
<p>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
 | 
						|
<a href="http://www.princeton.edu/~hos/Mahoney/expotape.htm">toolbox</a>. Program
 | 
						|
A's <code>stdout</code> is put into the <code>stdin</code> 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.</p>
 | 
						|
<p>Let's say we've got two programs. The first is one is <em>fortune</em>, the
 | 
						|
fortune cookie program from BSD games, which outputs random quotes as
 | 
						|
text. The second one is <em>cowsay</em>, which displays various kinds of
 | 
						|
animals as ASCII art. In order to work in a coherent manner a <code>|</code> is
 | 
						|
used. The pipe connects the first one to the second one.</p>
 | 
						|
<div class="codehilite"><pre><span></span><code>fortune<span class="w"> </span><span class="p">|</span><span class="w"> </span>cowsay
 | 
						|
<span class="w">         </span>_________________________________________
 | 
						|
<span class="w">        </span>/<span class="w"> </span>Gil-galad<span class="w"> </span>was<span class="w"> </span>an<span class="w"> </span>Elven-king.<span class="w"> </span>Of<span class="w"> </span>him<span class="w"> </span>the<span class="w"> </span><span class="se">\</span>
 | 
						|
<span class="w">        </span><span class="p">|</span><span class="w"> </span>harpers<span class="w"> </span>sadly<span class="w"> </span>sing:<span class="w"> </span>the<span class="w"> </span>last<span class="w"> </span>whose<span class="w">      </span><span class="p">|</span>
 | 
						|
<span class="w">        </span><span class="p">|</span><span class="w"> </span>realm<span class="w"> </span>was<span class="w"> </span>fair<span class="w"> </span>and<span class="w"> </span>free<span class="w"> </span>between<span class="w"> </span>the<span class="w">     </span><span class="p">|</span>
 | 
						|
<span class="w">        </span><span class="p">|</span><span class="w"> </span>Mountains<span class="w"> </span>and<span class="w"> </span>the<span class="w"> </span>Sea.<span class="w">                  </span><span class="p">|</span>
 | 
						|
<span class="w">        </span><span class="p">|</span><span class="w">                                         </span><span class="p">|</span>
 | 
						|
<span class="w">        </span><span class="p">|</span><span class="w"> </span>His<span class="w"> </span>sword<span class="w"> </span>was<span class="w"> </span>long,<span class="w"> </span>his<span class="w"> </span>lance<span class="w"> </span>was<span class="w"> </span>keen,<span class="w"> </span><span class="p">|</span>
 | 
						|
<span class="w">        </span><span class="p">|</span><span class="w"> </span>his<span class="w"> </span>shining<span class="w"> </span>helm<span class="w"> </span>afar<span class="w"> </span>was<span class="w"> </span>seen<span class="p">;</span><span class="w"> </span>the<span class="w">     </span><span class="p">|</span>
 | 
						|
<span class="w">        </span><span class="p">|</span><span class="w"> </span>countless<span class="w"> </span>stars<span class="w"> </span>of<span class="w"> </span>heaven<span class="err">'</span>s<span class="w"> </span>field<span class="w"> </span>were<span class="w">  </span><span class="p">|</span>
 | 
						|
<span class="w">        </span><span class="p">|</span><span class="w"> </span>mirrored<span class="w"> </span><span class="k">in</span><span class="w"> </span>his<span class="w"> </span>silver<span class="w"> </span>shield.<span class="w">          </span><span class="p">|</span>
 | 
						|
<span class="w">        </span><span class="p">|</span><span class="w">                                         </span><span class="p">|</span>
 | 
						|
<span class="w">        </span><span class="p">|</span><span class="w"> </span>But<span class="w"> </span>long<span class="w"> </span>ago<span class="w"> </span>he<span class="w"> </span>rode<span class="w"> </span>away,<span class="w"> </span>and<span class="w"> </span>where<span class="w"> </span>he<span class="w"> </span><span class="p">|</span>
 | 
						|
<span class="w">        </span><span class="p">|</span><span class="w"> </span>dwelleth<span class="w"> </span>none<span class="w"> </span>can<span class="w"> </span>say<span class="p">;</span><span class="w"> </span><span class="k">for</span><span class="w"> </span>into<span class="w">         </span><span class="p">|</span>
 | 
						|
<span class="w">        </span><span class="p">|</span><span class="w"> </span>darkness<span class="w"> </span>fell<span class="w"> </span>his<span class="w"> </span>star<span class="w"> </span><span class="k">in</span><span class="w"> </span>Mordor<span class="w"> </span>where<span class="w">  </span><span class="p">|</span>
 | 
						|
<span class="w">        </span><span class="p">|</span><span class="w"> </span>the<span class="w"> </span>shadows<span class="w"> </span>are.<span class="w">                        </span><span class="p">|</span>
 | 
						|
<span class="w">        </span><span class="p">|</span><span class="w">                                         </span><span class="p">|</span>
 | 
						|
<span class="w">        </span><span class="se">\ </span>--<span class="w"> </span>J.<span class="w"> </span>R.<span class="w"> </span>R.<span class="w"> </span>Tolkien<span class="w">                     </span>/
 | 
						|
<span class="w">         </span>-----------------------------------------
 | 
						|
<span class="w">                </span><span class="se">\ </span><span class="w">  </span>^__^
 | 
						|
<span class="w">                 </span><span class="se">\ </span><span class="w"> </span><span class="o">(</span>oo<span class="o">)</span><span class="se">\_</span>______
 | 
						|
<span class="w">                    </span><span class="o">(</span>__<span class="o">)</span><span class="se">\ </span><span class="w">      </span><span class="o">)</span><span class="se">\/\</span>
 | 
						|
<span class="w">                        </span><span class="o">||</span>----w<span class="w"> </span><span class="p">|</span>
 | 
						|
<span class="w">                        </span><span class="o">||</span><span class="w">     </span><span class="o">||</span>
 | 
						|
</code></pre></div>
 | 
						|
 | 
						|
<p>To mix in some colors pipe everything through lolcat. Try it out!</p>
 | 
						|
<div class="codehilite"><pre><span></span><code>fortune<span class="w"> </span><span class="p">|</span><span class="w"> </span>cowsay<span class="w"> </span><span class="p">|</span><span class="w"> </span>lolcat
 | 
						|
</code></pre></div>
 | 
						|
 | 
						|
<p>So far so good, let us gain some real-world practice.</p>
 | 
						|
<h2 id="punching-lines-and-retire-your-password-generator"><a href="#punching-lines-and-retire-your-password-generator">Punching Lines and Retire Your Password Generator</a></h2>
 | 
						|
<hr />
 | 
						|
<p>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:</p>
 | 
						|
<div class="codehilite"><pre><span></span><code>head<span class="w"> </span>-n<span class="w"> </span><span class="m">42</span><span class="w"> </span>/dev/urandom<span class="w"> </span><span class="p">|</span><span class="w"> </span>tr<span class="w"> </span>-cd<span class="w"> </span><span class="s1">'[:alnum:]'</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>cut<span class="w"> </span>-c-12
 | 
						|
</code></pre></div>
 | 
						|
 | 
						|
<p>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 <code>head</code>. It will be sent to <code>stdout</code> and
 | 
						|
displayed via the shell. Parameter <code>-n</code> reads exactly 42 lines of the
 | 
						|
file given to gather enough randomness. The output of <code>head</code> will be
 | 
						|
sent to <code>tr</code>. In order to select only alphanumeric characters for our
 | 
						|
password, we use <code>'[:alnum:]'</code>. Parameters <code>-c</code> selects the complement
 | 
						|
of alphanumeric characters and <code>-d</code> deletes them. <code>cut</code> does exactly
 | 
						|
what it says, <code>-c-12</code> 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.</p>
 | 
						|
<p>To extend the pool of possible symbols the manual of <code>tr</code> lists various
 | 
						|
sets of filtered symbols. In the case of a password generator, further
 | 
						|
sensible filters are <code>'[:alpha:]'</code> or <code>'[:digit:]'</code>. While <code>'[:graph:]'</code>
 | 
						|
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 <code>`</code> or
 | 
						|
<code>'</code> inside the returned string.</p>
 | 
						|
<h2 id="sunday-punch"><a href="#sunday-punch">Sunday Punch</a></h2>
 | 
						|
<hr />
 | 
						|
<p>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.</p>
 | 
						|
<h2 id="references"><a href="#references">References</a></h2>
 | 
						|
<p><a href="https://www.bookfinder.com/?isbn=9780201547771">[1] A Quarter Century of Unix, 1994, Peter Salus,
 | 
						|
ISBN:9780201547771</a><br />
 | 
						|
<a href="https://www.bookfinder.com/?isbn=9780131429017">[2] The Art of UNIX Programming, 2003, Eric Raymond,
 | 
						|
ISBN:9780131429017</a></p>
 | 
						|
        </span>
 | 
						|
</div>
 | 
						|
        <div id="footer">
 | 
						|
            
 | 
						|
    <hr/>
 | 
						|
<p></p>
 | 
						|
    <center>
 | 
						|
            © Stefan Friese
 | 
						|
    </center>
 | 
						|
            
 | 
						|
        </div>
 | 
						|
    </body>
 | 
						|
</html> |