<?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: phillip nzioka</title>
    <description>The latest articles on DEV Community by phillip nzioka (@yonko).</description>
    <link>https://dev.to/yonko</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3952206%2F3de8bef5-9320-408a-9c44-937bcfa7f468.jpg</url>
      <title>DEV Community: phillip nzioka</title>
      <link>https://dev.to/yonko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yonko"/>
    <language>en</language>
    <item>
      <title>Linux Fundamentals for Data Engineering</title>
      <dc:creator>phillip nzioka</dc:creator>
      <pubDate>Sun, 07 Jun 2026 19:11:58 +0000</pubDate>
      <link>https://dev.to/yonko/linux-fundamentals-for-data-engineering-a4e</link>
      <guid>https://dev.to/yonko/linux-fundamentals-for-data-engineering-a4e</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Linux is a free, open-source Unix-like operating system (created by Linus Torvalds in 1991) that powers most cloud infrastructure and big data tools. It's essential for data engineers due to its stability, performance, and automation capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Linux Matters for Data Engineering
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cloud &amp;amp; Tool Dominance&lt;/strong&gt;: Runs on AWS, Azure, GCP, Docker, Kubernetes, Spark, Kafka, and Airflow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automation&lt;/strong&gt;: Enables ETL pipeline automation via Bash scripting and CRON jobs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Command Line Skills&lt;/strong&gt;: Requires mastery of navigation, process management, and text editing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;File System &amp;amp; Permissions&lt;/strong&gt;: Critical for secure data handling with chmod and chown&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Linux Essentials
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Basic SSH connection
&lt;/h4&gt;

&lt;p&gt;SSH (Secure Shell) lets you open an encrypted terminal session to a remote machine, typically with &lt;code&gt;ssh @&amp;lt;server_address&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ssh"&gt;&lt;code&gt;&lt;span class="k"&gt;ssh&lt;/span&gt; &amp;lt;username&amp;gt;@&amp;lt;server_address&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffws3rlc2asj4vf7phdf1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffws3rlc2asj4vf7phdf1.png" alt="ssh login" width="799" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a user to a Linux server
&lt;/h3&gt;

