Pages

Thursday, May 9, 2024

Enhancing PHP Security: Best Practices and Configuration Tips


PHP, as a server-side scripting language, is widely used to create dynamic web pages. However, ensuring the security of PHP applications is crucial to protect against hacking attempts and malware injections. This article discusses essential PHP security practices and configuration tips to enhance the security of your PHP applications.

Viewing PHP Settings: Before diving into security configurations, it's essential to understand how to view PHP settings. One simple way is to create a PHP file with the phpinfo() function and then browse that fie to access the PHP information page
<?php phpinfo(); ?>
Preventing Hacking Attempts:

Disable Functions: PHP provides the disable_functions directive to disable certain functions for security reasons. Common functions like exec, passthru, shell_exec, and others can pose security risks. Ensure to disable them in the php.ini file
disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source

Safe Mode: Safe mode is a security feature designed to prevent PHP scripts from executing commands at the operating system level. To disable safe mode, modify the php.ini file
safe_mode = Off
open_basedir Restriction: Use the open_basedir directive to define the locations from which PHP is allowed to access files. Configure it in WHM (Web Host Manager) to restrict access to specific directories.

Register Globals: Register Globals is an internal PHP setting that can pose security risks by automatically creating variables from input data. It's recommended to disable register globals in the php.ini file
register_globals = off
allow_url_fopen: The allow_url_fopen setting prevents URLs from being used in PHP include() statements, reducing the risk of including malicious code. Disable it in the php.ini 
allow_url_fopen = Off
Magic Quotes: Magic Quotes automatically escape special characters in PHP variables to prevent SQL injection attacks. However, it's deprecated and can lead to security vulnerabilities. Disable it in the php.ini file:
magic_quotes_gpc = Off

Conclusion: Implementing these PHP security best practices and configuration tips can significantly enhance the security of your PHP applications. Regularly review and update your PHP configurations to stay protected against evolving security threats. By prioritizing security measures, you can ensure the integrity and reliability of your PHP-based web applications.

Resolving SAR Error: "Cannot open /var/log/sa/sa08"

System Activity Reporter (SAR) is a powerful tool for monitoring system performance, but encountering errors can be frustrating. One common issue users face after installing SAR is the error message "Cannot open /var/log/sa/sa08: No such file or directory" when attempting to run the sar -q command. In this guide, we'll explore why this error occurs and provide step-by-step instructions to resolve it.

Understanding the Error: When executing sar -q, the system is unable to locate the specified SAR data file sa08. This file should be located in the directory /var/log/sa/. The absence of this file indicates that SAR has not been collecting data properly or has encountered an issue during data collection.

Troubleshooting Steps: Follow these steps to troubleshoot and resolve the SAR error:

Check SAR Installation: Ensure that SAR is installed correctly on your system. If not, install it using your package manager.


Verify SAR Data Collection: Confirm whether SAR is actively collecting system activity data. SAR typically collects data at regular intervals and stores it in the /var/log/sa/ directory. Use the command sar -q to check if the data file sa08 exists.


Check Cron Service: SAR relies on the cron service to schedule data collection. Check if the cron service is running by executing

/etc/init.d/crond status
If the service is not running, restart it using

/etc/init.d/crond restart
Restart syslog Service: SAR also depends on the syslog service for logging. Restart the syslog service to ensure proper functioning

/etc/init.d/syslog restart
Verify Data Collection Intervals: SAR collects data at regular intervals defined by cron jobs. Review the cron configuration to ensure that SAR cron jobs are configured correctly and running as expected.


Check File Permissions: Ensure that the /var/log/sa/ directory and SAR data files have appropriate permissions for SAR to read and write data. Correct any permission issues if found.

Conclusion: By following these troubleshooting steps, you can resolve the SAR error "Cannot open /var/log/sa/sa08: No such file or directory" and ensure that SAR functions properly for system performance monitoring. Regular monitoring with SAR is essential for identifying performance bottlenecks and optimizing system resources effectively.

Roundcube-Horde-Squirrelmail

In the digital era, seamless email functionality is essential for maintaining efficient business communications. Unfortunately, issues with email delivery, such as emails not sending or receiving, can significantly disrupt operations. This post delves into common problems experienced with cPanel's email services and provides a comprehensive guide to troubleshooting and resolving these issues. Whether you're a system administrator or a cPanel user, understanding how to address these challenges swiftly and effectively is crucial to minimize downtime and maintain robust communication channels

