<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[M.B Cybersecurity Notes]]></title><description><![CDATA[This blog exists at a rare and exciting intersection: the technical rigour of cybersecurity infrastructure and the narrative precision of investigative journali]]></description><link>https://michaelbestman.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/69fbf61c50ecad45339d5756/e922c871-4da9-4bda-9952-1dfb6a8db5ae.png</url><title>M.B Cybersecurity Notes</title><link>https://michaelbestman.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 22:10:50 GMT</lastBuildDate><atom:link href="https://michaelbestman.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Hunting IOCs in Linux: From Cryptominers to C2 Persistence]]></title><description><![CDATA[For weeks, I have had to battle cold and fever. & while the weather had been a spine, I found myself once again staring at my screen, confronting what I think was another challenging phase in my learn]]></description><link>https://michaelbestman.hashnode.dev/hunting-iocs-in-linux-from-cryptominers-to-c2-persistence</link><guid isPermaLink="true">https://michaelbestman.hashnode.dev/hunting-iocs-in-linux-from-cryptominers-to-c2-persistence</guid><category><![CDATA[cybersecurity]]></category><category><![CDATA[Linux]]></category><category><![CDATA[linux for beginners]]></category><category><![CDATA[incident response]]></category><category><![CDATA[blueteam]]></category><category><![CDATA[sysadmin]]></category><dc:creator><![CDATA[Michael Bestman Osemudiamen]]></dc:creator><pubDate>Sat, 08 Aug 2026 21:47:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/69fbf61c50ecad45339d5756/72af43ff-9ca1-48a3-bd71-68bff562be4d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For weeks, I have had to battle cold and fever. &amp; while the weather had been a spine, I found myself once again staring at my screen, confronting what I think was another challenging phase in my learning journey. I spent the day designing some marketing strategy frameworks and at night, I lay before the altar of the Linux systems once again.</p>
<p>This time, I completed over 10 practical lab tasks on SSH tunnelling, Linux process management, and cron configurations. But more interestingly, I tackled a hands-on investigation scenario: role-playing as a Security Engineer identifying Indicators of Compromise (IOCs) on a compromised Linux host.</p>
<p>I have attempted to give a step-by-step breakdown of how I investigated, analysed, and remediated the threat.</p>
<p><em>Note: the PID changes when the lab unexpectedly closed after a connection failure. But the results and processes are pretty much the same.</em></p>
<p><strong>Tracking the Resource (Cryptominer)</strong></p>
<p>The first sign of host compromise is usually anomalous resource consumption.</p>
<p>Using <code>top</code>, I spotted process PID 527 taking up nearly 99% of system resources. To pull its path and generate a cryptographic hash for artefact tracking, I ran:</p>
<pre><code class="language-typescript">#locate full path of PID 

ps -p 527
</code></pre>
<pre><code class="language-typescript"># Hash the binary for incident logging

md5sum /path/to/cryptominer &gt;&gt; hash.txt 
</code></pre>
<img src="https://cdn.hashnode.com/uploads/covers/69fbf61c50ecad45339d5756/994a67a5-37fe-40e6-8799-fce23a33a0d1.png" alt="" style="display:block;margin:0 auto" />

<p><strong>Uncovering the Hidden Backdoor</strong></p>
<p>Next, I needed to identify any active backdoors maintaining network access.</p>
<p>Using socket statistics (<code>ss</code>), I checked for listening ports:</p>
<pre><code class="language-shell">ss -tulpn
</code></pre>
<p>This highlighted a suspicious Python process listening on <strong>port 10348</strong>. Piping <code>ps aux</code> to filter for Python processes revealed the hidden executable location in a temporary directory:</p>
<pre><code class="language-shell">ps aux | grep "python3"

# Output path: /tmp/.junk/bbac0ed1
</code></pre>
<p>I hashed this executable and logged it alongside the cryptominer in <code>hash.txt</code>.</p>
<p><strong>Tracing C2 Persistence via Process Trees</strong></p>
<p>Finding the Command and Control (C2) IP address and its persistence vector proved to be the most critical phase.</p>
<p>The standard process lists weren't showing the full hierarchy, so I used the process tree forest view</p>
<pre><code class="language-shell">ps -auxf or pstree -p 
</code></pre>
<img src="https://cdn.hashnode.com/uploads/covers/69fbf61c50ecad45339d5756/de43529d-291e-49e1-8d06-6297d0054fa6.png" alt="" style="display:block;margin:0 auto" />

