====== Some useful bash snippets: ======
:!: If you declare variables, use lower case names!
===== Using math =====
expr 30 + 10 # 30 + 10
expr 30 - 10 # 30 - 10
expr 30 / 10 # 30 / 10
expr 30 \* 4 # 30 x 4, needs escape!
===== Checking if file exists: =====
if [[ -f ~/.ssh/id_rsa ]]
then
echo "id_rsa exists"
else
echo "id_rsa does not exist"
fi
===== Checking if directory exists: =====
if [[ -d ~/.ssh/ ]]
then
echo "directory .ssh exists"
else
echo "directory .ssh does not exist"
fi
===== Checking if variable equals 200 =====
num = 200
if [[ $num -eq 200 ]]
then
echo "$num equals 200"
else
echo "$num does not equal 200"
fi
===== Ask for variable input: =====
# Read Password
echo -n Password:
read -s password
echo
# Run Command
echo $password
===== Ecnrypting / Decrypting file: =====
A useful tool for encrypting/decrypting files is //ccrypt//. Using this you can make use of //git// containing things like SSH keys:
apt-get install ccrypt -y #install ccrypt
ccencrypt ~/.ssh/id_rsa* #encrypt private key
ccdecrypt id_rsa.cpt -P "Enter password to decrypt file: " #decrypt private key
mv id_rsa ~/.ssh/ && chown -R user: ~/.ssh #move private key and set ownership
chmod 600 ~/.ssh/id_rsa #set private key permissions
===== Install a list of programs: =====
progs=(
mc
iotop
htop
tmux
wget
ccrypt
openssh-server
)
for program in "${progs[@]}"; do
if ! command -v "$program" >/dev/null 2>&1; then
apt-get install "$program" -y
fi
done
===== A simple menu (ssh): =====
#!/bin/bash
clear
echo """
##################################################################################################
# #
# Welcome to sshmenu #
# #
# Which server would you like to connect to? #
# #
# 1) wekan (kanban) #
# 2) wiki #
# 3) nextcloud #
# 4) dockervm1 #
# 5) dockertestvm #
# #
##################################################################################################
input number:
"""
read -s server
echo $server
sleep 1
if [ $server = "1" ]; then
clear
echo "Setting up connection to wekan server..."
sleep 2
ssh 192.168.1.118
elif [ $server = "2" ]; then
clear
echo "Setting up connection to wiki server..."
sleep 2
ssh 192.168.1.117
elif [ $server = "3" ]; then
clear
echo "Setting up connection to nextcloud server..."
sleep 2
ssh 192.168.1.119
elif [ $server = "4" ]; then
clear
echo "Setting up connection to dockervm1 server..."
sleep 2
ssh 192.168.1.116
elif [ $server = "5" ]; then
clear
echo "Setting up connection to dockertestvm server..."
sleep 2
ssh 192.168.1.120
else
echo "Incorrect choice, programm will now terminate..."
sleep 3
clear
exit
fi
clear
exit
===== Conditional while loop: =====
if [ ! -f /usr/bin/zsh ]
then
while true; do
read -p "Would you like to install 'zsh'? (y/n) " yn
case $yn in
[Yy]* ) echo "OK, installing zsh...";
while read program; do
sudo apt install -y "$program"
done
===== Replace all files in a directory with empty files with the same name =====
#!/bin/bash
# Get the directory path
echo "Enter the path to the directory: "
read dir_path
# Check if the directory exists
if [ ! -d "$dir_path" ]; then
echo "Error: Directory does not exist."
exit 1
fi
# Replace all files in the directory with empty files
for file in "$dir_path"/*; do
if [ -f "$file" ]; then
> "$file"
fi
done
echo "All files in the directory have been replaced with empty files."
===== Find SSH logins =====
:!: This script assumes that you have the sshpass package installed on your system. You can install it with the following command: sudo apt-get install sshpass (for Ubuntu) or brew install http://macappstore.org/sshpass/ (for macOS).
#!/bin/bash
servers_file="servers"
users_file="users"
passwords_file="passwords"
logins_file="logins.txt"
# Check if the input files exist
if [ ! -f "$servers_file" ] || [ ! -f "$users_file" ] || [ ! -f "$passwords_file" ]; then
echo "Error: One or more of the input files do not exist."
exit 1
fi
# Read the servers, users, and passwords into arrays
servers=($(cat "$servers_file"))
users=($(cat "$users_file"))
passwords=($(cat "$passwords_file"))
# Loop through all combinations of servers, users, and passwords
for server in "${servers[@]}"; do
for user in "${users[@]}"; do
for password in "${passwords[@]}"; do
# Try to ssh into the server with the current combination of user and password
ssh_output=$(sshpass -p "$password" ssh "$user"@"$server" -o StrictHostKeyChecking=no -o ConnectTimeout=3 2>&1)
# Check if the ssh login was successful
if [ "$?" -eq 0 ]; then
echo "Successful ssh login to $server using account $user and password $password"
echo "$server $user $password" >> "$logins_file"
else
echo "Failed ssh login to $server using account $user and password $password"
fi
done
done
done
===== Remove duplicate and empty lines from file =====
#!/bin/bash
# Remove duplicate lines from url.txt and save to temp file
sort -u url.txt > temp.txt
# Remove empty lines from temp file and save back to url.txt
grep -v "^$" temp.txt > url.txt
# Remove temp file
rm temp.txt
===== Download files based on URLs in a file =====
#!/bin/bash
# read list of URLs from file
while read url; do
# download file using wget
wget "$url"
done < url.txt
Do the same but check if file exists. If it does compare sizes and ask what to do.
#!/bin/bash
# Read URLs from the url.txt file and download the files
while read url; do
filename=$(basename "$url")
if [ -e "$filename" ]; then
local_size=$(wc -c <"$filename")
remote_size=$(curl -sI "$url" | awk '/Content-Length/ {sub("\r",""); print $2}')
if [ "$local_size" = "$remote_size" ]; then
echo "$filename already exists and has the same file size. Skipping download."
continue
else
read -p "A file with the name $filename already exists. Do you want to save the new file with a different name? (y/n) " response
if [ "$response" = "y" ]; then
read -p "Enter the new file name: " new_filename
curl -L -o "$new_filename" "$url"
echo "File saved as $new_filename."
else
echo "Skipping download of $filename."
fi
fi
else
curl -L -o "$filename" "$url"
echo "Downloaded $filename."
fi
done < url.txt