# 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](https://drive.google.com/file/d/1XLLCjB0pePB8lguirKABN0hf7kU0ElKx/view?usp=sharing) ## 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" } ``` --- 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 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 ``` --- 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 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 } } ``` --- 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 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 ``` --- 5. 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 ``` --- 6. 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 " } ``` --- 7. ![](https://i.imgur.com/Un5Eapo.png) 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 ``` --- 8. 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" } } ``` --- 9. 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 } ``` --- 10. 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 ``` ![](https://i.imgur.com/SJFOxCF.png) ![](https://i.imgur.com/BaBKkEV.png) ![](https://i.imgur.com/7p2Lc7w.png) 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 ``` ![](https://i.imgur.com/W9GP8ua.png) ![](https://i.imgur.com/H2YYFqC.png) ## Conclusion ## Reference [Bash Assign Output of Shell Command To Variable](https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/) [Using Bash's regular expressions](https://www.networkworld.com/article/2693361/unix-tip-using-bash-s-regular-expressions.html) [if-else statement in bash](https://ryanstutorials.net/bash-scripting-tutorial/bash-if-statements.php) [Basic operators](https://www.geeksforgeeks.org/basic-operators-in-shell-scripting/) [Bash while loop](https://www.cyberciti.biz/faq/bash-while-loop/) [How To Check If File or Directory Exists in Bash](https://devconnected.com/how-to-check-if-file-or-directory-exists-in-bash/#:~:text=your%20Bash%20shell.-,In%20order%20to%20check%20if%20a%20file%20exists%20in%20Bash,echo%20%22This%20file%20exists!%22&text=%5B%5B%20%2Df%20%2Fetc%2Fpasswd,echo%20%22This%20file%20exists!%22) [How To Convert String To Script Block Using PowerShell](https://www.improvescripting.com/how-to-convert-string-to-script-block-using-powershell/) [Execuatable Powershell Script with native string](https://stackoverflow.com/questions/6338015/how-do-you-execute-an-arbitrary-native-command-from-a-string) [How To Get Detailed Information on Your Server's Processes with PowerShell](https://redmondmag.com/articles/2016/11/17/get-info-on-server-processes.aspx) [Stdin-stdout-stderr in linux](https://khaidantri.net/stdin-stdout-va-stderr-tren-linux-la-gi) [Try&Catch](https://stackoverflow.com/questions/22009364/is-there-a-try-catch-command-in-bash)