<p>This displayed the visual tree, revealing that both the backdoor and cryptominer were children of <strong>Parent Process ID (PPID) 311</strong>.</p>
<p><strong>Inspecting Boot Persistence</strong></p>
<p>While <code>ss -tunp</code> providing connection hints, it didn't reveal the source script establishing the C2 connection. Looking at my note, after several trials, I inspected <code>/etc/rc.local</code> :</p>
<pre><code class="language-shell">cat /etc/rc.local 
</code></pre>
<img src="https://cdn.hashnode.com/uploads/covers/69fbf61c50ecad45339d5756/b67c15b1-bea8-4bc7-ae56-f503c46b3343.png" alt="" style="display:block;margin:0 auto" />

<p>The file contained a startup script utilising <code>nc</code> (Netcat) to initiate an outbound connection to the C2 server IP address on system boot.</p>
<img src="https://cdn.hashnode.com/uploads/covers/69fbf61c50ecad45339d5756/668e8221-5840-4494-bbb6-76316a5b744d.png" alt="" style="display:block;margin:0 auto" />

<p><strong>Remediation and Lessons</strong></p>
<p>With all IOCs documented, I began eradication and immediately hit two major roadblocks that taught me valuable operational lessons.</p>
<p><strong>Lesson A: SIGTERM vs. SIGKILL</strong></p>
<p>I initially attempted a graceful <code>kill using kill -15</code> . In incident response, graceful terminations (<code>SIGTERM</code>) allow malware to catch the signal and potentially trigger backup scripts or hide artefacts. Switching to <code>kill -9</code> (<code>SIGKILL</code>) instantly killed the execution threads without delay.</p>
<img src="https://cdn.hashnode.com/uploads/covers/69fbf61c50ecad45339d5756/1e669a94-4c90-4eb0-b509-6699e1141722.png" alt="" style="display:block;margin:0 auto" />

<p><strong>Lesson B: Deleting Files vs. Deleting Staging Directories</strong></p>
<p>After killing the processes, I deleted the script files using <code>rm -rf</code>. However, my lab validation remained stuck at 75%.</p>
<p>After reviewing my methodology, I realised that while the malicious binaries were deleted, the hidden directory path (<code>/tmp/.junk</code>) remained. Executing a recursive removal on the entire directory path finalised the cleanup:</p>
<pre><code class="language-shell">rm -rf /tmp/.junk
</code></pre>
<img src="https://cdn.hashnode.com/uploads/covers/69fbf61c50ecad45339d5756/956f0a12-02ec-4c84-81cd-5fc5c2a92b24.png" alt="" style="display:block;margin:0 auto" />

