maggioni.xyz/_site/linux/2016/07/28/how-to-rickroll-people-laun...

221 lines
11 KiB
HTML

<!-- vim: set ts=2 sw=2 et tw=80: -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>How to rickroll people that try to run &quot;rm -rf&quot; on your system</title>
<meta name="description" content="WARNING: The method showed here could not prevent the actual execution of "rm -rf" if the "UNIX vandal" is clever enough. Proceed at your own risk, and make ...">
<link rel="stylesheet" href="/css/main.css">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono&display=swap" rel="stylesheet">
<link href='https://fonts.googleapis.com/css?family=Hammersmith+One' rel='stylesheet' type='text/css'>
<link href="https://fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet">
<link rel="canonical" href="https://maggioni.xyz/linux/2016/07/28/how-to-rickroll-people-launching-rm-rf-on-your-system.html">
<link rel="alternate" type="application/rss+xml" title="maggioni.xyz" href="https://maggioni.xyz/feed.xml">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.6.0/css/font-awesome.min.css">
<script src="https://rawgit.com/snaptortoise/konami-js/master/konami.js"></script>
<!-- Favicon -->
<link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/manifest.json">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-TileImage" content="/ms-icon-144x144.png">
</head>
<body>
<header class="header">
<nav class="head navbar">
<h1 class="title container">maggioni.xyz</h1>
<!-- vim: set ts=2 sw=2 et tw=80: -->
<div class="links container">
<a href="/">home</a>
<a href="/blog/">Blog</a>
<a href="/feed.xml">RSS</a>
<a href="/cv.html">CV</a>
</div>
<div class="links container">
<a href="https://git.maggioni.xyz">Git</a>
<a href="https://cloud.maggioni.xyz">Cloud</a>
</div>
</section>
</header>
<main class="container">
<article class="post" itemscope itemtype="http://schema.org/BlogPosting">
<header class="post-header">
<h2 class="post-title" itemprop="name headline">How to rickroll people that try to run "rm -rf" on your system</h2>
<h4 class="post-meta"><time datetime="2016-07-28T16:00:00+02:00" itemprop="datePublished">Jul 28, 2016</time></h4>
</header>
<div class="post-content" itemprop="articleBody">
<strong>
WARNING: The method showed here could not prevent the actual execution of "rm -rf" if the "UNIX vandal" is clever enough. Proceed at your own risk, and make backups!
</strong>
<p>
I like Rick Astley late 80's songs, and you can see them here in my Spotify:
</p>
<p>
<img
src="/images/spotify_rickastley.png"
alt="My Spotify with a bunch of Rick Astley songs">
</p>
<p>
I like rickrolling people too, especially if they are trying to delete my entire
<code>/home</code> directory or, even worse, <code>/</code>. Since I learned
how to use the <code>alias</code> built-in, I wanted a way to prevent that
random people tinkering with my laptop (that I may forgot to lock) could
delete potentially important stuff, just for fun or boredom.
</p>
<p>
The method that I will show will lock any <code>rm</code> command runned in
both recursive and force mode, so <code>rm -rf</code>, <code>rm -f -r</code>
and <code>rm -r --force</code> are all blocked, even if they are runned with
<code>sudo</code>. I am going to alias the rm command in
<code>/etc/profile</code>, <code>/etc/bash.bashrc</code> and in
<code>/etc/zsh/zshrc</code> (I am a zsh user) so that the rickroll will be
possible from all users, even root and the ones with a brand new
<code>.bashrc</code> or <code>.zshrc</code>. Here is the code I appended to
those files:
</p>
<p>
<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nb">alias rm</span><span class="o">=</span>/bin/rmAlias
<span class="nb">alias sudo</span><span class="o">=</span><span class="s1">'sudo '</span> <span class="c"># this enables aliases in sudo, see http://askubuntu.com/questions/22037/aliases-not-available-when-using-sudo</span></code></pre></figure>
</p>
<p>
Since <code>alias</code> is not able to control the flags of the aliases (see
<a href="http://apple.stackexchange.com/questions/50963/how-do-i-add-a-flag-to-an-alias">here</a>, we are going to redirect each call of <code>rm</code> to
<code>/bin/rmAlias</code>, that would run the command if it is safe. I did
not use a function because it is a bit tricky to make that work with
<code>sudo</code>. So, let's see the code I put in <code>rmAlias</code>:
</p>
<p>
<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c">#! /bin/bash</span>
<span class="c"># Rickroll whoever tries to desert this system, even root.</span>
<span class="c"># To achieve this, set the appropriate aliases even in /etc/profile and similars.</span>
<span class="c"># Video played when rickrolling</span>
<span class="nv">ROLLVIDEO</span><span class="o">=</span>/opt/anti-rm/serious-video.mkv <span class="c"># it's just Never Gonna Give You Up on my system, but be free to customize this!</span>
rickroll<span class="o">(){</span>
<span class="nb">echo</span> <span class="s2">"Never gonna desert this system..."</span>
xdg-open <span class="nv">$ROLLVIDEO</span> 2&gt;&amp;1 &amp;
<span class="nb">exit </span>0
<span class="o">}</span>
<span class="k">while </span><span class="nb">getopts</span> <span class="s2">":rf-"</span> opt<span class="p">;</span> <span class="k">do</span>
<span class="c"># Prevent '--force' to be detected as -r and -f</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$opt</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"-"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
</span><span class="nv">OPTIND</span><span class="o">=</span><span class="nv">$OPTIND</span>+1
<span class="k">continue
fi
if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$opt</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"r"</span> <span class="o">]</span> <span class="o">||</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$opt</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"f"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
if</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$tmp</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">""</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
</span><span class="nv">tmp</span><span class="o">=</span><span class="nv">$opt</span>
<span class="k">continue
elif</span> <span class="o">[</span> <span class="s2">"</span><span class="nv">$tmp</span><span class="s2">"</span> <span class="o">!=</span> <span class="s2">"</span><span class="nv">$opt</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then
</span>rickroll
<span class="k">fi
fi
done
for </span>var <span class="k">in</span> <span class="s2">"</span><span class="nv">$@</span><span class="s2">"</span>
<span class="k">do
if</span> <span class="o">[[</span> <span class="s2">"</span><span class="nv">$var</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"--force"</span> <span class="o">&amp;&amp;</span> <span class="s2">"</span><span class="nv">$tmp</span><span class="s2">"</span> <span class="o">=</span> <span class="s2">"r"</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then
</span>rickroll
<span class="k">fi
done</span>
<span class="c"># If it's safe, just run rm</span>
/bin/rm <span class="s2">"</span><span class="nv">$@</span><span class="s2">"</span>
<span class="nb">exit</span> <span class="nv">$?</span></code></pre></figure>
</p>
<p>
It may look messy to a <em>UNIX</em> guy more experienced than me, but it
works. The <code>getopts</code> built-in sees if both the <code>-r</code> and
the <code>-f</code> flags are used and, if so, it starts
<code>rickroll()</code>, which opens with <code>xdg-open</code> that amazing
clip from <em>RickAstleyVEVO</em>. From line 30 and below, the script checks
if the <code>--force</code> flag is used instead of <code>-f</code>.
</p>
<p>
Let's give execution permissions to the script we have just created:
</p>
<p>
<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c"># chmod +x /bin/rmAlias</span></code></pre></figure>
</p>
<p>
Restart your shell, and enjoy. If you want to test safely, I suggest trying
to run <code>rm -rf</code> with no folders or a nonexistant one, since this
script stops even these commands.
</p>
<p>
If you want even more security, you can rename this script to
<code>/bin/rm</code> and move the original one in some other place, getting rid of all the aliases. I prefer the solution above because it's tidier: you haven't to move anything. In fact, this could be just an AUR package...
</p>
</div>
</article>
</main>
<footer class="site-footer">
<div class="icons">
<a class="icon" href="https://github.com/maggicl"><i class="fa fa-github"></i></a>
<a class="icon" href="https://gitlab.com/maggicl"><i class="fa fa-gitlab"></i></a>
</div>
<h6 class="author">
<i class="fa fa-cc" aria-hidden="true"></i>
Claudio Maggioni
<script>
document.write((new Date()).getFullYear());
</script><br>
Content under
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
CC BY-NC-SA 4.0</a>
</h6>
</footer>
</body>
</html>