<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Brian kiplangat</title>
    <description>The latest articles on DEV Community by Brian kiplangat (@kiplangat_brian).</description>
    <link>https://dev.to/kiplangat_brian</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3951989%2F9516465d-0ea1-41e3-9bad-212b45892344.png</url>
      <title>DEV Community: Brian kiplangat</title>
      <link>https://dev.to/kiplangat_brian</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kiplangat_brian"/>
    <language>en</language>
    <item>
      <title>Linux Fundamentals for Data Engineering</title>
      <dc:creator>Brian kiplangat</dc:creator>
      <pubDate>Fri, 12 Jun 2026 01:15:31 +0000</pubDate>
      <link>https://dev.to/kiplangat_brian/linux-fundamentals-for-data-engineering-5a9p</link>
      <guid>https://dev.to/kiplangat_brian/linux-fundamentals-for-data-engineering-5a9p</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As a data engineer, most of your work will happen &lt;br&gt;
on Linux servers. Whether you are managing databases, &lt;br&gt;
running data pipelines, or processing large datasets, &lt;br&gt;
Linux is the operating system that powers the majority &lt;br&gt;
of servers worldwide. Understanding Linux fundamentals &lt;br&gt;
is therefore not optional for data engineers it is &lt;br&gt;
a core skill that separates beginners from &lt;br&gt;
professionals.&lt;/p&gt;

&lt;p&gt;In this article, I will walk you through the &lt;br&gt;
essential Linux skills every data engineer needs, &lt;br&gt;
based on my hands-on experience setting up a remote &lt;br&gt;
Ubuntu server, configuring PostgreSQL, and performing &lt;br&gt;
file transfers using SCP. This is part of my &lt;br&gt;
LuxDevHQ Data Engineering Cohort 8 assignment.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. Setting Up Linux on Windows with WSL
&lt;/h2&gt;

&lt;p&gt;Most data engineers start their journey on Windows. &lt;br&gt;
The good news is that you do not need to install a &lt;br&gt;
separate Linux machine Windows Subsystem for Linux &lt;br&gt;
(WSL) allows you to run a full Linux environment &lt;br&gt;
directly inside Windows.&lt;/p&gt;

&lt;p&gt;To install WSL, open Windows CMD as Administrator &lt;br&gt;
and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wsl &lt;span class="nt"&gt;--install&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; Ubuntu-22.04
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, restart your PC. You can now &lt;br&gt;
launch Ubuntu directly from your Start menu or by &lt;br&gt;
typing &lt;code&gt;wsl&lt;/code&gt; in CMD.&lt;/p&gt;

&lt;p&gt;One important lesson I learned during setup: WSL &lt;br&gt;
comes in different flavors. If your prompt shows &lt;br&gt;
&lt;code&gt;-sh&lt;/code&gt; instead of &lt;code&gt;bash&lt;/code&gt;, you are running a minimal &lt;br&gt;
shell, not full Ubuntu. In that case, install Ubuntu &lt;br&gt;
specifically using the command above.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Connecting to a Remote Server with SSH
&lt;/h2&gt;

&lt;p&gt;SSH (Secure Shell) is the standard way to connect &lt;br&gt;
to remote Linux servers. As a data engineer you will &lt;br&gt;
use SSH daily to access cloud servers, manage &lt;br&gt;
databases, and run data pipelines remotely.&lt;/p&gt;

&lt;p&gt;The basic SSH command syntax is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh username@server_ip &lt;span class="nt"&gt;-p&lt;/span&gt; port_number
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, to connect to our assignment server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh root@159.65.222.96 &lt;span class="nt"&gt;-p&lt;/span&gt; 22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Port 22 is the default SSH port. When connecting &lt;br&gt;
for the first time, you will see:&lt;/p&gt;

&lt;p&gt;Are you sure you want to continue connecting?&lt;br&gt;
(yes/no)&lt;/p&gt;

&lt;p&gt;Always type &lt;code&gt;yes&lt;/code&gt; and press Enter.&lt;/p&gt;

