SHELQ: 怪しいシェル芸キュレーションサイト

Sat Dec 17 23:57:17 JST 2016 (modified: Sun Oct 1 10:50:27 JST 2017)
views: 3604, keywords:コマンド,シェルスクリプト,Advent,シェル芸 この記事は最終更新日が7年以上前のものです。

この記事はShell Script Advent Calendar 2016 18日目の記事です。

本記事の趣旨は、今年を中心にTwitterやシェル芸勉強会上で出たこわいワンライナーを、巷にあふれるクソバイラル的なランキング形式でお届けしようというものです。人さまのワンライナーを紹介していきます。普段、自分のブログでは人のふんどしでほんだしをとる(( ふんどしを脱ぐと立派な鰹節が出現するイメージの下ネタです。))ようなことはなるべくしないことにしてますが、毎年謎に盛り上がるShell Script Advent Calendarに便乗してしれっとやります。あと、先日せっかくこんなことを書いたのにまるで自分で守ってないのは、やさぐれているからです。ご了承ください。

ということで、私、上田マリ(シェルガポール在住)の「シェル芸キュレーション」をお楽しみください。

今、私は、シェルガポールからのリモートシェル芸で、いかにshelqとシェル芸ヴェンキョウカイを成長させていくかしか考えていません。この新たな挑戦と新しい働き方へのトライに、シェルシェルシェルシェル、核シェルターですね。 ---上田マリ

