難読化シェル芸コレクション

いろんな人が書いた難読化シェル芸(後で解読しておくためのメモ)

人類の資産を永く保存しなければという使命感に基づいて記録しています

精査はしていないので、もしかしたら重複しているものがあるかもしれません。あしからず。

隊長さん

UTF-16リトルエンディアンを利用したdate

echo -n 搀愀琀攀|iconv -t utf-16le|bash

記号と2を使ってdate

_ 2>/dev/null
__=$?
__=${__/${__/?}}
___=`/???/?$__$__/???$__??? <<< $??$?`
___=${___/${___/??}}
__=`/???/?$__$__/???$__??? <<< $__??`
__=${__/${__/??}}

/???/$__??? /???/$___?? 
$_

記号だけで"シェル芸"を出力

: "$(/???/??${##}/???${##}???<<<//}?{?)"; : /???/${_/${_/??}}?; : "$($_ ./????????????/???.?$((${##}+${##}))/????????.???)"; : ${_/???????????????????}; echo ${_/${_/????}}

応用ワタナベ難読化date

: <(:); : "$(.&>/???/??/${##}) /*/$$ $_"; __=(${_##*.}); : ${__[${##}]%???}${__[$((-~${##}))]/???}; : "${_/\/$$}"; : "${_/${_%???}} ${__[$((-~-~${##}))]/${__[$((-~-~${##}))]/??}}"; : $(${_/\//-} <<< 辺邉󠄀辺󠄀邉󠄐邉󠄁); $_

記号難読化date

(())
/ /???/???/????$(($?<<$?<<($?<<$?<<$?)))
/ $($_ <<< $#$#$#)$(/)$($_ <<< ${#}${?%?})
${_//${_/${_/???}}}
${_//${_/${_%???}}}
${_,,}

画像をアレコレしてdate

echo -e "P1\n1 1\n0"|convert - o.png;
xxd o.png | grep "[7-9].:"|cut -d\  -f11|tr -d \\n|cut -d. -f2

yamayaさん

フィボナッチ数列

fib='a+=b,b=a-b,a<_[`echo $b>&3`]||fib'
((a=1,fib))3>&1

記号だけでフィボナッチ数列

! : "`/???/???/???${#?}???<<<_.`";_____=${_::-~$?}
____='__+=___,___=__-___,__<_[$($_____<<<$___>&$[-~${##}])]||____'
((__=-~$?,____))|&$_____

ぐれさんが解説記事を書いてくださっています https://gist.github.com/greymd/455a13bb6f757c5ccd00bfb155d525e2

シェルピンスキーのギャスケット

! _(){
((____=__,${_______=_____[____]^=_____[____-__],++____<___&&_______}))
$______<<<${_____[@]}
((++________<___))&&_
}
_____=(${__=$?})
___=$[__<<$__$?+~__]
: /*/$$;: ${_:__:__}
(${______=/???/???/?$[~__*~__]}<<<${_^}$__\ $___\ $___;_)|convert - /images/a.png

記号だけでdateコマンド

___=${__=${#?}}$[$__$__*~__*~__]
(("_[\$($'\\$___\\$[___-__+~__]\\$[___-$__$?*~__]\\$[___+__]'>&$[-~__])]"))>&/???/??/$__

. /???/??/$?<<<.\ /???/??/$?\<\<\<\$\'\\$(($$/$$))$(($$/$$<<$$/$$<<$$/$$))$(($$/$$<<$$/$$<<$$/$$))\\$(($$/$$))$(($$/$$<<$$/$$<<$$/$$))$(($$/$$))\\$(($$/$$<<($$/$$<<$$/$$<<$$/$$)))$(($$/$$<<$$/$$<<$$/$$))\\$(($$/$$))$(($$/$$<<$$/$$<<$$/$$))$(($$$?/$$/($$/$$<<$$/$$)))\'

超短いFizzBuzz

n+=:; s=; : ${p=$(<$0)}
[[ $n =~ ^(...)+$ ]] && s=Fizz
[[ $n =~ ^(.....)+$ ]] && s+=Buzz
echo ${s:-${#n}}
[[ ${#n} =~ ... ]] || echo "$p">>$0

Hello, world ゴルフ

H(){
echo -n ${*:- };}
l(){ exec 2>/dev/nu\
ll; IFS=;}
o(){ H "${1::0
,1}";}

while
o $s
read -r s; do
l #シェル芸
done <$0
! ねこ大好き

dashでdate


#!/bin/dash
_(){ __=$@;}
_ /???/???/[![]
_ /[!${__##*/}]??
_ /???/???/?${__##*/??}
`${__##* } \)-@ _-{<<_
.+>/
_`

dcでdate

`dc -ezzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzPkkPzzzzzzzzzzzzzzzzzzzzPkkkkkkkkkkkkkkP`

(dc|dc)<<<zddddddddddddddddddddddddddddddddzanddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddzddzananddzddddddddddddddzanan

なんだっけ、何か数列

__=($?{,,,,,,,,} ${#?})
_(){ : "${__[*]}";$____$____<<<${#?}${_#*${#?}};__ ${#__[@]};__=(${___[@]});}
__(){ ___[$@]=$[__[$@]+__[~-$@]];[ $@ = $# ]||__ $[~-$@];}
: /???/??/$?;____=${_:${#?}:${#?}}
_;_;_;_;_;_;_;_;_;_

yamayaさん曲線特集

フィボナッチ曲線

l=(3,0 0,-3 -3,0 0,3)
p=A
for j in {1..18};{ printf %d, ${#p};p=$(sed "s/A/ab/g;y/B/a/;y/ab/AB/"<<<$p);}
A=i+=++n%2?1:-1;B=++n
convert -size 800x800 xc: -draw "fill none stroke black path 'm50,650 $(eval $(sed 's/./echo ${l[i%4]};((&));/g'<<<$p))'" /images/a.gif

ペアノ・ゴスペル曲線

l=(6,0 3,-6 -3,-6 -6,0 -3,6 3,6)
p=A
eval 'p=`sed "s/A/aRbRRbLaLLaaLbR/g;s/B/LaRbbRRbRaLLaLb/g;y/ab/AB/"<<<$p`;'{,,,}
convert -size 500x500 xc: -draw "fill none stroke black path 'm300,70 $(eval `sed 's/[AB]/echo ${l[i%6]};/g;s/L/((++i));/g;s/R/((--i));/g'<<<$p`)'" /images/a.gif

ドラゴン曲線

l=(3,3 3,-3 -3,-3 -3,3)
p=FX
eval 'p=$(sed "s/X/xLyFL/g;s/Y/RFxRy/g;y/xy/XY/"<<<$p);'{,,,,,,,,,,}
convert -size 800x800 xc:white -draw "fill none stroke black path 'm350,550 $(eval $(sed 's/[FXY]/echo ${l[i%4]};/g;s/L/((++i));/g;s/R/((--i));/g;'<<<$p))'" /images/a.gif

シェルピンスキーのギャスケット

l=(2,0 1,-2 -1,-2 -2,0 -1,2 1,2)
p=A
eval 'p=$(sed "s/A/bRaRb/g;s/B/aLbLa/g;y/ab/AB/"<<<$p);'{,,,,,,,}
convert -size 600x600 xc:white -draw "fill none stroke black path 'm50,550 $(eval $(sed 's/[AB]/echo ${l[i%6]};/g;s/L/((++i));/g;s/R/((--i));/g'<<<$p))'" /images/a.gif 

コッホ曲線

l=(2,0 1,-2 -1,-2 -2,0 -1,2 1,2)
p=F
eval 'p=$(sed s/F/FLFRFLF/g<<<$p);'{,,,,,}
convert -size 1500x600 xc:white -draw "fill none stroke black path 'm50,550 $(eval $(sed 's/F/echo ${l[i%6]};/g;s/L/((++i));/g;s/R/((i+=4));/g'<<<$p))'" /images/a.gif 

フラクタル羊歯植物

dc -e'30000[0sa0sb0sc.16sd0sf]s1[.85sa.04sb_.04sc.85sd1.6sf]s2[.02sa_.26sb.23sc.22sd1.6sf]s3[_.15sa.28sb.26sc.24sd.44sf]s4[0k48271lr*2147483647%dsr8/100%9kl1xd1<2d87<394<4lalx*lbly*+dn32Plclx*ldly*lf++psysx1-d0<m]sm0dsxsy12345srlmx'|awk '{p[int($1*50)+int($2*50)*400+3e3]=1}END{print"P1",400,525;for(;i++<21e4;)print p[i]+0}'|convert - +level-colors green,black -flip /images/a.png

参考:https://en.m.wikipedia.org/wiki/Barnsley_fern

ぐれさん

記号だけで任意の文字列を出力

! : "`/???/???/??$[-(~${##}+~${##}-${##})]???<<<///`";__=${_:$[-~${#?}+-~${#?}]:${#?}};___='_[$( _____=($(/???/???/????.??)); /???/???/${__}???-???? ${_____[$[-~${##}-~${##}]]}>&$[-~${##}])]';((___)) &> /?${__}?/???o??

dcを利用してほぼ記号だけで任意の文字列を出力

: ${##};dc -e "2i?P" <<<$_$_$_$?$?$?$_$_$_$?$?$?$?$?$?$_$_$?$?$?$?$_$_$?$_$_$_$?$?$?$_$_$_$?$?$?$?$?$_$?$_$?$?$_$?$?$_$_$_$_$_$?$?$?$_$_$_$?$?$?$?$?$?$_$_$?$?$_$?$?$_$_$?$?$?$?$_$?$_$?

連想配列を利用したdate

(( a=144,b=141,c=164,d=145 ))
(( "c[\$($'\\$a\\$b\\$c\\$d' >&2)]" ))|&cat

unko.ls

: ${##}; (("_[\$($'\\$_$[-~-~-~-~-~$_]$[-~-~-~-~$_]\\$_$[-~-~-~-~$_]$[-~-~-~-~-~$_]\\$_$[-~-~-~-~$_]$[-~-~$_]\\$_$[-~-~-~-~$_]$[$_$?--~-~$_]\\$?$[-~-~-~-~$_]$[-~-~-~-~-~$_]\\$_$[-~-~-~-~$_]$[-~-~-~$_]\\$_$[-~-~-~-~-~$_]$[-~-~$_]'>&$[-~$_])]"))>&/???/??/$_

高度なyesコマンド代替

: ${p=$(<$0)}
echo "高須クリニック"
echo "$p">>$0

円周率

__=(/???/??);: ${##};${__[$[-~-~$_]} -${__[${_}$[$_$?--~-~$_]]:${___=$[-~-~-~-~$_]}:$_}<<<"$[$___-$_]*${__[$?]:$___:$_}($_)"

記号だけでojichat

! __=(${!T*}); /*/*/*/${!__[${##}]:${!__[-~$?]}:$?}*(-~$?)+${#__}:${#__[*]}}*

mosheeさん

マンデルブロ集合

dc -e '20 100 150[P6]Pfswshsm9k[q]sQ[20*Lor-3r^1+1r/]sU[dSo10-SodlUxrlUx-lm*]sV0sq[0[dlw/4*3-salqlh/3*1.5-sb0ddsxsy[lxd*lyd*+4!>Qlxdd*lyd*-la+sx2ly**lb+sy1+dlm>I]dsIxlm/d17lVxPd15lVxP13lVxP1+dlw>X]dsXxclq1+dsqlh>Y]dsYx' 2>/dev/null | convert ppm:- /images/m.png

ebanさん

記号だけでdate

! : <(:); /*/${_:${?}:$?}??${_:${?}+${?}:$?}

上田 隆一さん

dateコマンド

. <( :(){ awk '$2~/^'$1'\/t/' /???/???????? | head -c $2 ; } ; : 13 2 ; : 23 2 )

記号だけでdateコマンド

. <(__=(.{,,,}{,,,}{,,,});___=(.{,,,}{,,});echo -e $'\\U'${#__[@]}'\U'$((${#__[@]}-($$/$$)-($$/$$)-($$/$$)))'\U'$((${#__[@]}+${#___[@]}-($$/$$)-($$/$$)))'\U'$((${#__[@]}+($$/$$))) )

💩

__=( ". "{,,,}{,,,,,} . ) ; : () { ! ; ___=(/???/????);${___[${#__[@]}]} $@ ; } ; : 💩

💩💩

__=$[$(wc -m<<<💩) << $(wc -c<<<💩)];___=$[($(wc -m<<<💩) << $(wc -c<<<💩) ) -  $(wc -c<<<💩) + $(wc -m<<<💩)  ];____=$[($(wc -m<<<💩) << $(wc -c<<<💩) ) +  $(wc -c<<<💩) + $(wc -c<<<💩)  ];_____=$[ $__ + $$/$$ ];echo -e \\x{$__,$___,$____,$_____} | tr -d ' ' | sh

校正が終わったので息抜きに難読化とかで遊んでました。

上田ブログ - 本日のシェル芸
https://b.ueda.tech/?post=20190729

ファイルパスを編集date

__=(/???/???/????/???????/???/??????);${__##*/??}

記号でdate

! ;__=(/???/???/???$????);"`$__<<<.`";___=$(tr "f9" "te"<<<$_);${___:23:4}

! ;__=(/???/???/???$????);"`$__<<<';^?'`";___=${_/3/t};! ;${___::$[-~$?-~$?]}

sedでdate

echo unko | sed "ycfnxoskpurecfaxeztpdrqc;e"

次郎さん

ほぼ記号だけでdateコマンド①

__=(.{,,,}{,,,}{,,,});___=(.{,,,}{,,});echo -e $'\\U'${#__[@]}'\U'$((${#__[@]}-($$/$$)-($$/$$)-($$/$$)))'\U'$((${#__[@]}+${#___[@]}-($$/$$)-($$/$$)))'\U'$((${#__[@]}+($$/$$)))|sh 

ほぼ記号だけでdateコマンド②

__=$(($$/$$));___=$(($__+$__+$__));____=(/????/????/??/?);_____=${____[$__-$__]};______=${_____:${#_____}-$___:$__};_______=$((($___+$__)<<($___+$__)));________=(/???/???/????$_______);_________=${________[$__-$__]};$($_________ -$______ <<< ZGF0ZQo=)

記号だけでdateコマンド①

__=$(($$/$$));___=$(($__-$__));____=(/????/?/??);____=${____[$___]};_____=(/????/?/????);_____=${_____[$___]};______=(/????/?/???????);______=${______[$___]};${____:${#____}-$__}${_____:${#_____}-$(($__<<$__<<$__)):$__+$__}${______:${#______}-$__}

記号だけでdateコマンド②

記号だけでdateコマンド③

_______=ޭ;__=$[$$/$$];___=`_`$[${?%?}-${?#??}];_____=(/???/???/??);____=$(${_____[$[$__+$__]$[$___+$__]} -tx$__<<<$_______);____=${____:$[$[]$__$[]};\;_____=\$\'\\$__$[$___+$__]`[`$[$?+$?]\'\;>&$;. $;${____::$__}${____:$[$__+$__+$__]:$__}$_____${____:$__:$__}

画像からdateを錬成する

記号だけでdateコマンド④

eval "$'\\"$[$$/$$]""""`[`$[$?+$?]""""`[`$[$?+$?]"\\"$[$$/$$]""""`[`$[$?+$?]""""$[$$/$$]"\\"$[$$/$$]""""`/`${?#??}""""`[`$[$?+$?]"\\"$[$$/$$]""""`[`$[$?+$?]"""`_`$[${?%?}-${?#??}]""'"

みどりごけさん

画像にコードを埋め込んで素数を出力する

くおんさん

難読化シェル芸 モーメント

くおんさんのモーメントがあります
https://twitter.com/i/moments/1156246978386264065?s=13

記号だけでdateコマンド

3種類の記号だけでdateコマンド

記号だけでdate 短い

__=(/???/???/???$[!$-]???);"$($__ <<<";^?")";${_::-~-~-~!$-};${_/$[-~-~!$-]/t}

ハッシュ値が"da(数字)e"で始まる文字列

記号でdate 不思議

_=(/???) _=($_/${_[$$/$$]}???);${_[$$/$$]}

_=(/???) _=($_/${_[!$-]}???);${_[!$-]}

超短い記号date

_=(??) _=(/*/${_%?}???);${_[!_]}

hiroさん

自作記号オンリー難読化シェル芸(Twitterモーメント)

hiroさんのは、こちらのTwitterモーメントを御覧ください

: ${-::${##}};"{;__=({${_^}..${_,}});# ">&$;. $;: "${__[*]}";: "${_/*\` }^${_% [*}";: "${_// }";: ${_/^};/ ${_,,};${_:${#?}:${##}}${_::${##}}${_:~${?:~$#}:${##}}${_:${#?}+${##}:${##}}
/ "$(</*/[)";${_:${?}-${##}:${##}}${_:$#${?}${##}:${##}}${_:$#${##}${##}$#$#+~$#:-~${##}}
#!/bin/zsh
/;<<<': '$[[##${#?}${#?}]$?*$?*${#?}$#+$?*${?/?}-$?*~${##}*~${##}-${##}$#]';${('$[[##${?/?}]-$?/~${##}/${#?}]')_}'>$;. ./$
#!/bin/zsh
/;<<<': '$[[##${#?}${#?}]$?*$?*${#?}$#+$?*${?/?}-$?*~${##}*~${##}-${##}$#]';${('$[[##${?/?}]-$?/~${##}/${#?}]')_}'>$;. ./$
! _=(? ???? ?????);${_[~_]: -~${?}:$?}${_[~_]:~_}${_[$?]:~_}${_[~_]:${?}:$?}
! : <( );/???/${_:${?}:$?}??${_:${?}<<${?}:$?}
: <( )
: "${_/?}`. &>${_%??}${##}`${_/??}"
: ${_/\/*[/}
: ${_/?\/*}
: ${_/${_:~$?}?}
: ${_/?]}
${_/${_: -${?}${#_}:~${##}}}
!
${!?}
${!?} / /???/?? /????/??? /???/?? /???? /???/???/???? 
$
${!?}

解読のヒント

https://twitter.com/hiro_poke91/status/1138370044226760704
https://twitter.com/minyoruminyon/status/1138395375742488578
https://twitter.com/xztaityozx_001/status/1138417841881747461
https://twitter.com/nogiro_iota/status/1138399715802865665

$
${!?}${!#} /???/?? /????/??? /???/?? /???? /???/???/???? 
/
${!?}
__=<( );! ___=${__%/*}/$?;(. $___)<<<\$\'\\$?$[__=~$?*~$?]$__\\$?$__$?\\$?$[++__+$?]$[--__]\\$?$__$[++__]\'

hiro氏作の難読化シェル芸の解読

hiro氏作の難読化シェル芸の解読
https://hackmd.io/@EjC746Q1REWEpEC57LOAXA/rJ4niQJfr

新方式dateコマンド その1

__=${##};____=$[-(~-(~__))];_____=<(:);___=`.>&${_____%/*}/$__`;___=${___##*.};___=${_____: -(~__):-(~__)}${___:$____+$____:$__}${___:$____:$__};$___ \$\'\\$__${#___}${#___}\\$__${#___}$__\\$__$[-____*~__]$[++____]\\$__$____$[++____]\';

新方式dateコマンド その2

: /\(:;___=${#_};! _______=<(:);__=$?;_______=${_______%/*};____=`.&>$_______/$__`;____=${____##*.};________=${____: -___:__};____=${_______:~__+-___:~-___}${____:___+___:__}${____:___--:__};_____=$__${#____}$___;$____ ${_______: -__}${____:___:__}$________${____::__}

新方式dateコマンド その3

[^^][^^][^^][^^][^^]
[$_][^^][^^]
/[^^][^^][^^]/[$_][^$_] /[^^][^^][^^]/[$_][^^][^^][^^] /
[^^][^^][^^][^^][^^]
/[^^][^^][^^]/[$_][$_][^^][$_]

# [^^] は ^ 以外の任意の1文字

新方式dateコマンド その4

/
/ $(/???/???/???????.?/????${?/??}?.??<<<~+!)
${_/${_/????}}<<<\\$(($?+${#_}+${##}$#))\\$(($?+${?/?}+~${##}$#))\\$(($?+${?/?}+${?/${?/??}}))\\$(($?+${?/?}+~${?/??}))

素数が出力される不思議なワンライナー

|:;$____ ______=\$\'\\$_____\\$[++_____]\';! $____ ':(){ '$______'<<<$(___=`'${_______:~__:__}${____:___:__}${______:__}$________\$\'\\$[_____=_____+${_____::___}]\\$[_____+___+___+__]\'' $__`;[ "${___#*: }" = "$__" ]&&$______<<<$__);((__++<-_____*~___))&&:;}';__=$?;:

記号でFizzBuzz

/;: {_____}>&${##} ++__\>$?'||_[`____=$'\'\\$[_=_=$#$?*-~${##}]\\$_\'';/;((__%${#?}))||___+=$'\'\\$[$#$[_=$?+${?/?}]]\\$[--_]\''$____;_____;((__%$#${#_}))||___+=$'\'\\$[$#$_-${#_}]\\$[--_+${_%?}]\''$____;/;$'\'\\$[_=${?%?},_*=_]\\$_\''<<<${___-$__}''>&$_____`]';$[_] 

恐らく最短 難daコレ

*;_=(*/*[$_]*);/;${_[$?]}

ふみやすさん

ddでdate

$((dd bs=1 skip=32 count=2; dd bs=1 skip=491 count=1; dd bs=1 skip=130 count=1) </etc/passwd)

Add picture from clipboard (Maximum size: 100 MB)