&lt;p&gt;One important thing to understand about your &lt;br&gt;
terminal prompt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;#&lt;/code&gt; at the end means you are root (full admin)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$&lt;/code&gt; at the end means you are a normal user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Always run &lt;code&gt;whoami&lt;/code&gt; to confirm which user you are &lt;br&gt;
operating as this saved me from many permission &lt;br&gt;
errors during this assignment.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Linux User Management
&lt;/h2&gt;

&lt;p&gt;On a shared server, every person should have their &lt;br&gt;
own user account. This is important for security, &lt;br&gt;
accountability, and proper file permissions.&lt;/p&gt;

&lt;p&gt;To create a new user:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adduser briank
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An important lesson I learned: Linux usernames must &lt;br&gt;
be lowercase. When I tried to create a user called &lt;br&gt;
&lt;code&gt;BrianK&lt;/code&gt;, I got this error:&lt;/p&gt;

&lt;p&gt;Please enter a username matching the regular&lt;br&gt;
expression configured via the NAME_REGEX&lt;br&gt;
configuration variable.&lt;/p&gt;

&lt;p&gt;The fix was simple use lowercase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adduser briank
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To give the user sudo (admin) privileges:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;briank
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To verify the user was created successfully:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;id &lt;/span&gt;briank
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;uid=1088(briank) gid=1088(briank)&lt;br&gt;
groups=1088(briank),27(sudo),100(users)&lt;/p&gt;


&lt;h2&gt;
  
  
  4. Essential Linux Commands for Data Engineers
&lt;/h2&gt;

&lt;p&gt;Here are the most important Linux commands every &lt;br&gt;
data engineer should know, organized by category:&lt;/p&gt;
&lt;h3&gt;
  
  
  Navigation Commands
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;          &lt;span class="c"&gt;# print current directory&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt;           &lt;span class="c"&gt;# list files&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;       &lt;span class="c"&gt;# detailed list including hidden files&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;Documents &lt;span class="c"&gt;# go into a folder&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ..        &lt;span class="c"&gt;# go up one level&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~         &lt;span class="c"&gt;# go to home directory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  File Operations
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;notes.txt           &lt;span class="c"&gt;# create empty file&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;linux_assignment    &lt;span class="c"&gt;# create folder&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;notes.txt backup.txt   &lt;span class="c"&gt;# copy file&lt;/span&gt;
&lt;span class="nb"&gt;mv &lt;/span&gt;backup.txt old.txt     &lt;span class="c"&gt;# rename/move file&lt;/span&gt;
&lt;span class="nb"&gt;rm &lt;/span&gt;old.txt                &lt;span class="c"&gt;# delete file&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;notes.txt             &lt;span class="c"&gt;# view file contents&lt;/span&gt;
&lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-10&lt;/span&gt; notes.txt        &lt;span class="c"&gt;# view first 10 lines&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-10&lt;/span&gt; notes.txt        &lt;span class="c"&gt;# view last 10 lines&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"error"&lt;/span&gt; log.txt      &lt;span class="c"&gt;# search inside file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  System Information
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;whoami&lt;/span&gt;       &lt;span class="c"&gt;# current username&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt;     &lt;span class="c"&gt;# system and kernel info&lt;/span&gt;
&lt;span class="nb"&gt;hostname&lt;/span&gt;     &lt;span class="c"&gt;# server name&lt;/span&gt;
&lt;span class="nb"&gt;uptime&lt;/span&gt;       &lt;span class="c"&gt;# how long server has been running&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;        &lt;span class="c"&gt;# disk space usage&lt;/span&gt;
free &lt;span class="nt"&gt;-h&lt;/span&gt;      &lt;span class="c"&gt;# memory usage&lt;/span&gt;
top          &lt;span class="c"&gt;# running processes (q to quit)&lt;/span&gt;
ps aux       &lt;span class="c"&gt;# list all processes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  File Permissions
&lt;/h3&gt;

&lt;p&gt;Linux file permissions control who can read, &lt;br&gt;
write, and execute files. They are shown as:&lt;/p&gt;

&lt;p&gt;-rwxr-xr-x&lt;/p&gt;

