Automatizmus SSH kulcs nelkul

Depency: expect, sed, ssh

Amit csinal:
- Vegrehajtja a .commands fileban levo utasitasokat az elore beallitott serversetekben vagy azok egy reszeben.
- Ha vegzett otthagy neked egy interaktiv konzolt, ahol azt csinalsz amit akarsz, de ha 10 masodpercig nem nyulsz hozza akkor tovabblep a kovetkezo szerverre.

Ami kell hozza ha nem irod at, hanem a jelenlegi formajaban akarod hasznalni: sudo su - root jog az accountodra

[code]
#!/bin/bash

USAGE="USAGE: $0 (serverset1 {all|uat|prod} commandfile [defaults to .commands] |serverset2 {all|uat|prod} commandfile) \n
If your tool is an interactive program, please write IA in your commands file before the tool name ie: 'IA mcedit /tmp/whatever'
"

# [:space:] is there for reason

SERVERSET1_UAT_SERVERS="uat-1-server1 uat-1-server2 uat-1-server3 "
SERVERSET1_PROD_SERVERS="prod-1-server1 prod-1-server2 prod-1-server3 "
SERVERSET2_UAT_SERVERS="uat-2-server1 uat-2-server2 uat-2-server3 "
SERVERSET2_PROD_SERVERS="prod-2-server1 prod-2-server2 prod-2-server3 "

if [ "$#" -lt "2" ]; then
echo -e $USAGE
exit 1
fi

connect() {

echo ################################################
echo -n "Please type in your USERNAME: "
read USERNAME
echo -n "Please type in your PASSWORD: "
read -s PASSWORD
echo ################################################

COMMANDS=$( cat $COMMANDFILE | while read line; do
line=$(echo "$line" | sed 's/'\''/\\'\''/g')
line=$(echo "$line" | sed 's/"/\\"/g')
if [ "${line:0:2}" == "IA" ]; then
echo "$line" | sed 's/\(IA\) \(.*\)/system \"\2\\n\"/'
else
echo "$line" | sed 's/\(.*\)/send -- \"\1\\n\"/'
fi
done )

for SERVER in $SERVERS; do

expect -c '
#exp_internal 1
spawn ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no '"$USERNAME"'@'"$SERVER"'
expect "password:"
send "'"$PASSWORD"'\n"
expect -re ".*\$"
sleep 1
send -- "sudo su - root\n"
expect "password for '"$USERNAME"':"
send "'"$PASSWORD"'\n"
expect -re ".*#"
'"$COMMANDS"'
interact timeout 10 return
'
done
}

case "$1" in
serverset1)
case "$2" in
all)
SERVERS=( "$SERVERSET1_UAT_SERVERS$SERVERSET1_PROD_SERVERS" )
if [ "$3" "=" "" ]; then
COMMANDFILE=.commands
else
COMMANDFILE="$3"
fi
connect
;;
uat)
SERVERS=( "$SERVERSET1_UAT_SERVERS" )
if [ "$3" "=" "" ]; then
COMMANDFILE=.commands
else
COMMANDFILE="$3"
fi
connect
;;
prod)
SERVERS=( "$SERVERSET1_PROD_SERVERS" )
if [ "$3" "=" "" ]; then
COMMANDFILE=.commands
else
COMMANDFILE="$3"
fi
connect
;;
esac
;;
serverset2)
case "$2" in
all)
SERVERS=( "$SERVERSET2_UAT_SERVERS$SERVERSET2_PROD_SERVERS" )
if [ "$3" "=" "" ]; then
COMMANDFILE=.commands
else
COMMANDFILE="$3"
fi
connect
;;
uat)
SERVERS=( "$SERVERSET2_UAT_SERVERS" )
if [ "$3" "=" "" ]; then
COMMANDFILE=.commands
else
COMMANDFILE="$3"
fi
connect
;;
prod)
SERVERS=( "$SERVERSET2_PROD_SERVERS" )
if [ "$3" "=" "" ]; then
COMMANDFILE=.commands
else
COMMANDFILE="$3"
fi
connect
;;
esac
;;
*)
echo -e "$USAGE"
;;
esac

[/code]

Hozzászólások

Ha valaki kulccsal szeretné megvalósítani, annak:

(a passhrase üres maradjon)

$ ssh-keygen
$ cat id_rsa.pub | ssh user@host 'cd .ssh; cat >> authorized_keys; chmod 600 authorized_keys'