1. Verify Roundcube Configuration:Edit the Configuration:Open the main Roundcube configuration file

vi /usr/local/cpanel/base/3rdparty/roundcube/config/main.inc.php

Locate the line $rcmail_config['smtp_user'] = '%u'; and change it to

$rcmail_config['smtp_user'] = '';


2. Check CSF Configuration:Edit CSF Configuration:Check the CSF (ConfigServer Security & Firewall) configuration file for the following entries

SMTP_BLOCK = "1" SMTP_ALLOWLOCAL = "1"

If the value of SMTP_BLOCK is 0, change it to 1 and restart CSF.

3. Update cPanel:Upgrade cPanel:To update cPanel to the latest stable version,

/scripts/upcp --force


4. Increase PHP Memory Limit:Edit php.ini:Increase the memory_limit in the PHP configuration file located at

/usr/local/cpanel/base/3rdparty/roundcube/php.ini


5. Reinstall Roundcube:Update Roundcube Installation:Follow these steps to update and reset Roundcube

/usr/local/cpanel/bin/update-roundcube --force

If needed, manually reinstall Roundcube

/usr/local/cpanel/install/webmail /usr/local/cpanel/bin/update-roundcube


6. Reset the Roundcube Database:Rebuild the Roundcube Database:Drop and recreate the database

mysql -u root -p -e "DROP DATABASE roundcube; CREATE DATABASE roundcube;"

Restore the Roundcube database schema

mysql -u root -p roundcube < /usr/local/cpanel/base/3rdparty/roundcube/SQL/mysql.initial.sql


7. Update Database Credentials:Edit Database Configuration:Open db.inc.php to check and update the database connection details

vi /usr/local/cpanel/base/3rdparty/roundcube/config/db.inc.php

Ensure it contains the correct database credentials

mysql://root:YOUR_ROOT_PASSWORD@localhost/roundcube


8. Repair Roundcube Tables:Use phpMyAdmin:In phpMyAdmin, select the Roundcube database and repair all tables.

9. Reset MySQL Root Password:Update MySQL Credentials:Use WHM to reset the MySQL root password to ensure the configuration is accurate.

10. Full Horde Reset:Reset Horde:To reset the Horde webmail application:bash

/scripts/fullhordereset

Repair the Horde session handler table

mysql -u root -p horde -e "REPAIR TABLE horde_sessionhandler;"


11. Update Horde and SquirrelMail:Update Horde

/usr/local/cpanel/bin/update-horde --force

Update SquirrelMail

/usr/local/cpanel/bin/update-squirrelmail --force


Resolving email delivery issues in cPanel can seem daunting, but with the right approach, it is manageable. By systematically troubleshooting, from verifying configuration files to resetting key components, you can restore email functionality and ensure that your communication systems run smoothly. The steps outlined here serve as a blueprint to tackle common email problems in cPanel. Remember, regular maintenance and updates are key to preventing such issues from arising in the first place, keeping your email systems operational and your business communications uninterrupted.

Sunday, May 5, 2024

Resolving Email Sending and Receiving Issues in cPanel with a ClamAV Update

Introduction:

Email communication is fundamental in today's business landscape. However, disruptions in email services can occur, leading to significant communication breakdowns. This blog post explains a common issue encountered in cPanel related to email delivery and the steps we took to resolve it using the "Force ClamAV Update" feature in WHM's “ConfigServer MailScanner FE”.

The Challenge: Suddenly, our organization faced an email outage where neither incoming nor outgoing emails were being processed. This issue caused delays and affected our daily operations, emphasizing the need for a swift solution.

Diagnosing the Issue: Upon discovering the email delivery problem, our technical team immediately began troubleshooting. We checked the email queue and server logs in cPanel but didn't find any obvious errors. We suspected the issue might involve the email scanning tool integrated into our server—specifically ClamAV, a popular antivirus engine used to scan incoming and outgoing emails for threats.

Implementing the Solution: To address potential issues with ClamAV:

  1. We logged into the WHM (WebHost Manager).
  2. Navigated to “ConfigServer MailScanner FE” under the plugins section.
  3. Clicked on “Force ClamAV Update” to manually update the antivirus definitions.