すみません!ほんとすみません!(( かなりイキってるインタビューである https://m.newspicks.com/news/651502/body/?sentlog を参考にさせていただきました。))

Ubuntu 16.04 LTSのGUI環境で、必要なものをインストールした上で動作を確認しています。しかし、何が起きても責任は負えません。

第10位 (2016年2月・微妙に危険)
$ touch + ; echo 2 * 3 | bc
   5

まずは第10位。「第21回未経験者大歓迎!誰でも働けるアットホームな職場ですシェル芸勉強会」の午前の部で鳥海さんによって誘発された「こんなミス誰もしないだろシェル芸」です。

上記のような計算間違いは「ディレクトリの中に『+』と言う名前のファイルがあり、そしてbcを使う時にアスタリスクのクオートを忘れると、アスタリスクがファイルのリストに変換(+だけなので+に変換)されて『2 + 3』がbcに渡る」という、ありがちな状況でよく起こります。ありがちではありません。

このバカバカしい計算間違い体験をどうしてもしたい方は、次のようにシェルとよろしくやっててください。

mery@welq:~$ mkdir iemo
   mery@welq:~$ cd !$
   cd hoge
   mery@welq:~/iemo$ touch +
   mery@welq:~/iemo$ echo 2 * 3 | bc
   5

以上、第10位でした。

第9位(2015年10月・ちょっと危険
$ echo {000000000..9999999999}

第9位は「100億個の数字をメモリに書くまでbashとお前を家に帰さない危険シェル芸」です。マイナンバーシェル芸事件(( マイナンバーに抜けがないか、みんなで仲良く襲撃検証した事件。))の際、とりあえず数字を全部列挙しようとしている最中に飛び出した危険なワンライナーです。

ナニがドーなるか説明しておきます。bashは

spotlight@never:~$ echo {0..9}
   0 1 2 3 4 5 6 7 8 9

というふうに、連番を略記して入力すると展開して、コマンド(この場合はecho)に渡してくれる機能があります。コマンドに展開したものを引数として渡すには・・・全部メモリの上で展開する必要があります。これを踏まえて、もう一度9位のコマンドを見てください。bashが可哀想に見えます。

このときは、bashだけでなく、次の方々が犠牲になりました。尊い。

尊い。

第8位 (2016年10月)(安全・迷惑)
$ echo 響け!ユーフォニアム | sed ':a;p;s/\\(.\\)\\(.*\\)/\\2\\1/;/^ム/!ba'
   響け!ユーフォニアム
   け!ユーフォニアム響
   !ユーフォニアム響け
   ユーフォニアム響け!
   ーフォニアム響け!ユ
   フォニアム響け!ユー
   ォニアム響け!ユーフ
   ニアム響け!ユーフォ
   アム響け!ユーフォニ
   ム響け!ユーフォニア

第8位は、@ebanさんの「響け!ユーフォニアム10段逆スライド方式シェル芸」です。ある日、上の出力のように1文字ずつずらして「響け!ユーフォニアム」という文字列を出力するだけの不毛なパズルがTwitter上で暇な人たちによって流行ったのですが、みんながワイワイ長いワンライナーを捻り出している時にしれっと氏が出したものです。

一応、ちゃんと解説をしておくと、これはsed(GNU sed)のbコマンドを用いたものです。sedの部分をsedのスクリプトファイルにしてコメントを入れると、次のようになります。

curazy@grape:~$ cat ufo.sed 
   #!/bin/sed -f
    
   #aというラベルをつける。「b a」でここに戻る
   :a 
   
   #1行プリント
   p
   
   #一番最初の字を後ろにくっつける
   s/\\(.\\)\\(.*\\)/\\2\\1/
   
   #ムで始まらなければラベルaに戻る
   /^ム/!b a

このスクリプトに「響け!ユーフォニアム」という文字列を入れると、頭の文字が「ム」になるまで同じ行に対してp(プリント)が実行されるので、上記のような出力が得られます。

実行は次のように行いましょう。

takagi@buzznews:~$ chmod +x ./ufo.sed
   takagi@buzznews:~$ echo 響け!ユーフォニアム | ./ufo.sed 
   響け!ユーフォニアム
   け!ユーフォニアム響
   !ユーフォニアム響け
   ユーフォニアム響け!
   ーフォニアム響け!ユ
   フォニアム響け!ユー
   ォニアム響け!ユーフ
   ニアム響け!ユーフォ
   アム響け!ユーフォニ
   ム響け!ユーフォニア

ちなみに、やり出しっぺの人は

だそうです。代わりに謝っておきます。私も見たことも食べたこともありません。ファンの人たちには本当に迷惑な話です。

第7位 (2016年9月・安全)
$ banner --help

どうなるか?こうなります。

以上、ぐれさんの「コマンドに馬鹿にされるシェル芸」でした。

第6位(2014年8月他、破壊実績多数・試すな危険
$ : () { : | : & } ; : 

第6位は、すこしリリース(?)から時間が経ってしまったのでランクダウンしましたが、未だに存在感抜群のforkbombです。これをシェルに打ち込むと、なにも対策を立てる間も無くOSが死にます。

この入力の意味は「:という名前の関数を定義します。その関数は、自分自身をパイプで2つつないだものをバックグラウンドプロセスで実行するというものです。:を定義したら、さっそく実行します。」というものなので、:がひとつ実行するごとに、別の:が起動して、それらが再び:を2つ起動して・・・」と倍々になってすぐプロセスで一杯になってOSが死にます。どんどんプロセスを使うので他のコマンドも起動できず、大抵の場合シャットダウンもうまくいきません。

Dockerなら大丈夫だろうと試したらホストまで死んだという報告もあるので、試すなよ!絶対試すなよ!

第5位(2014年9月・ある意味危険
$ env x='() { :;}; echo vulnerable' bash -c 'echo this is a test'
   vulnerable
   this is a test
   

第5位は、これもちょっと古いのでランクを落としてしまった「Shellshock調査用ワンライナー」です。Shellshockは、「関数の定義を変数に代入しようとすると、関数の後ろに書いたコマンドが実行できてしまう。」というbashのバグ(と、その後の騒動)を指します。

これだけなら「ふーん」という感じですが、CGIでbashが立ち上がるようになっていると話は別です。webサーバがGETで送られてきた文字列を変数に保存しますので、そのときに文字列に仕込んだコマンドが実行されることになって非常に危険です。次の例は、騒ぎの中、私のウェブサーバに飛んできたリクエストのログです。パスワードファイルを盗み見しようとしています。

xxx.yyy.zzz.aaa - - [25/Sep/2014:08:32:26 +0900] "GET / HTTP/1.1" 302 208
    "-" "() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd"

ところで、「CGIでbashが立ち上がるなんて、こんな本を書いたお前のところだけだろ」という声も聞こえて来そうなんですが、CGIスクリプトからコマンドを読んでおり、shと打つとbashが代わりに立ち上がる環境でウェブサーバが動作しているという場合、知らないうちにbashが立ち上がっていますので、ご注意ください。当然、最新のbashではこのバグは潰されています。

第4位 (2016年9月・悪用危険
H4sICBmZ4lcAA2VsZgCrd/VxY2RkZIABJgZmBhAvMcBEyIQBAUwYFBhgquCqgWpAVDMUs4I4AgwMjxvbHjdNftw4mQuodgcLUHA3SMvOEKD6XbxA1tmGHSCB3QxgNgCMjcoWgwAAAA==

これはワンライナーでなく、ワンライナーで解く対象となる暗号です。なぜかTwitter上でシェル芸暗号解読大会が開催された時に私が考えた「Twitterに実行ファイルをエンコーディングして乗っけようとして頑張ってたら乗ってしまったやつ」です。こちらのサイトからELF(実行バイナリ)を作り、それをzipやbase64で変換したものです。

次のように実行できます。

takeda@jooy:~$ base64 -d hoge | gunzip > a ; chmod +x a ; ./a
   うんこ

ところでこの問題、昨日発売された、Software Design 2017年1月号に似た問題が出ています(ネタバレになったら申し訳なく)。Software Design 2017年1月号で、特集で「シェル30本ノック」というのをシェル芸勉強会周辺の方々と書きました。「ワンライナー(( いつもお世話になっている編集のYさんは、頑なに「シェル芸という言葉は使わないのです。ブームの火付け役なのに。たぶん、ブレーキかけないと暴走し出すと思ってるのではなかろうか。正解。))中心に40ページ」ということで、1人じゃ無理なので、シェル芸勉強会の周りの変態さん腕利きの方々に参加を募り、Slackでチームを作ってGitHubでわーっと書いていきました。SoftwareDesignのきっちりしているところと、シェル芸勉強会の奔放なところをうまく両立できていると思いますので、ぜひご一読を。

[amazonjs asin="B01MFBDOTV" locale="JP" title="ソフトウェアデザイン 2017年 01 月号 雑誌"]

以上、宣伝でした。

第3位(2014年8月・安全)
$ eval eval \\''n='\\''{1..'$(dc -e 1000vp)'}'\\'' eval eval eval echo '\\'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\'\\\\\\'\\''$(('\\'\\\\\\'\\\\\\\\\\\\\\'\\\\\\'\\''$n'\\'\\\\\\'\\\\\\\\\\\\\\'\\\\\\'\\''*'\\'\\\\\\'\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\\\\\\'\\''{2..$((1000/n))}'\\'\\\\\\'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\'\\\\\\'\\''))'\\'\\\\\\'\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\\'';'\\' | tr ' ' \\\\n | sort -n | uniq -u

第3位、こちらも古いんですが、あまりにも変態すぎるので未だシェル芸界隈では語り草になっている鳥海師匠の「変態素数ワンライナー」です。上のワンライナーをコピペして動かしてみてください。ちゃんと動きます。そして、安心・安全です。

cafy@upin:~$ (変態すぎてSyntaxhilighterがうまく動かないので省略) | head
   2
   3
   5
   7
   11
   13
   17
   19
   23
   29

ちゃんと動く以外、詳細不明です。

第2位 (2016年4月30日・そこそこ危険
   $ alias eval='eval eval'
   $ eval

さて第2位です。これも鳥海師匠の講義の最中に飛び出した「イーバル!イーバルイーバル!!イーバル!!!」です。「ちょっと!ちょっとちょっと!」のニュアンスで1行目を読み込み、「バルズ!!」のニュアンスで2行目を実行すると、端末が死にます。コンソールでやるとPCがシャットダウンします。ちょっと、気持ちいいです。

死ぬ原理ですが、forkbombのマイルドバージョンで、2行目のevalを実行するとeval evalに置き換わってeval evalが実行され、さらにevalが二つに分裂し・・・ということでevalがたくさんになってbashがパンクして死にます。

端末で行う場合、被害としてはその端末が落ちるだけですので、皆さんもスタバ等でドヤリングする際は、exitの代わりに

cuta@findtravel:~$ alias eval='eval eval'
   cuta@findtravel:~$ eval

と打って(キーボードは強打すること)、かっこよく端末を閉じるグッドプラクティスを身につけてはいかがでしょうか。何が起きても私は責任を取りませんが。

第1位 (2016年4月・安全)
$ l='L${r}FR${l}F${l}RF${r}L' r='R${l}FL${r}F${r}LF${l}R' eval eval eval eval eval eval l= r= eval echo '$l' | { read a; b=${a%%F*}; echo "from turtle import *;speed(0);pensize(2);ms=min(screensize())*0.8;l=2*ms/(2**${#b}-1);up();setpos(-ms,-ms);down();${a}done()"; } | sed 's/L/lt(90);/g;s/R/rt(90);/g;s/F/fd(l);/g' | python

さて今回の第1位は、鳥海師匠の「ヒルベルト曲線ワンライナー」です。デスクトップ環境でお楽しみください。以下は本人による実行例です。

解説はこちらの@hexominoさんのLT資料にあります。変数に再帰的に経路を埋め込んで行って、最後にPythonに食わせて実行するという手順のようです。

本日の怪物曲線 2016/6/18 from Hexomino Hexomino

うん。わからん。

最後に

ということで、鳥海師匠の1〜3位独占で終わりました。某サイト群と違って師匠には快諾を得て書いておりますが、こうやって人のやったことでブログを書いていると、やっぱり自分の手柄は本人が自分の言葉で書いた方がいいんじゃないかなあと思ってしまいます。

師匠におかれましては、ぜひ「今日から俺はシェル芸で飯を食うんだ」とご決心いただければ幸いです。

以上。

[amazonjs asin="B01MFBDOTV" locale="JP" title="ソフトウェアデザイン 2017年 01 月号 雑誌"]

ノート   このエントリーをはてなブックマークに追加 
 

prev:論文等、書き物を他人に見せる前のチェックリスト next:Software Design, ラズパイマガジン, システム/制御/情報

やり散らかし一覧

記事いろいろ