Try   HackMD

DevOps Training Session 3: OS - Scripting with ps & bash

tags: devops research reliable

Hello BTB from diary of DevOps intern, today and tomorrow i will research and implement script about OS with powershell and bash. This is lab to day > LAB3

Practice Scripting - Research

  1. Write a Powershell function and a Shell Script function that:
  • Take a string input as a date (i.e. Thursday, July 21, 2022)
  • Check if the date is in the right format “dddd,MM dd,YYYY”
    (using regex)
  • Check if the year is a leap year
  • Check if it is a weekend

Bash

#!/bin/bash
ChallengeName="P1 - Bash"

echo "Hey this is my first $ChallengeName"
read -p "Which day you want to check: " Daytoday

if [[ $Daytoday =~ ^[A-Za-z]{6,9},[[:space:]]*[A-Za-z]{3,9}[[:space:]]*[0-3]{1}[0-9]{1},[[:space:]]*[1-9]{1}[0-9]{1}[0-9]{1}[0-9]{1}$ ]]
then
    echo "Right Format"
    Year=$(echo $Daytoday | cut -d "," -f 3 | tr -d " ")
    Day=$(echo $Daytoday | cut -d "," -f 1)
    if [[ $(($Year % 400)) = 0 && $(($Year % 100)) = 0 ]]
    then
        echo "$Year is a leap year"
    elif [[ $(($Year % 400)) = 0 && $(($Year % 100)) != 0 ]]
    then
        echo "$Year is not a leap year" 
    else
        echo "$Year is not a leap year"
    fi
    if [ $Day == "Sunday" ] 
    then
        echo "$Daytoday is the weekend"
    else
        echo "$Daytoday is not the weekend"
    fi
else 
    echo "Not Right format"
fi

Powershell

#!/usr/bin/pwsh

# 1. Write a Powershell function and a Shell Script function that:
# - Take a string input as a date (i.e. Thursday, July 21, 2022)
# - Check if the date is in the right format “dddd,MM dd,YYYY”
# (using regex)
# - Check if the year is a leap year
# - Check if it is a weekend

$ChallengeName="P1 - Powershell"

Write-Host "Hey this is my first $ChallengeName"
$Daytoday = Read-Host -Prompt "Which day you want to check"

if ($Daytoday -match '[A-Za-z]{6,9}, [A-Za-z]{3,9} [0-3]{1}[0-9]{1}, [1-9]{1}[0-9]{1}[0-9]{1}[0-9]{1}')
{
    Write-Host "Right format"
    $Day, $Year  = ($Daytoday -replace " " -split ",")[0,-1]
    if ((($Year % 4) -eq 0 -And ($Year % 100) -ne 0) -Or (($Year % 400) -eq 0 ))
    {
        Write-Host "$Year is the leap year"
    }
    else
    {
        Write-Host "$Year is not the leap year"
    }
    if (($Day -eq "Sunday"))
    {
        Write-Host "$Daytoday is the weekend"
    }
    else
    {
        Write-Host "$Daytoday is not the weekend"
    }
}
else
{
    Write-Host "Not right format"
}

  1. Write a Powershell script and a Bash script that:
  • List all files in the current directory, sorts the output, remove file extensions
  • List only show .txt files
  • List files and folders that have been created within 1 day

Bash

#!/bin/bash
echo "List all files in the current directory, sorts the output, remove file
extensions"
ls | sort | cut -d "." -f 1
echo ""
echo ""


echo "Show only txt file"
echo "Method 1 using ls"
ls | egrep '\.txt'
echo "Method 2 using find"
find . -iregex '.*\.\(txt\)' -printf '%f\n'
echo ""
echo ""


echo "List files and folders that have been created within 1 day"
find . -maxdepth 1 -mtime -1

Powershell

#!/usr/bin/env pwsh

# 2. Write a Powershell script and a Bash script that:
# - List all files in the current directory, sorts the output, remove file
# extensions
# - List only show .txt files
# - List files and folders that have been created within 1 day

Write-Host "List all files in the current directory, sorts the output, remove file extensions"
$list = (Get-Item *).Basename | Sort-Object
Write-Host $list
Write-Host ""
Write-Host ""