Results: Shortly after updating ClamAV, the email functionality returned to normal. This indicated that the issue was likely due to outdated or corrupted antivirus definitions that interfered with email processing.

Why This Solution Worked: The "Force ClamAV Update" effectively refreshes ClamAV's database, ensuring that all email scans use the latest definitions. This is crucial because outdated definitions can lead to false positives or failures in properly scanning emails, which in turn can block legitimate emails from being sent or received.

Preventative Measures: To prevent similar issues in the future, consider the following steps:

  • Regular Monitoring: Keep an eye on the email system’s performance and logs for any unusual activity.
  • Scheduled Updates: Set automatic updates for ClamAV and other critical software to ensure all components are current.
  • Training: Educate your technical team on recognizing and resolving email delivery issues quickly and efficiently.

Conclusion: Email disruptions can cripple business operations, but many issues are manageable with the right tools and a proactive approach. The "Force ClamAV Update" feature in WHM's “ConfigServer MailScanner FE” is a vital tool for maintaining the integrity and functionality of your email systems. By sharing this solution, we hope to assist others in swiftly resolving similar email delivery challenges.

Resetting the Root Password in Rescue Mode: A Step-by-Step Guide

In critical situations where access to your server's root account is lost or compromised, resetting the root password becomes essential for restoring control over your system. This guide provides a comprehensive walkthrough of resetting the root password in rescue mode, ensuring you regain access to your server without data loss or downtime.

Losing access to the root account on a server can be a daunting scenario, but with the right approach, it's possible to regain control swiftly and securely. In this guide, we'll walk you through the step-by-step process of resetting the root password using rescue mode, a powerful tool that allows you to access and modify your server's filesystem even when it's unable to boot normally.

Step 1: Logging in to Rescue Mode Firstly, access your server through SSH console in rescue mode. This specialized mode provides a safe environment for performing critical operations on your server's filesystem.

Step 2: Identifying the Disk Partition Once logged in, use the fdisk -l command to list all disk partitions and identify the correct one where your root filesystem is located. Typically, this will be indicated by the size of the disk.

Step 3: Mounting the Disk Partition With the correct partition identified, mount it to a temporary directory using the mount /dev/xvda1 /mnt command, replacing /dev/xvda1 with the appropriate partition name.

Step 4: Entering the Mounted Filesystem If the chroot /mnt command doesn't work, try chroot /mnt /bin/bash to enter the mounted filesystem environment, allowing you to execute commands as if you were operating from the root directory.

Step 5: Resetting the Root Password Once inside the mounted filesystem, use the passwd root command to set a new password for the root account. Follow the prompts to enter and confirm the new password securely.

Step 6: Exiting the Chroot Environment After resetting the root password, exit the chroot environment by typing exit in the terminal, returning you to the rescue mode shell.

Step 7: Unmounting the Temporary Partition To finalize the process, unmount the temporary partition with the umount /mnt command, ensuring all changes are properly applied.

Step 8: Rebooting the Server Finally, reboot your server using the reboot command to apply the changes and allow the system to boot normally.

By following this step-by-step guide, you can confidently reset the root password in rescue mode, enabling you to regain control over your server and resume normal operations swiftly and securely. Remember to exercise caution and verify each step carefully to avoid unintended consequences.

Friday, April 26, 2024

Bash Shell Scripting

These tutorials cover various aspects of bash shell scripting, starting with basic script creation and execution, then progressing to more advanced topics such as variables, loops, conditional statements, quoting, arithmetic operations, and file redirections. Each section provides practical examples and explanations to help beginners understand and apply bash scripting concepts effectively.

1. Hello bourne - Bash Shell Scripting
First you need to find out where is your bash interpreter located. Enter the following into your command line:
$ which bash

bash interpreter location:
/bin/bash
Open up you favorite text editor and a create file called hello_BOURNE.sh. Insert the following lines to a file:
NOTE:Every bash shell script in this tutorial starts with shebang:"#!" which is not read as a comment. First line is also a place where you put your interpreter which is in this case: /bin/bash.
Here is our first bash shell script example:

#!/bin/bash
# declare STRING variable
STRING="Hello bourne"
#print variable on a screen
echo $STRING


Navigate to a directory where your hello_bourne.sh is located and make the file executable:

$ chmod +x hello_bourne.sh