&lt;p&gt;Breaking this down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;r&lt;/code&gt; = read (4)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;w&lt;/code&gt; = write (2)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;x&lt;/code&gt; = execute (1)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three groups: owner, group, others.&lt;/p&gt;

&lt;p&gt;To change permissions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;755 script.sh   &lt;span class="c"&gt;# owner: rwx, others: r-x&lt;/span&gt;
&lt;span class="nb"&gt;chmod &lt;/span&gt;644 notes.txt   &lt;span class="c"&gt;# owner: rw-, others: r--&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To change file ownership:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chown &lt;/span&gt;briank notes.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Networking Commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip a                  &lt;span class="c"&gt;# show network interfaces&lt;/span&gt;
ping google.com &lt;span class="nt"&gt;-c&lt;/span&gt; 4  &lt;span class="c"&gt;# test connectivity&lt;/span&gt;
netstat &lt;span class="nt"&gt;-tulnp&lt;/span&gt;        &lt;span class="c"&gt;# show open ports&lt;/span&gt;
ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt;              &lt;span class="c"&gt;# modern version of netstat&lt;/span&gt;
curl ifconfig.me      &lt;span class="c"&gt;# show your public IP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. PostgreSQL Setup on Linux
&lt;/h2&gt;

&lt;p&gt;PostgreSQL is the most popular open source database &lt;br&gt;
for data engineering. Here is how to set it up on &lt;br&gt;
Ubuntu:&lt;/p&gt;
&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt update
apt &lt;span class="nb"&gt;install &lt;/span&gt;postgresql postgresql-contrib &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Start and Enable the Service
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl start postgresql
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;postgresql
systemctl status postgresql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Log Into PostgreSQL
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;su &lt;span class="nt"&gt;-s&lt;/span&gt; /bin/bash postgres
psql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Create a Database and Schema
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;briank&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt; &lt;span class="n"&gt;briank&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;SCHEMA&lt;/span&gt; &lt;span class="n"&gt;staging&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Create a Table and Insert Data
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;staging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;farmers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;farmer_name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;county&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;subcounty&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;acreage&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;crop&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;loan_amount&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;loan_status&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;season&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;staging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;farmers&lt;/span&gt; 
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;farmer_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;county&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subcounty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
&lt;span class="n"&gt;acreage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;crop&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loan_amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loan_status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;season&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'John Kipchumba'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Uasin Gishu'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
 &lt;span class="s1"&gt;'Turbo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Maize'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15000&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Paid'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2023A'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Mary Jelimo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Uasin Gishu'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
 &lt;span class="s1"&gt;'Soy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Maize'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12000&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Defaulted'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2023A'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Peter Rotich'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Uasin Gishu'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
 &lt;span class="s1"&gt;'Eldoret East'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Maize'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20000&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Paid'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2023B'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Useful psql Commands
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;          &lt;span class="c1"&gt;-- list all databases&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt; &lt;span class="n"&gt;dbname&lt;/span&gt;   &lt;span class="c1"&gt;-- connect to database&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;         &lt;span class="c1"&gt;-- list all tables&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;du&lt;/span&gt;         &lt;span class="c1"&gt;-- list all users&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;          &lt;span class="c1"&gt;-- quit psql&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Allow External Connections
&lt;/h3&gt;

&lt;p&gt;To allow tools like DBeaver or pgAdmin to connect &lt;br&gt;
remotely, two configuration files need editing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;postgresql.conf&lt;/strong&gt;  change listen_addresses:&lt;br&gt;
listen_addresses = '&lt;em&gt;'&lt;br&gt;
**pg_hba.conf&lt;/em&gt;* — add this line at the bottom:&lt;br&gt;
host  all  all  0.0.0.0/0  md5&lt;br&gt;
Then restart PostgreSQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl restart postgresql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. File Transfers with SCP
&lt;/h2&gt;

