diff --git a/tabs/utils/ssh.sh b/tabs/utils/ssh.sh new file mode 100644 index 00000000..c25f69a3 --- /dev/null +++ b/tabs/utils/ssh.sh @@ -0,0 +1,250 @@ +#!/bin/sh -e + +. ../common-script.sh + +# Check if ~/.ssh/config exists, if not, create it +if [ ! -f ~/.ssh/config ]; then + touch ~/.ssh/config + chmod 600 ~/.ssh/config +fi + +# Function to show available hosts from ~/.ssh/config +show_available_hosts() { + printf "%b\n" "Available Systems:" + grep -E "^Host " ~/.ssh/config | awk '{print $2}' + printf "%b\n" "-------------------" +} + +# Function to ask for host details +ask_for_host_details() { + printf "%b\n" "Enter Host Alias: " + read -r host_alias + printf "%b\n" "Enter Remote Host (hostname or IP): " + read -r host + printf "%b\n" "Enter Remote User: " + read -r user + printf "%b\n" "Host $host_alias" >> ~/.ssh/config + printf "%b\n" " HostName $host" >> ~/.ssh/config + printf "%b\n" " User $user" >> ~/.ssh/config + printf "%b\n" " IdentityFile ~/.ssh/id_rsa" >> ~/.ssh/config + printf "%b\n" " StrictHostKeyChecking no" >> ~/.ssh/config + printf "%b\n" " UserKnownHostsFile=/dev/null" >> ~/.ssh/config + printf "%b\n" "Host $host_alias added successfully." +} + +# Function to generate SSH key if not exists +generate_ssh_key() { + if [ ! -f ~/.ssh/id_rsa ]; then + printf "%b\n" "SSH key not found, generating one..." + ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N "" -C "$(whoami)@$(hostname)" + else + printf "%b\n" "SSH key already exists." + fi +} + +# Function to share the SSH public key with the remote host +share_ssh_key() { + printf "%b\n" "Enter the alias of the host to copy the key to: " + read -r host_alias + printf "%b\n" "Copying SSH key to $host_alias..." + ssh-copy-id "$host_alias" + printf "%b\n" "SSH key copied to $host_alias successfully." +} + +# Function to disable password authentication and allow only SSH keys +#repeated twice as changes should take place when in commented state or modified state. +disable_password_auth() { + printf "%b\n" "Disabling SSH password authentication and enabling key-only login..." + printf "%b\n" "Enter the alias of the host: " + read -r host_alias + printf "%b\n" + ssh $host_alias " + $ESCALATION_TOOL -S sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config && + $ESCALATION_TOOL -S sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config && + $ESCALATION_TOOL -S sed -i 's/^#PubkeyAuthentication no/PubkeyAuthentication yes/' /etc/ssh/sshd_config && + $ESCALATION_TOOL -S sed -i 's/^PubkeyAuthentication no/PubkeyAuthentication yes/' /etc/ssh/sshd_config && + $ESCALATION_TOOL -S systemctl restart sshd + " + printf "%b\n" "PasswordAuthentication set to no and PubkeyAuthentication set to yes." +} + +enable_password_auth() { + printf "%b\n" "Disabling SSH password authentication and enabling key-only login..." + printf "%b\n" "Enter the alias of the host: " + read -r host_alias + printf "\n" + ssh $host_alias " + $ESCALATION_TOOL -S sed -i 's/^#PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config && + $ESCALATION_TOOL -S sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config && + $ESCALATION_TOOL -S sed -i 's/^#PubkeyAuthentication yes/PubkeyAuthentication no/' /etc/ssh/sshd_config && + $ESCALATION_TOOL -S sed -i 's/^PubkeyAuthentication yes/PubkeyAuthentication no/' /etc/ssh/sshd_config && + $ESCALATION_TOOL -S systemctl restart sshd + " + printf "%b\n" "PasswordAuthentication set to yes and PubkeyAuthentication set to no." +} + +# Function to check if password authentication is disabled +check_password_auth() { + printf "%b\n" "Enter the alias of the host: " + read -r host_alias + ssh $host_alias "grep '^PasswordAuthentication' /etc/ssh/sshd_config" +} + +# Function to run a command on a remote server +run_remote_command() { + printf "%b\n" "Enter the alias of the host: " + read -r host_alias + printf "%b\n" "Enter the command to run: " + read -r remote_command + ssh $host_alias "$remote_command" +} + +# Function to copy a file to a remote server +copy_file_to_remote() { + printf "%b\n" "Enter the local file path: " + read -r local_file + printf "%b\n" "Enter the alias of the host: " + read -r host_alias + printf "%b\n" "Enter the remote destination path: " + read -r remote_path + scp $local_file $host_alias:$remote_path +} + +# Function to copy a directory to a remote server +copy_directory_to_remote() { + printf "%b\n" "Enter the local directory path: " + read -r local_dir + printf "%b\n" "Enter the alias of the host: " + read -r host_alias + printf "%b\n" "Enter the remote destination path: " + read -r remote_path + scp -r $local_dir $host_alias:$remote_path +} + + +# Function to move a file to a remote server (copy and delete local) +move_file_to_remote() { + printf "%b\n" "Enter the local file path: " + read -r local_file + printf "%b\n" "Enter the alias of the host: " + read -r host_alias + printf "%b\n" "Enter the remote destination path: " + read -r remote_path + scp $local_file $host_alias:$remote_path && rm $local_file +} + +# Function to move a directory to a remote server (copy and delete local) +move_directory_to_remote() { + printf "%b\n" "Enter the local directory path: " + read -r local_dir + printf "%b\n" "Enter the alias of the host: " + read -r host_alias + printf "%b\n" "Enter the remote destination path: " + read -r remote_path + scp -r $local_dir $host_alias:$remote_path && rm -r $local_dir +} + +# Function to remove a system from SSH configuration +remove_system() { + printf "%b\n" "Enter the alias of the host to remove: " + read -r host_alias + sed -i "/^Host $host_alias/,+3d" ~/.ssh/config + printf "%b\n" "Removed $host_alias from SSH configuration." +} + +# Function to view SSH configuration +view_ssh_config() { + printf "%b\n" "Enter the alias of the host to view (or press Enter to view all): " + read -r host_alias + if [ -z "$host_alias" ]; then + cat ~/.ssh/config + else + grep -A 3 "^Host $host_alias" ~/.ssh/config + fi +} + +# Function to backup files from remote host +backup_files() { + printf "%b\n" "Enter the alias of the host: " + read -r host_alias + printf "%b\n" "Enter the files or directories to backup on remote host: " + read -r remote_files + printf "%b\n" "Enter the local backup directory path: " + read -r local_backup_dir + scp -r $host_alias:$remote_files $local_backup_dir +} + +# Function to sync directories with remote host +sync_directories() { + printf "%b\n" "Enter the local directory path: " + read -r local_dir + printf "%b\n" "Enter the alias of the host: " + read -r host_alias + printf "%b\n" "Enter the remote directory path: " + read -r remote_dir + rsync -avz $local_dir $host_alias:$remote_dir +} + +# Function to check SSH key authentication status +check_ssh_key_authentication() { + printf "%b\n""Enter the alias of the host: " + read -r host_alias + ssh $host_alias "grep '^PubkeyAuthentication' /etc/ssh/sshd_config" +} + +# Function to show options for the user +show_menu() { + printf "%b\n" "Select an SSH operation:" + printf "%b\n" "1. Add a new system" + printf "%b\n" "2. Connect to a system" + printf "%b\n" "3. Generate SSH key" + printf "%b\n" "4. Share SSH key with remote host" + printf "%b\n" "5. Disable password authentication on remote host" + printf "%b\n" "6. Enable password authentication on remote host" + printf "%b\n" "7. Check password authentication on remote host" + printf "%b\n" "8. Check SSH key authentication status" + printf "%b\n" "9. Run a command on remote host" + printf "%b\n" "10. Copy a file to remote host" + printf "%b\n" "11. Copy a directory to remote host" + printf "%b\n" "12. Move a file to remote host (copy and delete local)" + printf "%b\n" "13. Move a directory to remote host (copy and delete local)" + printf "%b\n" "14. Remove a system from SSH configuration" + printf "%b\n" "15. View SSH configuration" + printf "%b\n" "16. Backup files from remote host" + printf "%b\n" "17. Sync directories with remote host" + printf "%b\n" "18. Exit" + printf "%b\n" "Enter your choice: " +} + +# Function to execute the selected SSH operation +main() { + while true; do + show_menu + read choice + case $choice in + 1) ask_for_host_details ;; + 2) show_available_hosts && printf "%b\n" "Enter the alias of the host to connect to: " && read -r host_alias; ssh $host_alias ;; + 3) generate_ssh_key ;; + 4) share_ssh_key ;; + 5) disable_password_auth ;; + 6) enable_password_auth ;; + 7) check_password_auth ;; + 8) check_ssh_key_authentication ;; + 9) run_remote_command ;; + 10) copy_file_to_remote ;; + 11) copy_directory_to_remote ;; + 12) move_file_to_remote ;; + 13) move_directory_to_remote ;; + 14) remove_system ;; + 15) view_ssh_config ;; + 16) backup_files ;; + 17) sync_directories ;; + 18) exit ;; + *) printf "%b\n" "Invalid choice. Please try again." ;; + esac +done +} + +checkEnv +checkEscalationTool +main \ No newline at end of file diff --git a/tabs/utils/tab_data.toml b/tabs/utils/tab_data.toml index d09496ff..a11354a6 100644 --- a/tabs/utils/tab_data.toml +++ b/tabs/utils/tab_data.toml @@ -29,6 +29,10 @@ name = "Service Manager" description = "This utility is designed to manage services in your system" script = "service-control.sh" +[[data]] +name = "SSH Commands" +script = "ssh.sh" + [[data]] name = "Auto Login" script = "auto-login.sh"