From aaec21ae9384ee8c031b2876849c6c42fec9eeac Mon Sep 17 00:00:00 2001 From: Martin Winkler Date: Thu, 21 Nov 2019 23:43:15 +0100 Subject: [PATCH] First functional seq for ssh management - Installing, Authorization key generation, Authorization key sending, Sending command list Keys are generated without user input (4096,rsa,comment: hostname,no passphrase,default path) --- seqs/ssh.sh | 115 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 86 insertions(+), 29 deletions(-) diff --git a/seqs/ssh.sh b/seqs/ssh.sh index e349d07..7658f4c 100755 --- a/seqs/ssh.sh +++ b/seqs/ssh.sh @@ -1,28 +1,54 @@ #!/bin/bash toolName="ssh" -toolIdentity="~/.ssh/id_rsa" +toolIdentity=~/.ssh/id_rsa aList="" aHost="" # default ssh port aPort="22" +step_1_info() { echo "Install $toolName"; } +step_1_alias() { ALIAS="install"; } +step_1() { + exe apt update + exe apt install ssh +} + step_3_info() { echo "Create $toolName authentication keys"; } step_3_alias() { ALIAS="create"; } step_3() { exep "ssh-keygen -l -f $toolIdentity 2>>/dev/null" - if [ $? -ne 0 ]; then - saveReturn 1 - else - saveReturn 1 + if [ $? -eq 0 ]; then + echo " [I] Using key found at $toolIdentity." + return 0 fi - endReturn -f "Identity found. Skipping creation" - echo "Creating..." + exe ssh-keygen -b 4096 -t rsa -C "$(hostname)" -N "" -f $(realpath $toolIdentity) } -step_10_info() { echo "Update remote(s) [CMDLIST] "; } -step_10_alias() { ALIAS="send"; } +step_5_info() { echo "Send key to remote host [PORT]"; } +step_5_alias() { ALIAS="sendkey"; } +step_5() { + local sshPort=22 + + if [ -z "$2" ] || [ "$2" == "" ] ; then + echo " [E] Host not provided." + return 1 + fi + + exep "ssh-keygen -l -f $toolIdentity 2>>/dev/null" + saveReturn $? + endReturn -f "Key $(realpath $toolIdentity) not found.\n Create one first." + + if [ ! -z "$3" ] && [ "$3" != "" ] ; then + sshPort=$3 + fi + + exe ssh-copy-id -p $sshPort $2 +} + +step_10_info() { echo "Send command(ssh)/file(scp) list to remote(s) [USER:HOST]"; } +step_10_alias() { ALIAS="sendlist"; } step_10() { aList=$2 aHost=$3 @@ -32,14 +58,14 @@ step_10() { fi parseList $aList saveReturn $? - endReturn + endReturn -f "Parsing error" } # parseList [CMDFILE] # Parse a list to transfer files and/or execute commands on one or different hosts # # List format -# [COMMAND h,f,u]|[STRING]|[STRING2] +# ||[STRING2] # COMMAND h|H|host - Change user@host:port for the following ssh/scp commands # f|F|file - Source- and destination file path combination # u|U|update - Execute command on the remote host @@ -53,6 +79,8 @@ step_10() { # u - not used # parseList() { + local errorMsg="" + if [ -z "$1" ] || [ ! -f "$1" ]; then if [ -z "$1" ] || [ "$1" == "" ] ; then echo " [E] No Command list found" @@ -71,50 +99,79 @@ parseList() { fi return 1 fi - echo " [I] Parsing $1 ..." - while IFS='|' read -r lcmd lsrc ldst; do + + echo " [I] Parsing $(realpath $1) ..." + local line=1 + # Working loop without ssh "stealing standard input" by + # https://unix.stackexchange.com/questions/24260/reading-lines-from-a-file-with-bash-for-vs-while + while IFS='|' read -r lcmd lsrc ldst <&3; do case "$lcmd" in h|H|host) - aHost="$lsrc" - if [ ! -z "$ldst" ] || [ "$ldst" != "" ]; then - aPort=$ldst + if [ -z "$lsrc" ] || [ "$lsrc" == "" ]; then + errorMsg="No host found" + #Prevent unwanted actions if parsing is continued + aHost="" + saveReturn 1 else - # Set port (back) to default in case no port is given - # after previous change - aPort=22 + aHost="$lsrc" + if [ ! -z "$ldst" ] || [ "$ldst" != "" ]; then + aPort=$ldst + else + # Set port (back) to default in case no port is given + # after previous change + aPort=22 + fi + echo Target host: ${aHost}:$aPort fi - echo Host update: ${aHost}:$aPort ;; f|F|file) if [ -z "$aHost" ] || [ "$aHost" == "" ]; then - echo " [E] No host found" - return 1 + errorMsg="No host found" + saveReturn 1 + else + exe scp -p $aPort $lsrc ${aHost}:$ldst + saveReturn $? + errorMsg="scp to $aHost failed with $?" fi - echo "scp -p $aPort $lsrc ${aHost}:$ldst" ;; u|U|update) if [ -z "$aHost" ] || [ "$aHost" == "" ]; then - echo " [E] No host found" - return 1 + errorMsg="No host found" + saveReturn 1 + else + exe ssh -p $aPort $aHost $lsrc + saveReturn $? + errorMsg="ssh to $aHost failed with $?" fi - echo "ssh -p $aPort $aHost $lsrc" ;; *) + # Making comments possible + ((line++)) continue ;; esac - done < "$1" + getReturn + if [ $? -ne 0 ] ; then + echo -e " [E] $line:$errorMsg" + if [ $QUIET -eq 0 ] ; then + endReturn -f "Stop on first error" + fi + fi + + ((line++)) + done 3<"$1" + echo " [I] Parsed $((--line)) lines" } listFileTemplate="# following files are send to host given on command line f|/sourcedir/sourcefile|/destdir/destfile f|/sourcedir/sourcefile|/destdir/destfile -# host and port are changed for the following files +# host and port are changed for the following lines h|user@host2|port2 f|/sourcedir/sourcefile|/destdir/destfile f|/sourcedir/sourcefile|/destdir/destfile u|/destdir/updatescript.sh -# host is changed and port set to default 22 for the following files +# host is changed and port set to default 22 for the following lines h|user@host f|/sourcedir/sourcefile|/destdir/destfile f|/sourcedir/sourcefile|/destdir/destfile