&lt;p&gt;SCP (Secure Copy Protocol) uses SSH to transfer &lt;br&gt;
files between your local machine and a remote server. &lt;br&gt;
This is essential for data engineers who need to &lt;br&gt;
move datasets, scripts, and configuration files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Upload from local PC to server
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\B&lt;/span&gt;rian&lt;span class="se"&gt;\n&lt;/span&gt;otes.txt root@159.65.222.96:/root/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Download from server to local PC
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp root@159.65.222.96:/root/notes.txt C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\B&lt;/span&gt;rian&lt;span class="se"&gt;\D&lt;/span&gt;ownloads&lt;span class="se"&gt;\&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Copy an entire folder
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp &lt;span class="nt"&gt;-r&lt;/span&gt; myfolder/ root@159.65.222.96:/root/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Use SSH key instead of password
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/mykey.pem file.txt root@server:/path/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Key Lessons Learned
&lt;/h2&gt;

&lt;p&gt;During this assignment I encountered several &lt;br&gt;
real-world challenges that taught me valuable lessons:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson 1 Always check who you are&lt;/strong&gt;&lt;br&gt;
Running &lt;code&gt;whoami&lt;/code&gt; before every session saved me &lt;br&gt;
from making changes as the wrong user. I accidentally &lt;br&gt;
switched to another student's account and spent time &lt;br&gt;
wondering why permissions were denied.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson 2 Usernames must be lowercase&lt;/strong&gt;&lt;br&gt;
Linux enforces strict naming rules. &lt;code&gt;BrianK&lt;/code&gt; failed &lt;br&gt;
but &lt;code&gt;briank&lt;/code&gt; worked perfectly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson 3 The prompt tells you everything&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;#&lt;/code&gt; means root, &lt;code&gt;$&lt;/code&gt; means normal user. &lt;br&gt;
&lt;code&gt;=#&lt;/code&gt; in psql means ready, &lt;code&gt;(#&lt;/code&gt; means incomplete &lt;br&gt;
command press Ctrl+C to cancel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson 4  WSL is not always Ubuntu&lt;/strong&gt;&lt;br&gt;
Not all WSL installations are equal. A minimal &lt;br&gt;
shell missing &lt;code&gt;apt&lt;/code&gt;, &lt;code&gt;sudo&lt;/code&gt;, and &lt;code&gt;ssh&lt;/code&gt; taught me &lt;br&gt;
to always verify my environment with &lt;br&gt;
&lt;code&gt;cat /etc/os-release&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson 5 Shared servers have history&lt;/strong&gt;&lt;br&gt;
On a shared assignment server, previous students &lt;br&gt;
had already made some configurations. Always check &lt;br&gt;
before editing - use &lt;code&gt;grep&lt;/code&gt; and &lt;code&gt;tail&lt;/code&gt; to verify &lt;br&gt;
what already exists.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Conclusion
&lt;/h2&gt;

&lt;p&gt;Linux is the backbone of modern data engineering. &lt;br&gt;
From managing remote servers with SSH, to setting &lt;br&gt;
up PostgreSQL databases, to transferring files with &lt;br&gt;
SCP every skill covered in this article is used &lt;br&gt;
daily by professional data engineers.&lt;/p&gt;

&lt;p&gt;The best way to learn Linux is by doing. Set up WSL &lt;br&gt;
on your Windows machine, spin up a cloud server, &lt;br&gt;
and practice these commands every day. The more you &lt;br&gt;
use them the more natural they become.&lt;/p&gt;

&lt;p&gt;As I continue my journey in data engineering at &lt;br&gt;
LuxDevHQ Cohort 8, Linux will remain a foundation &lt;br&gt;
skill that everything else builds on  from Python &lt;br&gt;
data pipelines, to cloud infrastructure, to &lt;br&gt;
geospatial data processing with PostGIS.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Brian Kiplangat - LuxDevHQ Data Engineering &lt;br&gt;
Cohort 8 | Nairobi, Kenya&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;GitHub: &lt;a href="https://github.com/kiplangatbrian85/" rel="noopener noreferrer"&gt;https://github.com/kiplangatbrian85/&lt;/a&gt;&lt;br&gt;
linux-data-engineering&lt;/em&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>dataengineering</category>
      <category>postgres</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