Write-Host "List only show .txt files"
$txtList = (Get-ChildItem -Path $dir -Filter *.txt | Select-Object -First 1).Name
Write-Host $txtList
Write-Host ""
Write-Host ""

Write-Host "List files and folders that have been created within 1 day"
$day_today = (Get-Date).AddDays(-1)
$1_day_create = Get-ChildItem -Path $dir -Force -Recurse -File -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -gt $day_today } | 
Sort-Object -Descending
Write-Host $1_day_create

  1. Write a Powershell script and a Bash script that:
  • Take your input
  • Check if the input is empty
  • Create a new script (Check if the file exists) that prints out your input and the new script name/full path
  • Execute that new script

Bash

#!/bin/bash

# 3. Write a Powershell script and a Bash script that:
# - Take your input
# - Check if the input is empty
# - Create a new script (Check if the file exists) that prints out your
# input and the new script name/full path
# - Execute that new script

read -p "Type your input: " input

if [[ $input == "" ]]
then 
    echo "Your input is empty | Ending here"
else
    read -p "What script you want to excute, Remember give it to a file: " newscript
    name_newfile=$(echo $newscript | cut -d ">" -f 2 | tr -d " ")
    script=$(echo $newscript | cut -d ">" -f 1)
    if [[ -f $name_newfile ]]
    then
        echo "file really exist !! Ending here"
        exit 1
    else
        echo "The input is : $input"
        pathoffile="$PWD/$name_newfile"
        echo "Name: $name_newfile"
        echo "Fullpath: $pathoffile"
        echo "Script:" > $name_newfile
        echo "$script" >> $name_newfile
        echo "Result: " >> $name_newfile
        # $(<blockcommand>) --> Execuatable 
        command=$($script >> $name_newfile)
        cat $name_newfile
    fi
fi

Powershell

#!/usr/bin/env pwsh

# 3. Write a Powershell script and a Bash script that:
# - Take your input
# - Check if the input is empty
# - Create a new script (Check if the file exists) that prints out your
# input and the new script name/full path
# - Execute that new script