&lt;p&gt;To create a new user, all you have to do is ‘useradd‘ or ‘adduser‘ with ‘username’. The ‘username’ is a user login name, that is used by user to login into the system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmqqj873wkat8a089eksu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmqqj873wkat8a089eksu.png" alt="Adding user to Linux server" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you’ve created the user, you can switch to the created user&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;su - phillipN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once logged in it's important to make sure the server is upto date.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3l3pd5c27bju5p0unamb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3l3pd5c27bju5p0unamb.png" alt="Update" width="800" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once in a while you can upgrade the server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5i8atmju8xoyjdo0555.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5i8atmju8xoyjdo0555.png" alt="Upgrade" width="800" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  File Operations
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;ls&lt;/code&gt;&lt;br&gt;
Lists directory contents&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77ewt6t5e82xeox1txlt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77ewt6t5e82xeox1txlt.png" alt="List directory" width="800" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd&lt;/code&gt;&lt;br&gt;
Navigates through directories&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd &amp;lt;directory_path&amp;gt;&lt;/code&gt;  → Moves to directory&lt;br&gt;
&lt;code&gt;cd ..&lt;/code&gt; → Goes up one level&lt;br&gt;
&lt;code&gt;cd&lt;/code&gt; → Returns to home&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fue84r3fmokoohlj8tr1e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fue84r3fmokoohlj8tr1e.png" alt="Change directory" width="799" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pwd&lt;/code&gt;&lt;br&gt;
Prints working directory&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F672c2nxmsn6un0fg4u87.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F672c2nxmsn6un0fg4u87.png" alt="Current directory" width="800" height="74"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mkdir&lt;/code&gt;&lt;br&gt;
Creates a directory&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mkdir &amp;lt;directory_name&amp;gt;&lt;/code&gt; → Makes directory &lt;br&gt;
&lt;code&gt;mkdir -p &amp;lt;path&amp;gt;&lt;/code&gt; → Creates parent directories&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F453nm2c2y7tftqagsaox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F453nm2c2y7tftqagsaox.png" alt="Create directory" width="800" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mv&lt;/code&gt;&lt;br&gt;
mv does two jobs depending on what you give it as the destination. If you give it a new path, it moves the file there. If you give it a new name in the same folder, it renames it. Either way, the original is gone.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cp&lt;/code&gt;&lt;br&gt;
Used to copy files and directories from a source to a destination.  The basic syntax is cp [options] source destination.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Common Usage&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Copy a single file: &lt;code&gt;cp file1.txt file2.txt&lt;/code&gt; creates a copy named &lt;em&gt;file2.txt&lt;/em&gt;. &lt;br&gt;
Copy to a directory: &lt;code&gt;cp file.txt /backup/&lt;/code&gt; copies the file into the specified directory. &lt;br&gt;
Copy directories: Use the &lt;code&gt;-r&lt;/code&gt; or &lt;code&gt;-R&lt;/code&gt; (recursive) flag to copy folders: &lt;code&gt;cp -r dir1 dir2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6soa4np5aw06t6lbwso.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6soa4np5aw06t6lbwso.png" alt="Copy Files/Folders" width="800" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rm&lt;/code&gt;&lt;br&gt;
Deletes files or folders permanently.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rm &amp;lt;file&amp;gt;&lt;/code&gt; → Delete file&lt;br&gt;
&lt;code&gt;rm -r &amp;lt;dir&amp;gt;&lt;/code&gt; → Delete recursively &lt;br&gt;
&lt;code&gt;rm -i &amp;lt;file&amp;gt;&lt;/code&gt; → Confirm before delete&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8je7g8bhmfqw52g9j9vq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8je7g8bhmfqw52g9j9vq.png" alt="Delete Files/Folders" width="799" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;touch&lt;/code&gt;&lt;br&gt;
Creates empty files.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ohqszc36ysw1moh3gzb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ohqszc36ysw1moh3gzb.png" alt="touch" width="799" height="127"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  System Monitoring &amp;amp; Performance
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;top&lt;/code&gt; / &lt;code&gt;htop&lt;/code&gt;&lt;br&gt;
Process monitoring.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frydd53c5opt8cjtmubif.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frydd53c5opt8cjtmubif.png" alt="Process monitoring" width="800" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kill&lt;/code&gt;&lt;br&gt;
Terminate/end process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqs74melfitu117rhw4ci.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqs74melfitu117rhw4ci.png" alt="Terminate process" width="800" height="58"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;free&lt;/code&gt;&lt;br&gt;
Shows memory usage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj5yo2enbosed02q2ctnx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj5yo2enbosed02q2ctnx.png" alt="Memory usage" width="800" height="68"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;df / du&lt;/code&gt;&lt;br&gt;
Disk usage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq8xo6lmhr411q8uktr2k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq8xo6lmhr411q8uktr2k.png" alt="Disk usage" width="800" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;uptime&lt;/code&gt;&lt;br&gt;
Shows system uptime.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbh0x1xy670uycmrrvvah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbh0x1xy670uycmrrvvah.png" alt="uptime" width="800" height="70"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Vim Editor Essentials
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Modal editing: Normal mode (navigation) and Insert mode (typing)&lt;/li&gt;
&lt;li&gt;Key shortcuts: &lt;code&gt;i&lt;/code&gt; (insert), &lt;code&gt;Esc&lt;/code&gt; (exit mode), &lt;code&gt;:wq&lt;/code&gt; (save &amp;amp; quit), &lt;code&gt;:q!&lt;/code&gt; (quit without saving)&lt;/li&gt;
&lt;li&gt;Navigation: &lt;code&gt;h/j/k/l&lt;/code&gt; (arrows), &lt;code&gt;gg&lt;/code&gt; (top), &lt;code&gt;G&lt;/code&gt; (bottom), &lt;code&gt;/pattern&lt;/code&gt; (search)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Critical Security &amp;amp; Maintenance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use SSH keys instead of passwords for authentication&lt;/li&gt;
&lt;li&gt;Create non-root users with &lt;code&gt;sudo&lt;/code&gt; privileges&lt;/li&gt;
&lt;li&gt;Regular system updates: &lt;code&gt;apt update &amp;amp;&amp;amp; apt upgrade&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  PostgreSQL Installation &amp;amp; Configuration for Data Engineering
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1. Install PostgreSQL (Only If Not Already Installed)
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check if PostgreSQL is already installed&lt;/span&gt;
psql &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;# If not installed, update package list and install&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; postgresql postgresql-contrib

&lt;span class="c"&gt;# Verify installation&lt;/span&gt;
systemctl status postgresql

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  2. Configure PostgreSQL to Allow Remote Traffic
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Edit the main PostgreSQL configuration file&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/postgresql/&lt;span class="k"&gt;*&lt;/span&gt;/main/postgresql.conf

&lt;span class="c"&gt;# Find and change the listen_addresses line:&lt;/span&gt;
&lt;span class="c"&gt;# From: #listen_addresses = 'localhost'&lt;/span&gt;
&lt;span class="c"&gt;# To:   listen_addresses = '*'&lt;/span&gt;

&lt;span class="c"&gt;# Save and exit (:wq in vim or Ctrl+X then Y in nano)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Edit the client authentication configuration file&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/postgresql/&lt;span class="k"&gt;*&lt;/span&gt;/main/pg_hba.conf

&lt;span class="c"&gt;# Add this line at the end to allow connections from any IP&lt;/span&gt;
host    all             all             0.0.0.0/0               md5

&lt;span class="c"&gt;# For specific subnet (more secure), use:&lt;/span&gt;
&lt;span class="c"&gt;# host    all             all             192.168.1.0/24         md5&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  3. Configure Firewall to Allow PostgreSQL Traffic (Port 5432)
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Allow PostgreSQL default port through firewall&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 5432/tcp

&lt;span class="c"&gt;# Reload firewall to apply changes&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw reload

