====== 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