Make bash shell script executable
Now you are ready to execute your first bash script:


./hello_bourne.sh


Example of simple bash shell script


2. Simple Backup bash shell script

#!/bin/bash
tar -czf myhome_directory.tar.gz /home/linuxconfig


Simple Backup bash script

3. Variables
In this example we declare simple bash variable and print it on the screen ( stdout ) with echo command.
#!/bin/bash
STRING="HELLO BOURNE!!!"
echo $STRING
Bash string Variables in bash script

Your backup script and variables:
#!/bin/bash
OF=myhome_directory_$(date +%Y%m%d).tar.gz
tar -czf $OF /home/linuxconfig
Bash backup Script with bash Variables

3.1. Global vs. Local variables
#!/bin/bash
#Define bash global variable
#This variable is global and can be used anywhere in this bash script
VAR="global variable"
function bash {
#Define bash local variable
#This variable is local to bash function only
local VAR="local variable"
echo $VAR
}
echo $VAR
bash
# Note the bash global variable did not change
# "local" is bash reserved word
echo $VAR
Global vs. Local Bash variables in bash script

4. Passing arguments to the bash script
#!/bin/bash
# use predefined variables to access passed arguments
#echo arguments to the shell
echo $1 $2 $3 ' -> echo $1 $2 $3'

# We can also store arguments from bash command line in special array
args=("$@")
#echo arguments to the shell
echo ${args[0]} ${args[1]} ${args[2]} ' -> args=("$@"); echo ${args[0]} ${args[1]} ${args[2]}'

#use $@ to print out all arguments at once
echo $@ ' -> echo $@'

# use $# variable to print out
# number of arguments passed to the bash script
echo Number of arguments passed: $# ' -> echo Number of arguments passed: $#'

/arguments.sh Bash Scripting Tutorial

Passing arguments to the bash script
5. Executing shell commands with bash

#!/bin/bash
# use backticks " ` ` " to execute shell command
echo `uname -o`
# executing bash command without backticks
echo uname -o
Executing shell commands with bash

6. Reading User Input
#!/bin/bash
echo -e "Hi, please type the word: \c "
read word
echo "The word you entered is: $word"
echo -e "Can you please enter two words? "
read word1 word2
echo "Here is your input: \"$word1\" \"$word2\""
echo -e "How do you feel about bash scripting? "
# read command now stores a reply into the default build-in variable $REPLY
read
echo "You said $REPLY, I'm glad to hear that! "
echo -e "What are your favorite colours ? "
# -a makes read command to read into an array
read -a colours
echo "My favorite colours are also ${colours[0]}, ${colours[1]} and ${colours[2]}:-)"

Reading User Input with bash
7. Bash Trap Command
#!/bin/bash
# bash trap command
trap bashtrap INT
# bash clear screen command
clear;
# bash trap function is executed when CTRL-C is pressed:
# bash prints message => Executing bash trap subrutine !
bashtrap()
{
echo "CTRL+C Detected !...executing bash trap !"
}
# for loop from 1/10 to 10/10
for a in `seq 1 10`; do
echo "$a/10 to Exit."
sleep 1;
done
echo "Exit Bash Trap Example!!!"

8. Arrays


8.1. Declare simple bash array