&lt;span class="c"&gt;# Verify firewall rules&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status verbose

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  4. Restart PostgreSQL and Check Status
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Restart PostgreSQL to apply configuration changes&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart postgresql

&lt;span class="c"&gt;# Check service status&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status postgresql

&lt;span class="c"&gt;# Check if PostgreSQL is listening on all interfaces&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;netstat &lt;span class="nt"&gt;-tulpn&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;5432
&lt;span class="c"&gt;# OR&lt;/span&gt;
ss &lt;span class="nt"&gt;-tulpn&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;postgres

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  5. Create Database and Schema
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Switch&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="n"&gt;postgres&lt;/span&gt; &lt;span class="k"&gt;system&lt;/span&gt; &lt;span class="k"&gt;user&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="n"&gt;postgres&lt;/span&gt;

&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="k"&gt;Create&lt;/span&gt; &lt;span class="k"&gt;database&lt;/span&gt; &lt;span class="s1"&gt;'phillipdb'&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;phillipdb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="k"&gt;Connect&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="k"&gt;database&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;phillipdb&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Inside psql, create schema 'staging'&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;span class="c1"&gt;-- Verify schema was created&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;dn&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  6. Add Data to the Staging Schema
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Create a sample table in staging schema&lt;/span&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;customers&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;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="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&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="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Insert sample data&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;customers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&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 Doe'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'john.doe@example.com'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Jane Smith'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'jane.smith@example.com'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Phillip N'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'phillip.n@example.com'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Query to verify data&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&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;customers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Import data from CSV file (common data engineering task)&lt;/span&gt;
&lt;span class="k"&gt;COPY&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;customers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="s1"&gt;'/data/customers.csv'&lt;/span&gt;
&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="s1"&gt;','&lt;/span&gt;
&lt;span class="n"&gt;CSV&lt;/span&gt; &lt;span class="n"&gt;HEADER&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  SCP(Secure Copy Protocol)
&lt;/h4&gt;

&lt;p&gt;It is a Linux command-line utility used to securely transfer files and directories between a local host and a remote host, or between two remote hosts.  It operates over an SSH (Secure Shell) connection, ensuring that all data is encrypted during transit.&lt;/p&gt;
&lt;h5&gt;
  
  
  Key Syntax and Usage
&lt;/h5&gt;

&lt;p&gt;The general syntax is &lt;code&gt;scp [options] source destination&lt;/code&gt;. The source and destination can be local paths or remote paths formatted as &lt;code&gt;[user@]host:/path&lt;/code&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local to Remote: &lt;code&gt;scp file.txt user@remote_host:/remote/path/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Remote to Local: &lt;code&gt;scp user@remote_host:/remote/file.txt ./local/path/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Remote to Remote: &lt;code&gt;scp user@host1:/path/file.txt user@host2:/path/&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;
  
  
  Common Options
&lt;/h5&gt;

&lt;p&gt;&lt;code&gt;-r&lt;/code&gt;: Recursively copy entire directories. &lt;br&gt;
&lt;code&gt;-P port&lt;/code&gt;: Specify a non-standard SSH port (note the capital P). &lt;br&gt;
&lt;code&gt;-p&lt;/code&gt;: Preserve file modification times and permissions. &lt;br&gt;
&lt;code&gt;-q&lt;/code&gt;: Quiet mode; suppresses progress meter and warnings. &lt;br&gt;
&lt;code&gt;-C&lt;/code&gt;: Enable compression to speed up transfers.&lt;/p&gt;

&lt;p&gt;To copy files from a Linux server to a Windows machine using SCP, you must run the command from the Windows machine to "pull" the file, as Windows typically does not run an SSH server by default. &lt;/p&gt;
&lt;h5&gt;
  
  
  &lt;em&gt;Using Built-in OpenSSH (Windows 10/11)&lt;/em&gt;
&lt;/h5&gt;

&lt;p&gt;Modern Windows versions include a native SCP client. Open Command Prompt or PowerShell and use the following syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp username@linux_server_ip:/path/to/remote/file C:&lt;span class="se"&gt;\p&lt;/span&gt;ath&lt;span class="se"&gt;\t&lt;/span&gt;o&lt;span class="se"&gt;\l&lt;/span&gt;ocal&lt;span class="se"&gt;\d&lt;/span&gt;estination

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;username&lt;/em&gt;&lt;/strong&gt;: The Linux user account. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;linux_server_ip&lt;/em&gt;&lt;/strong&gt;: The IP address or hostname of the Linux server. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;/path/to/remote/file&lt;/em&gt;&lt;/strong&gt;: The absolute path on the Linux server. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;C:\path\to\local\destination&lt;/em&gt;&lt;/strong&gt;: The local Windows directory where the file will be saved.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Copying files from Windows machine to a specific user on a Linux server using scp&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqq2fjj4k830bkhm08gkd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqq2fjj4k830bkhm08gkd.png" alt="scp -r" width="799" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Linux is not just an optional skill for data engineers—it's the foundational operating system upon which modern data engineering is built. Mastering Linux commands and concepts directly translates to the ability to build, deploy, and maintain robust data pipelines in production environments.&lt;/p&gt;

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