<p><strong>Result: 100% Remediation.</strong></p>
<p><strong>Final Thoughts</strong></p>
<p>Completing this by relying on muscle memory and my little journal, I found that threat hunting on Linux requires more than just knowing basic commands. It demands an understanding of how processes interrelate, where persistence hides, and how to perform complete eradication. It was fun while it lasted. And I was happy I learnt something new.</p>
]]></content:encoded></item><item><title><![CDATA[
Understanding File Permissions Through the Lens of my Mother’s Scolding]]></title><description><![CDATA[By Michael Bestman Osemudiamen
I lived quite a sedentary life as a child. I would sit in a spot for hours and watch other kids play from afar. Their screams and meaningless laughter echoed to me what ]]></description><link>https://michaelbestman.hashnode.dev/understanding-file-permissions-through-the-lens-of-my-mother-s-scolding</link><guid isPermaLink="true">https://michaelbestman.hashnode.dev/understanding-file-permissions-through-the-lens-of-my-mother-s-scolding</guid><category><![CDATA[cybersecurity]]></category><category><![CDATA[Linux]]></category><category><![CDATA[linux for beginners]]></category><category><![CDATA[Devops]]></category><category><![CDATA[sysadmin]]></category><category><![CDATA[Security]]></category><category><![CDATA[beginnersguide]]></category><category><![CDATA[storytelling]]></category><dc:creator><![CDATA[Michael Bestman Osemudiamen]]></dc:creator><pubDate>Wed, 08 Jul 2026 13:58:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/69fbf61c50ecad45339d5756/99902a70-53fd-41a5-b5d8-8eaf42db20c2.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>By Michael Bestman Osemudiamen</p>
<p>I lived quite a sedentary life as a child. I would sit in a spot for hours and watch other kids play from afar. Their screams and meaningless laughter echoed to me what it means to be free and a child in a scary world. It was different for me. I could only stare and make meaning of their joy from a distance. To be near them, I would have to violate the order of things. I violate what appears to be the limits of what I can do or not do.</p>
<p>My mother is a disciplinarian. She grants me only the kind of access she thinks I need at those points in my life: sit here, don’t go there, you can eat this, don’t touch that. As I read on file permissions as an adult in cyberspace, I could only see it through the lens of my mother’s scolding.</p>
<p>In the world of cybersecurity, the same is implied. To grant everybody access to systems, especially to sensitive information, is a drive into unimaginable chaos. As a child too, my mother prohibited me from things she found sensitive, especially when she found them obscene or private.</p>
<p>I remember a time I sat to watch a Nollywood film with my parents. Nobody tells you to close your eyes or turn away when a romantic scene plays. It is the kind of programming that runs in a typical Nigerian home. Other times, I found that the drawer to my dad’s private documents is locked. My mom’s ATM card is completely wrapped in layers and layers of papers and clothes and tucked in a bag far away from our imagination. I would know after she grants me elevated access but again, by the next time, the bag or the ATM card is in a different galaxy. I mean, am I not your son? Even when she knows little about computers or systems, her Zero Trust needs to be learnt.</p>
<p>Somehow, in the larger sense, this gene is what I will carry into the world: trust no one. Even when a policeman in mufti once stopped me for a search operation, I doubted his credibility and neither did I grant him access to my bag. In school, you find these scattered permissions everywhere: there is your roommate’s locked bag of food stuff you don’t have access to even at the brink of grave hunger, the places as a student you can’t enter except you’re a staff, and the extent of what you can do within such an ecosystem based on your role. Just as my mother dictates the boundaries of our house, an operating system does the same based on who you are: your identity.</p>
<p>When you have access to your user account and not another’s, it is rooted on the basics of permission and built entirely on the security principles of confidentiality, integrity, availability, authentication, authorisation, and non-repudiation.</p>
<p>By these standards, file permissions is about giving access to the extent that access should be granted to a specific user or group. For instance, the privilege of a root user cannot be the same as that of a regular one, except in certain temporary instances. But the key logic is the same: grant users permission to what role is assigned to them.</p>
<p>First, there are three levels of permission:</p>
<ul>
<li><p><strong>Read (</strong><code>r</code><strong>)</strong> grants access to view the contents of a file or list contents of a directory.</p>
</li>
<li><p><strong>Write (</strong><code>w</code><strong>)</strong> allows you to modify or delete a file. For directories, it allows you to create, rename or delete.</p>
</li>
<li><p><strong>Execute (</strong><code>x</code><strong>)</strong> means you can run a file as a program or script and does not explicitly make you view or edit it.</p>
</li>
</ul>
<p>These permissions <code>rwx</code> come to life when you use the <code>ls -l</code> command to view who owns and has access to do what with a file. Importantly, there are some things you should first be familiar with before we go deeper into other commands. By using the <code>ls -l</code> command along with the filename or path, you might see this output:</p>
<pre><code class="language-bash">$ ls -l newdirectory
drwxrwxr-x 2 michael dev 4096 Jul 8 14:30 newdirectory
</code></pre>
<p>The permission string for <code>newdirectory</code>, for instance, is <code>drwxrwxr-x</code>. You might notice that some files begin their permission with <code>d</code>, a hyphen <code>-</code>, or the letter <code>l</code>. Don’t panic. They are filetypes:</p>
<ul>
<li><p><code>d</code> is a directory</p>
</li>
<li><p><code>-</code> is a regular file</p>
</li>
<li><p><code>l</code> refers to a symbolic link</p>
</li>
</ul>
<p>Now, the <code>rwx</code> pairs are used to tell what permissions an owner, group, or others have to that file. If any of them lacks these permissions, you will see the hyphen (e.g., <code>r-x</code>), which means the user doesn't have the permission to write the file. The entire output that follows the use of the <code>ls -l</code> command will be:</p>
<ol>
<li><p>The file type (<code>d</code>, <code>l</code>, or <code>-</code>)</p>
</li>
<li><p>Permission on the file for owner, groups, and others (<code>rwxrwxr-x</code>)</p>
</li>
<li><p>The number of links</p>
</li>
<li><p>The owner of the file</p>
</li>
<li><p>The size of the file in bytes</p>
</li>
<li><p>Date of file creation and last modified</p>
</li>
<li><p>Name of the file</p>
</li>
</ol>
<p>With this, the door to the next step can be opened: how do we change ownership (<code>chown</code>) and permissions (<code>chmod</code>).</p>
<hr />
<h3>Granting Ownership</h3>
<p>When I had admission to study mass communication in the University of Benin, it was as though I was leaving the world I was familiar with behind me. But then, I had with me my mother’s blue travelling bag. She had acquired it after her marriage to my dad. Now, it is mine. I would arrange my clothes and some books as I bid them goodbye to a future unknown. Even as I write this, I cannot but stare at it as it lay at the corner of my room.</p>
<p>It is how ownership is transferred in Linux, too. In Linux, both the ownership for individuals and groups can be changed with the <code>chown</code> and <code>chgrp</code> commands respectively.</p>
<p>For individual users, the syntax is straightforward:</p>
<pre><code class="language-bash">chown [user] [path/to/file]
# Example:
chown leah /tmp/leah_file
</code></pre>
<p>While to change the ownership for a group, one uses the <code>chgrp</code> (change group) command:</p>
<pre><code class="language-bash">chgrp [group name] [path/to/file]
# Example:
chgrp dev Snort 
</code></pre>
<hr />
<h3>Changing Permission</h3>
<p>There are two methods to modify permissions: the numerical format and the alphabetical or symbolic format (UGO, i.e., user-group-others method).</p>
<h4>The Numerical Format</h4>
<p>To understand this, it is important to reiterate that computers only know 0s and 1s: off and on, allowed and denied. In the numerical format, permissions use a 3-bit binary system for each category. It uses the octal notation to represent the combination of Read, Write, and Execute permissions with a three-digit number for the owner, group, and others.</p>
<p>Here is what I mean by octal notation or numeral system: it is a base-8 number system that uses only digits from 0-7. In Linux, it is the maximum value you can achieve with a 3-bit binary combo. Let me give you a map as to how these digits fit into the binary and file permissions so you understand it as we go deeper:</p>
<table>
<thead>
<tr>
<th>Octal Value</th>
<th><code>rwx</code> Permissions</th>
<th>Description</th>
<th>Binary Value</th>
</tr>
</thead>
<tbody><tr>
<td><strong>0</strong></td>
<td><code>- - -</code></td>
<td>No permission</td>
<td><code>000</code></td>
</tr>
<tr>
<td><strong>1</strong></td>
<td><code>- - x</code></td>
<td>Only execute</td>
<td><code>001</code></td>
</tr>
<tr>
<td><strong>2</strong></td>
<td><code>- w -</code></td>
<td>Only write</td>
<td><code>010</code></td>
</tr>
<tr>
<td><strong>3</strong></td>
<td><code>- w x</code></td>
<td>Write + Execute</td>
<td><code>011</code></td>
</tr>
<tr>
<td><strong>4</strong></td>
<td><code>r - -</code></td>
<td>Only read</td>
<td><code>100</code></td>
</tr>
<tr>
<td><strong>5</strong></td>
<td><code>r - x</code></td>
<td>Read + Execute</td>
<td><code>101</code></td>
</tr>
<tr>
<td><strong>6</strong></td>
<td><code>r w -</code></td>
<td>Read + Write</td>
<td><code>110</code></td>
</tr>
<tr>
<td><strong>7</strong></td>
<td><code>r w x</code></td>
<td>Read + Write + Execute</td>
<td><code>111</code></td>
</tr>
</tbody></table>
<p>By this mapping, 7 is the absolute highest digit in the octal system. So, you probably won’t see 8 or 9 as part of the standard <code>chmod</code> permission command. We can make this further unambiguous when each permission is assigned a specific numeric and binary value as shown below:</p>
<table>
<thead>
<tr>
<th>Permission</th>
<th>Octal Value</th>
<th>Binary Value</th>
</tr>
</thead>
<tbody><tr>
<td>Read (<code>r</code>)</td>
<td>4</td>
<td><code>100</code></td>
</tr>
<tr>
<td>Write (<code>w</code>)</td>
<td>2</td>
<td><code>010</code></td>
</tr>
<tr>
<td>Execute (<code>x</code>)</td>
<td>1</td>
<td><code>001</code></td>
</tr>
</tbody></table>
<p>So how is this calculated, you may ask? Let me simplify: since the permissions use a 3-bit binary system for each category, to find the octal number, you add the values of the active permissions together. Here:</p>
<ul>
<li><p><code>rwx</code>: 4 + 2 + 1 = <strong>7</strong> (Binary = <code>111</code>)</p>
</li>
<li><p><code>rw-</code>: 4 + 2 + 0 = <strong>6</strong> (Binary = <code>110</code>)</p>
</li>
<li><p><code>r-x</code>: 4 + 0 + 1 = <strong>5</strong> (Binary = <code>101</code>)</p>
</li>
<li><p><code>r--</code>: 4 + 0 + 0 = <strong>4</strong> (Binary = <code>100</code>)</p>
</li>
</ul>
<p>In perspective, it means if I run a command like <code>chmod 755 filename</code>, you set permissions for the three distinct groups using the numerical format:</p>
<ul>
<li><p><strong>First digit (7)</strong> represents the permission for the Owner of the file (4 + 2 + 1 = <code>rwx</code>)</p>
</li>
<li><p><strong>Second digit (5)</strong> is permission for the Group (4 + 0 + 1 = <code>r-x</code>)</p>
</li>
<li><p><strong>Third digit (5)</strong> defines the permissions for Others (4 + 0 + 1 = <code>r-x</code>)</p>
</li>
</ul>
<p>If we assemble them, the permission strings applied by running <code>chmod 755</code> will be <code>rwxr-xr-x</code>.</p>
<h4>The Alphabetical Format (UGO)</h4>
<p>Unlike the numerical pattern, this format is rather symbolic. In this method, three things come to mind:</p>
<ul>
<li><p><code>.</code> removes permission</p>
</li>
<li><p><code>+</code> adds permission</p>
</li>
<li><p><code>=</code> sets permission</p>
</li>
</ul>
<p>For instance, to remove the write permission of the owner from a file, the syntax will be:</p>
<pre><code class="language-bash">chmod u-w filename
</code></pre>
<p>From my mother’s lens, it will be a change in the house rules. That is, if she suddenly says I can no longer watch TV because I stay up late and barely do my assignments, that is <code>u-w</code> (User minus Write/Access).</p>
<blockquote>
<p><strong>Note:</strong> For multiple permissions using the UGO method, do not add a space between them:</p>
<pre><code class="language-bash">chmod u=rw,g+x filename
</code></pre>
</blockquote>
<hr />
<h3>Secure Permissions In-depth</h3>
<p>When you read OccupyTheWeb’s <em>Linux Basics for Hackers</em>, you are opened up to the depth by which security can go. Part of that depth is how to set more secure default permissions with the <code>umask</code> method.</p>
<p>For a beginner or non-tech professional, <code>umask</code> is like a filter in my mom’s kitchen. Based on how wide the opening is determines what is removed or retained. So if a system’s default permission is <code>666</code> for a file, a <code>umask</code> of <code>022</code> will strip away permissions we shouldn’t have, leaving us with a secure <code>644</code>.</p>
<p>I remember when my sister tried to sneak my wristwatch for a party some time ago. But then, she couldn’t beat the instinct of my mother. My mum would ask questions like: <em>Who owns that watch? Is he aware?</em> If the answer to that is no, she becomes the <code>umask</code>: stripping away access until you're left with what you should have, backed by her voice: <em>“Go and keep it,” “Remove it,” “Before I open my eyes…”</em></p>
<p>In another piece, I will attempt to discuss special permissions like the set user id (SUID), set group id (SGID), and sticky bits. If you followed up to this point, it is my hope that what you find technical is only applicable in the real world. Through the lens of my mother’s scolding, you can understand to an extent what file permissions are.</p>
]]></content:encoded></item><item><title><![CDATA[Before You, Linux, I Stand: Searching Inside the Womb of the Machine

]]></title><description><![CDATA[It was one of those days where curiosity doesn’t kill the cat. I had stumbled on OccupyTheWeb’s book titled Linux Basics for Hackers while lazily looking for cybersecurity narratives after completing ]]></description><link>https://michaelbestman.hashnode.dev/before-you-linux-i-stand-searching-inside-the-womb-of-the-machine</link><guid isPermaLink="true">https://michaelbestman.hashnode.dev/before-you-linux-i-stand-searching-inside-the-womb-of-the-machine</guid><category><![CDATA[Linux]]></category><category><![CDATA[linux for beginners]]></category><category><![CDATA[cybersecurity]]></category><category><![CDATA[Technical writing ]]></category><category><![CDATA[Blogging]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Michael Bestman Osemudiamen]]></dc:creator><pubDate>Tue, 09 Jun 2026 23:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/69fbf61c50ecad45339d5756/e2ad0804-fce9-4ffe-8be4-4bf26baf8b86.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It was one of those days where curiosity doesn’t kill the cat. I had stumbled on OccupyTheWeb’s book titled <em>Linux Basics for Hackers</em> while lazily looking for cybersecurity narratives after completing my PECB Linux training. As I read the first few pages, I was immediately struck by its simplicity. It reminded me of William Zinsser’s <em>On Writing Well</em>, a book I devoured during my early university years. It birthed in me something I felt was long missing in the technical world: <strong>storytelling</strong>.</p>
<p>This nostalgia and curiosity converged as I stared "naked" at my Linux terminal, invoking the spirits of Christopher Okigbo and Gabriel Okara, ready to search inside the womb of the machine.</p>
<p>For anyone starting out in Linux and finally getting a chance to open the terminal after navigating the rudiments of installation and distributions, you will find yourself before a dark screen with a single, blinking prompt:</p>
<pre><code class="language-bash">username@hostname:current_directory$
</code></pre>
<p>Let us deconstruct this silent gatekeeper:</p>
<ul>
<li><p><code>username</code>: The current user profile logged into the session.</p>
</li>
<li><p><code>@</code>: The structural separator differentiating the user from the host machine.</p>
</li>
<li><p><code>hostname</code>: The network name assigned to the specific machine.</p>
</li>
<li><p><code>current_directory</code>: The exact location within the filesystem where you are currently working.</p>
</li>
<li><p><code>$</code>: The symbol indicating you are a standard, unprivileged user.</p>
</li>
</ul>
<p>In Linux, a user with absolute, unmitigated privileges is called the <strong>root user</strong>. When you log in with these administrative powers, the symbol shifts dramatically to a <code>#</code>.</p>
<p>This text-only environment is called the <strong>Command-Line Interface (CLI)</strong>, the Console, or the Terminal, synonymous with Windows’ Command Prompt (CMD). Unlike a Graphical User Interface (GUI), which relies on a point-and-click architecture with icons neatly laid out, the CLI gives you granular control of a operating system through pure, text-based instructions. It is this instruction that is required to navigate the void and conjure meaning out of a silent world.</p>
<p>Without the foundational vocabulary of Linux commands, you will stand like a writer before a library containing millions of scattered, unlabelled books. And while there might be vague clues scattered here and there, walking blindly through this chaos would take weeks. In Windows or macOS, a simple graphical search bar masks this friction. Linux, however, demands text-built commands to search for files based on indexed databases, strict path locations, or raw filesystem attributes.</p>
<p>While the architectural core of Linux still revolves around the classic Unix philosophy that <em>"everything is a file,"</em> Linus Torvalds, the creator of Linux, famously refined this reality by stating that in Linux, <strong>"Everything is a stream of bytes."</strong> Let me explain.</p>
<p>To a computer, the universe consists entirely of 0s and 1s. These are <strong>bits</strong> (Binary Digits),the smallest imaginable units of data. To make sense of complex human concepts, like the integer <code>100</code> or the string <code>"hello"</code>, the computer aggregates these bits into <strong>bytes</strong> (groups of 8 bits).</p>
<p>Character encoding standards, such as <strong>ASCII</strong> (American Standard Code for Information Interchange), map every human character to a unique decimal number. That decimal number is then converted into a sequence of 0s and 1s that the machine can process. For instance, using ASCII, the word <code>"hello"</code> breaks down into these decimal values:</p>
<p>$$\text{h} = 104, \quad \text{e} = 101, \quad \text{l} = 108, \quad \text{l} = 108, \quad \text{o} = 111$$</p>
<p>These decimals uniquely represent each letter before converting into binary for the hardware:</p>
<table>
<thead>
<tr>
<th>Letter</th>
<th>Decimal (ASCII)</th>
<th>Binary Byte (8 bits)</th>
</tr>
</thead>
<tbody><tr>
<td><strong>h</strong></td>
<td>104</td>
<td><code>01101000</code></td>
</tr>
<tr>
<td><strong>e</strong></td>
<td>101</td>
<td><code>01100101</code></td>
</tr>
<tr>
<td><strong>l</strong></td>
<td>108</td>
<td><code>01101100</code></td>
</tr>
<tr>
<td><strong>l</strong></td>
<td>108</td>
<td><code>01101100</code></td>
</tr>
<tr>
<td><strong>o</strong></td>
<td>111</td>
<td><code>01101111</code></td>
</tr>
</tbody></table>
<p>When Torvalds stated that "Everything is a stream of bytes," he was introducing a profound architectural minimalism. He stripped away the clunky, bureaucratic divisions of traditional computing. To the Linux kernel, there is no fundamental difference between a line of poetry, a keystroke on a physical keyboard, or a live alert hitting a firewalled SOC dashboard. They are all treated as a continuous, flowing ribbon of digital text.</p>
<p>Because the operating system treats everything as a stream, it becomes incredibly powerful. The exact same verbs we use to filter text when analyzing a manuscript can be deployed to dissect a massive wall of network logs. It is against this backdrop that our existence before the Linux terminal begins to find meaning.</p>
<p>Treat these commands not as syntax to be mindlessly crammed, but as active <strong>verbs</strong> aligned with your intent. Let them flow by the river of what you want to accomplish.</p>
<hr />
<h2>Finding Sherlock</h2>
<p>I have always admired the <em>Sherlock Holmes</em> movie franchise. The twists, the puzzles, and the race to transform absolute chaos into something as structured and meaningful as a Beethoven symphony. Enola Holmes shares that same thrill, offering a beautiful palindrome for the experience of a Linux beginner: <em>alone</em> in a dark world.</p>
<p>The first step in Linux is knowing exactly where you stand in that vast world. Remember, the terminal is a dark room; every command you type is a flash of light that illuminates only what you have actively summoned to see.</p>
<p>Before we dive into these specific verbs, we must demystify two critical concepts: <strong>Executable files</strong> and the <strong>PATH variable</strong>.</p>
<p>First, <strong>executable files</strong> are your verbs. Unlike standard files (like a <code>.txt</code> file containing a poem draft) which hold data but cannot act on their own, an executable file contains a direct list of instructions telling the computer's processor to perform an action. In Windows, you recognize these as <code>.exe</code> files. In Linux, almost every command you type into your terminal, whether it is <code>ls</code>, <code>grep</code>, <code>cat</code>, or <code>mkdir</code>, is actually a tiny, self-contained executable program sitting in a directory tree hidden somewhere on your storage drive. When you invoke a command, you are running a software program.</p>
<p>To understand the <strong>PATH variable</strong>, you must see the Linux system as an immense archive of folders. If your system had to manually crawl through every single folder on your hard drive every single time you typed <code>ls</code> or <code>pwd</code>, the terminal would lag and freeze concomitantly.</p>
<p>To bypass this friction, the <code>PATH</code> environment variable acts as a built-in cheat sheet. It serves as a targeted directory map. The <code>PATH</code> variable is a strict, colon-separated list of specific directory routes, such as <code>/bin</code>, <code>/usr/bin</code>, or <code>/sbin</code>, where these executable commands find their permanent homes. When you type a command, the system checks the first folder on that list. If it is not there, it checks the second, then the third. If it finds it, it executes the program. If it exhausts the list without success, it spits out the classic error: <code>"Command not found."</code></p>
<hr />
<h2>The System Search Verbs</h2>
<h3>1. <code>pwd</code> (Where Am I?)</h3>
<p>As a beginner, I rely on the <code>pwd</code> (<strong>Print Working Directory</strong>) command to anchor myself. It acts as an immediate GPS map, telling you precisely where you are sitting in the virtual file tree. When you feel swallowed by the void, running <code>pwd</code> illuminates your exact coordinates.</p>
<h3>2. <code>ls</code> (List the Surrounding World)</h3>
<p>To see what files exist in your immediate vicinity, we deploy the <code>ls</code> (<strong>List</strong>) command. It becomes extraordinary when paired with operational flags. For instance, executing <code>ls -l</code> prints a detailed, long-form layout displaying visible files alongside their cryptographic permissions, ownership tags, exact file sizes, and modification timestamps.</p>
<p>But when your objective lies deep within the infrastructure beyond your current folder, finding your target requires moving from the fastest database tools to the most intensive filesystem scours.</p>
<h3>3. <code>which</code> (Where is My Shortcut?)</h3>
<p>Think of <code>which</code> as asking the system, <em>"Which door do I open to find where this command actually lives?"</em> It reads your system's <code>PATH</code> variable and returns the exact binary file path of the command you are typing.</p>
<p>When you invoke <code>which cat</code>, you are asking the terminal where that tool keeps its physical bones. The terminal blinks and points you directly to <code>/usr/bin/cat</code>.</p>
<p>Sometimes, the detective encounters a pseudonym. If you stand before a modern security distribution like Kali Linux and execute <code>which grep</code>, the terminal bounces back an unexpected line:</p>
<pre><code class="language-text">grep: aliased to grep --color=auto
</code></pre>
<p>Don’t panic. Linux handles command names much like a literary tradition handles pen names. The creators of the distribution have set an <strong>alias</strong>, a shortcut that automatically intercepts the command and appends a flag forcing the terminal to highlight search results in vivid color. Because the <code>which</code> command is a literal detective, it reports the alias first. To rip away the mask and force it to show the physical path beneath the nickname, pass it through the all matches flag:</p>
<pre><code class="language-bash">which -a grep
</code></pre>
<p>Only then does the raw, underlying path reveal itself: <code>/usr/bin/grep</code>.</p>
<h3>4. <code>whereis</code> (Give Me the Complete Archive File)</h3>
<p>The <code>whereis</code> command goes a step further than <code>which</code>. It is the equivalent of walking up to a library desk and demanding the complete reference profile on a topic. When you use <code>whereis</code>, the system doesn't just look for the binary; it simultaneously returns the file location of the executable binary, the source code archives, and the system manual (<code>man</code>) pages associated with that command.</p>
<h3>5. <code>locate</code> (Check the Old Card Catalogue)</h3>
<p>The <code>locate</code> command allows you to query a built-in internal system database (<code>mlocate.db</code>) for near-instantaneous search results. However, there is a catch: because it reads from an indexed database rather than crawling the live filesystem, a file created five minutes ago will be completely invisible to it. The card catalog hasn't been updated yet.</p>
<p>To fix this and force the indexing clerk to update its records, you must manually trigger the database update process using administrative sovereignty:</p>
<pre><code class="language-bash">sudo updatedb
</code></pre>
<p>The <code>sudo</code> prefix ("SuperUser Do") grants the command root privileges to scan the entire system, refreshing the index so that your subsequent <code>locate</code> queries land with absolute precision.</p>
<h3>6. <code>find</code> (Kick Down the Doors and Search Every Corner)</h3>
<p>As the name implies, <code>find</code> is the heavy artillery deployed for rigorous, intensive investigations. It does not rely on a pre-compiled database like <code>locate</code>. Instead, it initiates a live, real-time scour of the raw physical filesystem, analyzing blocks, permissions, names, sizes, and recent creation timestamps. It can locate a file minted mere seconds ago.</p>
<p>To harness the <code>find</code> command, you must master its structural syntax:</p>
<p>$$\text{find} \quad [\text{directory_to_search}] \quad [\text{options}] \quad [\text{expression}]$$</p>
<p>A tactical deployment of this command looks like this:</p>
<pre><code class="language-bash">find . -type f -name Bisi
</code></pre>
<p>This tells the system to search the current directory (represented by the dot <code>.</code>) for a regular file (<code>-type f</code>) whose exact name matches (<code>-name</code>) <strong>Bisi</strong>. Furthermore, you can supercharge this search by leveraging <strong>wildcards</strong> (such as <code>*</code>, <code>?</code>, or <code>[]</code>) to hunt down partial matches or specific file extensions.</p>
<h3>7. <code>man</code> (The Systems Tour Guide)</h3>
<p>When the sheer volume of options and expressions feels overwhelming, the <code>man</code> (<strong>Manual</strong>) command becomes your ultimate compass. It serves as your system's built-in reference documentation. Running a simple syntax like <code>man find</code> or <code>man grep</code> pulls up a highly detailed roadmap explaining every hidden capability your tools possess.</p>
<hr />
<h2>The Rule of Thumb</h2>
<p>Mastering Linux is fundamentally rooted in having a solid, unshakeable grasp of the basics. For me, this is how I measure growth: one command at a time, learning at my own pace, enjoying the spaces where curiosity keeps me alive.</p>
<p>The next time you stand naked before the blinking prompt of a Linux terminal, ask yourself two questions: <em>“Where am I?”</em> and <em>“Where do I want to go?”</em> As you navigate those answers, your actions will dictate your commands naturally.</p>
<p>When you sit down at the keyboard, keep these guiding principles close:</p>
<ol>
<li><p><strong>Be patient with the process.</strong> You do not need to memorize thirty commands in a single day. Let them flow from your actual analytical intent.</p>
</li>
<li><p><strong>Verify your instruments.</strong> If you need to quickly check whether an application tool is properly installed and verify where it resides, run <code>which</code> or <code>whereis</code>.</p>
</li>
<li><p><strong>Optimize your resources.</strong> If you need to instantly locate a standard file without lagging your machine's hardware with massive disk reads, rely on <code>locate</code>.</p>
</li>
<li><p><strong>Deploy forensic precision.</strong> If you are conducting a rigorous investigation to hunt down a hidden, malicious, or recently altered system file, accept the processing time and unleash <code>find</code>.</p>
</li>
</ol>
<p>Till next time, Linux, before your terminal I will stand.</p>
]]></content:encoded></item></channel></rss>