#!/bin/bash
#Declare array with 4 elements
ARRAY=( 'Debian Linux' 'Redhat Linux' Ubuntu Linux )
# get number of elements in the array
ELEMENTS=${#ARRAY[@]}

# echo each element in array
# for loop
for (( i=0;i<$ELEMENTS;i++)); do
echo ${ARRAY[${i}]}
done
Declare simple bash array

8.2. Read file into bash array

#!/bin/bash
# Declare array
declare -a ARRAY
# Link filedescriptor 10 with stdin
exec 10<&0
# stdin replaced with a file supplied as a first argument
exec < $1
let count=0

while read LINE; do

ARRAY[$count]=$LINE
((count++))
done

echo Number of elements: ${#ARRAY[@]}
# echo array's content
echo ${ARRAY[@]}
# restore stdin from filedescriptor 10
# and close filedescriptor 10
exec 0<&10 10<&-

Bash script execution with an output:
linuxconfig.org $ cat bash.txt
Bash
Scripting
Tutorial
Guide

linuxconfig.org $ ./bash-script.sh bash.txt
Number of elements: 4
Bash Scripting Tutorial Guide
linuxconfig.org $

9. Bash if / else / fi statements

9.1. Simple Bash if/else statement

Please note the spacing inside the [ and ] brackets! Without the spaces, it won't work!
#!/bin/bash
directory="./BashScripting"

# bash check if directory exists
if [ -d $directory ]; then
echo "Directory exists"
else
echo "Directory does not exists" 
fi
Bash if else fi statement

9.2. Nested if/else

#!/bin/bash
# Declare variable choice and assign value 4
choice=4
# Print to stdout
echo "1. Bash"
echo "2. Scripting"
echo "3. Tutorial"
echo -n "Please choose a word [1,2 or 3]? "
# Loop while the variable choice is equal 4
# bash while loop
while [ $choice -eq 4 ]; do

# read user input
read choice
# bash nested if/else
if [ $choice -eq 1 ] ; then

echo "You have chosen word: Bash"

else

if [ $choice -eq 2 ] ; then
echo "You have chosen word: Scripting"
else

if [ $choice -eq 3 ] ; then
echo "You have chosen word: Tutorial"
else
echo "Please make a choice between 1-3 !"
echo "1. Bash"
echo "2. Scripting"
echo "3. Tutorial"
echo -n "Please choose a word [1,2 or 3]? "
choice=4
fi
fi
fi
done

10. Bash Comparisons

10.1. Arithmetic Comparisons

-lt <
-gt >
-le <=
-ge >=
-eq ==
-ne !=


#!/bin/bash
# declare integers
NUM1=2
NUM2=2
if [ $NUM1 -eq $NUM2 ]; then
echo "Both Values are equal"
else
echo "Values are NOT equal"
fi
Bash Arithmetic Comparisons - values are NOT equal


#!/bin/bash
# declare integers
NUM1=2
NUM2=1
if [ $NUM1 -eq $NUM2 ]; then
echo "Both Values are equal"
elif [ $NUM1 -gt $NUM2 ]; then
echo "NUM1 is greater then NUM2"
else
echo "NUM2 is greater then NUM1"
fi



Bash Arithmetic Comparisons - greater then

10.2. String Comparisons

= equal
!= not equal
< less then
> greater then
-n s1 string s1 is not empty
-z s1 string s1 is empty


#!/bin/bash
#Declare string S1
S1="Bash"
#Declare string S2
S2="Scripting"
if [ $S1 = $S2 ]; then
echo "Both Strings are equal"
else
echo "Strings are NOT equal"
fi
Bash String Comparisons - values are NOT equal

#!/bin/bash
#Declare string S1
S1="Bash"
#Declare string S2
S2="Bash"
if [ $S1 = $S2 ]; then
echo "Both Strings are equal"
else
echo "Strings are NOT equal"
fi
bash interpreter location: /bin/bash

11. Bash File Testing

-b filename Block special file
-c filename Special character file
-d directoryname Check for directory existence
-e filename Check for file existence
-f filename Check for regular file existence not a directory
-G filename Check if file exists and is owned by effective group ID.
-g filename true if file exists and is set-group-id.
-k filename Sticky bit
-L filename Symbolic link
-O filename True if file exists and is owned by the effective user id.
-r filename Check if file is a readable
-S filename Check if file is socket
-s filename Check if file is nonzero size
-u filename Check if file set-ser-id bit is set
-w filename Check if file is writable
-x filename Check if file is executable

#!/bin/bash
file="./file"
if [ -e $file ]; then
echo "File exists"
else
echo "File does not exists"
fi
Bash File Testing - File does not exist Bash File Testing - File exists

Similarly for example we can use while loop to check if file does not exists. This script will sleep until file does exists. Note bash negator "!" which negates the -e option.
#!/bin/bash

while [ ! -e myfile ]; do
# Sleep until file does exists/is created
sleep 1
done

12. Loops

12.1. Bash for loop


#!/bin/bash

# bash for loop
for f in $( ls /var/ ); do
echo $f
done


Running for loop from bash shell command line:
$ for f in $( ls /var/ ); do echo $f; done

Bash for loop

12.2. Bash while loop

#!/bin/bash
COUNT=6
# bash while loop
while [ $COUNT -gt 0 ]; do
echo Value of count is: $COUNT
let COUNT=COUNT-1
done




Bash while loop

12.3. Bash until loop

#!/bin/bash
COUNT=0
# bash until loop
until [ $COUNT -gt 5 ]; do
echo Value of count is: $COUNT
let COUNT=COUNT+1
done




Bash until loop

12.4. Control bash loop with
Here is a example of while loop controlled by standard input. Until the redirection chain from STDOUT to STDIN to the read command exists the while loop continues.
#!/bin/bash
# This bash script will locate and replace spaces
# in the filenames
DIR="."
# Controlling a loop with bash read command by redirecting STDOUT as
# a STDIN to while loop
# find will not truncate filenames containing spaces
find $DIR -type f | while read file; do
# using POSIX class [:space:] to find space in the filename
if [[ "$file" = *[[:space:]]* ]]; then
# substitute space with "_" character and consequently rename the file
mv "$file" `echo $file | tr ' ' '_'`
fi;
# end of while loop
done




Bash script to replace spaces in the filenames with _

13. Bash Functions

!/bin/bash
# BASH FUNCTIONS CAN BE DECLARED IN ANY ORDER
function function_B {
echo Function B.
}
function function_A {
echo $1
}
function function_D {
echo Function D.
}
function function_C {
echo $1
}
# FUNCTION CALLS
# Pass parameter to function A
function_A "Function A."
function_B
# Pass parameter to function C
function_C "Function C."
function_D




Bash Functions

14. Bash Select

#!/bin/bash

PS3='Choose one word: '

# bash select
select word in "linux" "bash" "scripting" "tutorial"
do
echo "The word you have selected is: $word"
# Break, otherwise endless loop
break
done

exit 0




Bash Select

15. Case statement conditional

#!/bin/bash
echo "What is your preferred programming / scripting language"
echo "1) bash"
echo "2) perl"
echo "3) phyton"
echo "4) c++"
echo "5) I do not know !"
read case;
#simple case bash structure
# note in this case $case is variable and does not have to
# be named case this is just an example
case $case in
1) echo "You selected bash";;
2) echo "You selected perl";;
3) echo "You selected phyton";;
4) echo "You selected c++";;
5) exit
esac