$input = Read-Host -Prompt "Put your input here"
if ($input -eq "")
{
    Write-Host "This is empty !! Do type right again"
}
else
{
    $newscript = Read-Host -Prompt "What is your new script"
    $script, $namefile = ($newscript -split " | ")[0,-1]
    $current_Dir = Get-Location
    $namefile = $namefile.replace(".\", "/")
    $location_file = [string]$current_Dir + [string]$namefile
    if (Test-Path -Path $location_file -PathType Leaf)
    {
        Write-Host "This is existed file | Do type right again"
    }
    else
    {
        Write-Host "Input: " $input
        Write-Host "Name: " $namefile
        Write-Host "FullPath: " $location_file
        #Invoke-Command -ScriptBlock { <blockcommand> }--> Executable ? Really work on terminal but not with script
        #Anotherway: iex $command alias for Invoke-Expression --> It work with source powershell script
        iex $newscript
        Get-Content $location_file
    }
}

  1. Create a text file, and open it by an app. Write a Powershell script and a Bash script that checks which process is opening that file then kill that process

Bash

#!/bin/bash

# 4. Create a text file, and open it by an app. Write a Powershell script
# and a Bash script that checks which process is opening that file then
# kill that process

read -p "what find you want to kill: " filename

command=$(ps -aux | grep nano | grep $filename | cut -d " " -f 3)

echo $command
kill $command

Powershell

#!/usr/bin/env pwsh

# 4. Create a text file, and open it by an app. Write a Powershell script
# and a Bash script that checks which process is opening that file then
# kill that process

$namefile = Read-Host -Prompt "What name of file you want to kill"

$ID = (Get-Process | Select-Object ID,CommandLine | Where-Object CommandLine -EQ "/usr/bin/nano./$namefile").Id
echo $ID
Stop-Process -ID $ID -Force

  1. Write a Powershell script and a Bash script that download a compressed file and then decompress it into a folder

Bash

#!/bin/bash

# 5. Write a Powershell script and a Bash script that download a
# compressed file and then decompress it into a folder

sudo apt install -y unzip

read -p "URL you want to download : " URL

command=$(wget $URL)
file=$(ls | egrep '\.zip')
namefolder=$(echo $file | cut -d "." -f 1)
mkdir $namefolder
command_unzip=$(unzip $file -d $namefolder)
echo $command_unzip

Powershell

#!/usr/bin/env pwsh

# 5. Write a Powershell script and a Bash script that download a
# compressed file and then decompress it into a folder

$URL = Read-Host -prompt "URL you want to download"
$Path = $URL.split("/")[-1]
$Store_Path = $Path.split('.')[0]

Invoke-WebRequest -URI $URL -OutFile $Path

Expand-Archive -Path $Path -Destination $Store_Path

  1. Delete everything in a folder, mute all outputs and continue if any error

Bash

#!/bin/bash

# 6. Delete everything in a folder, mute all outputs and continue if any error

read -p "What the folder you want to delete: " folder

# Run with one command

# if [[ -d $folder ]]
# then
#     command=$(rm -rf $folder)
#     echo "delete complete"
# else
#     echo "This folder is not existed"
# fi


# Run with remove stderr ignore and dev/null
if [[ -d $folder ]]
then 
    for filename in $folder/*
    do
        if [[ -d $filename ]]
        then
            for sub_filename in $filename/*
            do
                rm $sub_filename 2> /dev/null || continue
            done
        rmdir $filename 2> /dev/null || continue
        else
            rm $filename 2> /dev/null || continue
        fi
    done
    rmdir $folder 2> /dev/null || exit 0
fi

Powershell

#!/usr/bin/env pwsh

# 6. Delete everything in a folder, mute all outputs and continue if any error

$folder = Read-Host -prompt "What folder you want to delete"

$current_Dir = Get-Location
$location_file= [string]$current_Dir + "/" + [string]$folder
if (Test-Path -Path $location_file)
{
    Remove-Item $location_file -Force -Confirm:$false
}
else
{
    Write-Host "The folder is not exist "
}


Write a Powershell script and a Bash script that:

  • Count “image” length
  • Print an image name in the image list if the resolution is square

Bash

#!/bin/bash

#- Count “image” length
#- Print an image name in the image list if the resolution is square

image_Length=$(cat image.json | jq '.Image | length')
echo "The image Length: $image_Length"
echo "Name the image is square shape: "
for((i=0;i<$image_Length;i++)); do
    o_hoffset=$(cat image.json | jq '.Image['$i'].hoffset')
    o_woffset=$(cat image.json | jq '.Image['$i'].woffset')
    if [[ $o_hoffset -eq $o_woffset ]]
    then
        echo $(cat image.json | jq '.Image['$i'].name')
    else
        continue
    fi
done

Powershell

#!/usr/bin/env pwsh

#- Count “image” length
#- Print an image name in the image list if the resolution is square

$length_Image = ((Get-Content .\image.json | ConvertFrom-Json).Image).Length
Write-Host "Length of Image in json file is: $length_Image"

$Image_objects = (Get-Content .\image.json | ConvertFrom-Json).Image
($Image_objects | Where-Object {$_.hoffset -eq $_.woffset}).name

  1. Write a Powershell script and a Bash script that check open ports in www.orientsoftware.com

Bash

#!/bin/bash

#8. Write a Powershell script and a Bash script that check open ports in `www.orientsoftware.com`

read -p "What port you want to check to open: " port

for i in $(echo $port | tr " " "\n")
do
  # process
    $(timeout 1 bash -c 'cat < /dev/null > /dev/tcp/www.orientsoftware.com/'$i'')
    if [[ $? -eq 0  ]]
    then
        echo "This port $i is open"
    else
        echo "This port $i is not established by the timeout"
    fi
done

Powershell

#!/usr/bin/env pwsh

#8. Write a Powershell script and a Bash script that check open ports in `www.orientsoftware.com`

$port = Read-Host "What port you want to check in www.orientsoftware.com"
for ($i = 0; $i -lt $port.Split(" ").Length; $i++)
{
    if ((Test-NetConnection -ComputerName www.orientsoftware.com -Port $port.Split(" ")[$i]).TcpTestSucceeded -eq "True")
    {
        Write-Host $port.Split(" ")[$i] "is Open" 
    }
}

  1. Write a Powershell script and a Bash script that enable/disable SSH on a Windows/Linux machine

Bash

#!/bin/bash

# 9. Write a Powershell script and a Bash script that enable/disable SSH on a Windows/Linux machine

read -p "which mode do you want to apply ssh: " ssh_mode

if [[ $ssh_mode = "enable" ]]
then
    command=$(sudo -i systemctl start ssh)
    echo "enable for ssh"
fi
if [[ $ssh_mode = "disable" ]]
then
    command=$(sudo -i systemctl stop ssh)
    echo "stop for ssh"
fi

Powershell

#!/usr/bin/env pwsh

# 9. Write a Powershell script and a Bash script that enable/disable SSH on a Windows/Linux machine

param([switch]$Elevated)

function Test-Admin {
    $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
    $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}

if ((Test-Admin) -eq $false)  {
    if ($elevated) {
        # tried to elevate, did not work, aborting
        exit 1
    } else {
        Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
    }
    exit
}

$mode = Read-Host -prompt "Enable/Disable SSH"
if ($mode -eq "Enable" -or $mode -eq "enable")
{
    Start-Service -name SSDPSRV -force
    Set-Service -name SSDPSRV -StartupType Manual
    Get-Service SSDPSRV
}
if ($mode -eq "Disable" -or $mode -eq "disable")
{
    Stop-Service -name SSDPSRV -force
    Set-Service -name SSDPSRV -StartupType Disabled
    Get-Service SSDPSRV
}

  1. Write a Powershell script and a Bash script that generate a self-signed SSL certificate

Bash

#!/bin/bash

# Write a Powershell script and a Bash script that generate a self-signed SSL certificate
DOMAIN="$1"
if [ -z "$DOMAIN" ]; then
  echo "Usage: $(basename $0) <domain>"
  exit 11
fi

fail_if_error() {
  [ $1 != 0 ] && {
    unset PASSPHRASE
    exit 10
  }
}

# Generate a passphrase
export PASSPHRASE=$(head -c 500 /dev/urandom | tr -dc a-z0-9A-Z | head -c 128; echo)

# Certificate details; replace items in angle brackets with your own info
subj="
C=US
ST=OR
O=Blah
localityName=vietnam
commonName=$DOMAIN
organizationalUnitName=Blah
emailAddress=admin@example.com
"

# Generate the server private key
openssl genrsa -des3 -out $DOMAIN.key -passout env:PASSPHRASE 2048
fail_if_error $?

# Generate the CSR
openssl req \
    -new \
    -batch \
    -subj "$(echo -n "$subj" | tr "\n" "/")" \
    -key $DOMAIN.key \
    -out $DOMAIN.csr \
    -passin env:PASSPHRASE
fail_if_error $?
cp $DOMAIN.key $DOMAIN.key.org
fail_if_error $?

# Strip the password so we don't have to type it every time we restart Apache
openssl rsa -in $DOMAIN.key.org -out $DOMAIN.key -passin env:PASSPHRASE
fail_if_error $?

# Generate the cert (good for 10 years)
openssl x509 -req -days 3650 -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crt
fail_if_error $?

## Read the key below
echo "-----KEY GENERATE----"
cat $DOMAIN.key




Powershell

#!/usr/bin/env pwsh 

# Write a Powershell script and a Bash script that generate a self-signed SSL certificate

param([switch]$Elevated)

function Test-Admin {
    $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
    $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}

if ((Test-Admin) -eq $false)  {
    if ($elevated) {
        # tried to elevate, did not work, aborting
        exit 1
    } else {
        Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
    }
    exit
}

$dns = Read-Host -prompt "What is the name of the domain u want to generate a self-signed SSL certificate"
$location = Read-Host -prompt "Where is the location to store the certificate"

New-SelfSignedCertificate -DnsName $dns -CertStoreLocation $location


Conclusion

Reference

Bash Assign Output of Shell Command To Variable
Using Bash's regular expressions
if-else statement in bash
Basic operators
Bash while loop
How To Check If File or Directory Exists in Bash
How To Convert String To Script Block Using PowerShell
Execuatable Powershell Script with native string
How To Get Detailed Information on Your Server's Processes with PowerShell
Stdin-stdout-stderr in linux
Try&Catch