bash case statement conditiona

16. Bash quotes and quotations
Quotations and quotes are important part of bash and bash scripting. Here are some bash quotes and quotations basics.

16.1. Escaping Meta characters
Before we start with quotes and quotations we should know something about escaping meta characters. Escaping will suppress a special meaning of meta characters and therefore meta characters will be read by bash literally. To do this we need to use backslash "\" character. Example:
#!/bin/bash

#Declare bash string variable
BASH_VAR="Bash Script"

# echo variable BASH_VAR
echo $BASH_VAR

#when meta character such us "$" is escaped with "\" it will be read literally
echo \$BASH_VAR

# backslash has also special meaning and it can be suppressed with yet another "\"
echo "\\"



escaping meta characters in bash

16.2. Single quotes
Single quotes in bash will suppress special meaning of every meta characters. Therefore meta characters will be read literally. It is not possible to use another single quote within two single quotes not even if the single quote is escaped by backslash.
#!/bin/bash

#Declare bash string variable
BASH_VAR="Bash Script"

# echo variable BASH_VAR
echo $BASH_VAR

# meta characters special meaning in bash is suppressed when using single quotes
echo '$BASH_VAR "$BASH_VAR"'




Using single quotes in bash

16.3. Double Quotes
Double quotes in bash will suppress special meaning of every meta characters except "$", "\" and "`". Any other meta characters will be read literally. It is also possible to use single quote within double quotes. If we need to use double quotes within double quotes bash can read them literally when escaping them with "\". Example:
#!/bin/bash

#Declare bash string variable
BASH_VAR="Bash Script"

# echo variable BASH_VAR
echo $BASH_VAR

# meta characters and its special meaning in bash is
# suppressed when using double quotes except "$", "\" and "`"

echo "It's $BASH_VAR and \"$BASH_VAR\" using backticks: `date`"



Using double quotes in bash

16.4. Bash quoting with ANSI-C style
There is also another type of quoting and that is ANSI-C. In this type of quoting characters escaped with "\" will gain special meaning according to the ANSI-C standard.








































\a alert (bell) \b backspace
\e an escape character \f form feed
\n newline \r carriage return
\t horizontal tab \v vertical tab
\\ backslash \` single quote
\nnn octal value of characters ( see [http://www.asciitable.com/ ASCII table] ) \xnn hexadecimal value of characters ( see [http://www.asciitable.com/ ASCII table] )

The syntax fo ansi-c bash quoting is: $'' . Here is an example:
#!/bin/bash

# as a example we have used \n as a new line, \x40 is hex value for @
# and \56 is octal value for .
echo $'web: www.linuxconfig.org\nemail: web\x40linuxconfig\56org'




quoting in bash with ansi-c stype

17. Arithmetic Operations


17.1. Bash Addition Calculator Example

#!/bin/bash

let RESULT1=$1+$2
echo $1+$2=$RESULT1 ' -> # let RESULT1=$1+$2'
declare -i RESULT2
RESULT2=$1+$2
echo $1+$2=$RESULT2 ' -> # declare -i RESULT2; RESULT2=$1+$2'
echo $1+$2=$(($1 + $2)) ' -> # $(($1 + $2))'




Bash Addition Calculator

17.2. Bash Arithmetics

#!/bin/bash

echo '### let ###'
# bash addition
let ADDITION=3+5
echo "3 + 5 =" $ADDITION

# bash subtraction
let SUBTRACTION=7-8
echo "7 - 8 =" $SUBTRACTION

# bash multiplication
let MULTIPLICATION=5*8
echo "5 * 8 =" $MULTIPLICATION

# bash division
let DIVISION=4/2
echo "4 / 2 =" $DIVISION

# bash modulus
let MODULUS=9%4
echo "9 % 4 =" $MODULUS

# bash power of two
let POWEROFTWO=2**2
echo "2 ^ 2 =" $POWEROFTWO

echo '### Bash Arithmetic Expansion ###'
# There are two formats for arithmetic expansion: $[ expression ]
# and $(( expression #)) its your choice which you use

echo 4 + 5 = $((4 + 5))
echo 7 - 7 = $[ 7 - 7 ]
echo 4 x 6 = $((3 * 2))
echo 6 / 3 = $((6 / 3))
echo 8 % 7 = $((8 % 7))
echo 2 ^ 8 = $[ 2 ** 8 ]

echo '### Declare ###'

echo -e "Please enter two numbers \c"
# read user input
read num1 num2
declare -i result
result=$num1+$num2
echo "Result is:$result "

# bash convert binary number 10001
result=2#10001
echo $result

# bash convert octal number 16
result=8#16
echo $result

# bash convert hex number 0xE6A
result=16#E6A
echo $result




Bash Arithmetic Operations

17.3. Round floating point number

#!/bin/bash
# get floating point number
floating_point_number=3.3446
echo $floating_point_number
# round floating point number with bash
for bash_rounded_number in $(printf %.0f $floating_point_number); do
echo "Rounded number with bash:" $bash_rounded_number
done




Round floating point number with bash

17.4. Bash floating point calculations

#!/bin/bash
# Simple linux bash calculator
echo "Enter input:"
read userinput
echo "Result with 2 digits after decimal point:"
echo "scale=2; ${userinput}" | bc
echo "Result with 10 digits after decimal point:"
echo "scale=10; ${userinput}" | bc
echo "Result as rounded integer:"
echo $userinput | bc


Bash floating point calculations

18. Redirections


18.1. STDOUT from bash script to STDERR

#!/bin/bash

echo "Redirect this STDOUT to STDERR" 1>&2

To prove that STDOUT is redirected to STDERR we can redirect script's output to file:


STDOUT from bash script to STDERR

18.2. STDERR from bash script to STDOUT

#!/bin/bash

cat $1 2>&1

To prove that STDERR is redirected to STDOUT we can redirect script's output to file:


STDERR from bash script to STDOUT

18.3. stdout to screen
The simple way to redirect a standard output ( stdout ) is to simply use any command, because by default stdout is automatically redirected to screen. First create a file "file1":
$ touch file1
$ ls file1
file1


As you can see from the example above execution of ls command produces STDOUT which by default is redirected to screen.

18.4. stdout to file
The override the default behavior of STDOUT we can use ">" to redirect this output to file:
$ ls file1 > STDOUT
$ cat STDOUT
file1




18.5. stderr to file
By default STDERR is displayed on the screen:
$ ls
file1 STDOUT
$ ls file2
ls: cannot access file2: No such file or directory


In the following example we will redirect the standard error ( stderr ) to a file and stdout to a screen as default. Please note that STDOUT is displayed on the screen, however STDERR is redirected to a file called STDERR:

$ ls
file1 STDOUT
$ ls file1 file2 2> STDERR
file1
$ cat STDERR
ls: cannot access file2: No such file or directory




18.6. stdout to stderr
It is also possible to redirect STDOUT and STDERR to the same file. In the next example we will redirect STDOUT to the same descriptor as STDERR. Both STDOUT and STDERR will be redirected to file "STDERR_STDOUT".

$ ls
file1 STDERR STDOUT
$ ls file1 file2 2> STDERR_STDOUT 1>&2
$ cat STDERR_STDOUT
ls: cannot access file2: No such file or directory
file1



File STDERR_STDOUT now contains STDOUT and STDERR.

18.7. stderr to stdout
The above example can be reversed by redirecting STDERR to the same descriptor as SDTOUT:

$ ls
file1 STDERR STDOUT
$ ls file1 file2 > STDERR_STDOUT 2>&1
$ cat STDERR_STDOUT
ls: cannot access file2: No such file or directory
file1




18.8. stderr and stdout to file
Previous two examples redirected both STDOUT and STDERR to a file. Another way to achieve the same effect is illustrated below:

$ ls
file1 STDERR STDOUT
$ ls file1 file2 &> STDERR_STDOUT
$ cat STDERR_STDOUT
ls: cannot access file2: No such file or directory
file1



or

$ ls file1 file2 >& STDERR_STDOUT
$ cat STDERR_STDOUT
ls: cannot access file2: No such file or directory
file1

fsck--Mount partition using alternate superblock

To mount a partition using an alternate superblock, first, use dumpe2fs to find the superblock locations. Then, check and repair the filesystem with fsck using the -b option to specify the alternate superblock location if needed. Once repaired, mount the partition using the mount command. Access the filesystem, navigate to the mounted partition, and verify its contents. Lastly, ensure to regularly backup important data to prevent any potential data loss.

Find out the superblock location for /dev/sda2:
# dumpe2fs /dev/sda2 | grep superblock

Sample output:

Primary superblock at 0, Group descriptors at 1-6
Backup superblock at 32768, Group descriptors at 32769-32774
Backup superblock at 98304, Group descriptors at 98305-98310
Backup superblock at 163840, Group descriptors at 163841-163846
Backup superblock at 229376, Group descriptors at 229377-229382
Backup superblock at 294912, Group descriptors at 294913-294918
Backup superblock at 819200, Group descriptors at 819201-819206
Backup superblock at 884736, Group descriptors at 884737-884742
Backup superblock at 1605632, Group descriptors at 1605633-1605638
Backup superblock at 2654208, Group descriptors at 2654209-2654214
Backup superblock at 4096000, Group descriptors at 4096001-4096006
Backup superblock at 7962624, Group descriptors at 7962625-7962630
Backup superblock at 11239424, Group descriptors at 11239425-11239430
Backup superblock at 20480000, Group descriptors at 20480001-20480006
Backup superblock at 23887872, Group descriptors at 23887873-23887878

Now check and repair a Linux file system using alternate superblock # 32768:
# fsck -b 32768 /dev/sda2

Sample output:

fsck 1.40.2 (12-Jul-2007)
e2fsck 1.40.2 (12-Jul-2007)
/dev/sda2 was not cleanly unmounted, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Free blocks count wrong for group #241 (32254, counted=32253).
Fix? yes
Free blocks count wrong for group #362 (32254, counted=32248).
Fix? yes
Free blocks count wrong for group #368 (32254, counted=27774).
Fix? yes
..........
/dev/sda2: ***** FILE SYSTEM WAS MODIFIED *****

/dev/sda2: 59586/30539776 files (0.6% non-contiguous), 3604682/61059048 blocks

Now try to mount file system using mount command:
# mount /dev/sda2 /mnt


You can also use superblock stored at 32768 to mount partition, enter:
# mount sb={alternative-superblock} /dev/device /mnt
# mount sb=32768 /dev/sda2 /mnt


Try to browse and access file system:
# cd /mnt
# mkdir test
# ls -l
# cp file /path/to/safe/location

You should always keep backup of all important data including configuration files