• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

ssh - Returncode Ermitteln ?

mr_kaktus

Member
Hallo,

ich würde gerne wissen, ob sich LDAP User auf einer bestimmten Maschine einlogen können oder nicht.
Dafür habe ich ein kleines skript geschrieben, der dass für mich jede 5
Ich hab ein kleines skript geschrieben, der das für mich testet:
Code:
# IP-Adresse des Systems ermitteln.
IP_ADRESS=`/sbin/ifconfig eth0 | \
      /usr/bin/awk ' /inet [aA]dd?r/ \
                     {print substr ($2, index ($2, ":") + 1) }'`

# Einloggen als ldap_test um die Funktionalität vom LDAP-Client zu prüfen
# Alle Meldungen werden in der datei /tmp/OUTPUT.$$ gepiped
sudo /bin/su - ldap_test -c "ssh  ldap_test@$IP_ADRESS exit" &> /tmp/OUTPUT.$$


# Hier wird der Returncode vom SSH-Login überprüft
# RETURNCODE_SSH=1   ==> OK
# RETURNCODE_SSH=255 ==> FEHLER
RETURNCODE_SSH=$(echo $?)

if [[ "$RETURNCODE_SSH" == "1" ]]
 then
   RESULT=0
 else
   RESULT=1
fi

Das Skript funktioniert folgendermasen:
- bbuser führt das Skript aus
- IP-Adresse wird gesammelt
- Dann führt der bbuser ein su mit Befehlsübergabe aus - beim su logt sich der ldap_test user auf der Linux Maschine, es wird der Private-Key vom ldap_test geladen und er kann sich dann auf die Linux Maschine anmelden oder nicht.
- Je nach dem welchen Returncode SSH zurück gibt, wird Variable RESULT auf 0 oder 1 gestellt.

Mein Problem, ich würde ja gerne herausfinden ob das Login gefunzt hat oder nicht. Ich frage noch dem Login mit $? den Staus des letzten Befehles ab, wenn der login erfolgreich war, ist der Returncode 1 sonst 255. Jetzt ist mir aber aufgefallen, dass wenn der Login auch "nicht statt gefunden hat" ein Rerturncode 1 zurück gegeben wird, z.B. wenn er nach dem Passgefragt wird. Hat jemand von euch eine Idee, wie ich den ReturnCode noch abfragen könnte vom SSH-Login oder vielleicht eine bessere Lösung ?

by
mr_kaktus
 
Der Returncode stammt von sudo.
=> man sudo: Return Values

sudo bekommt den von su
=> info su
=> Exit status:

1 if `su' itself fails
126 if subshell is found but cannot be invoked
127 if subshell cannot be found
the exit status of the subshell otherwise

und evtl. kriegt su etwas von ssh...
man ssh: DIAGNOSTICS
ssh exits with the exit status of the remote command or with 255 if an error occurred.


Ich würde "ssh ldap_test@$IP_ADRESS ; echo \$? ; exit "
einsetzen und dann mit "tail -1 /tmp/OUTPUT.$$" den Wert
holen.

Haveaniceday
 
OP
M

mr_kaktus

Member
HI,

super es hat gefunzt :D
Ich hab es folgendermasen gelöst:
Code:
# IP-Adresse des Systems ermitteln.
IP_ADRESS=`/sbin/ifconfig eth0 | \
      /usr/bin/awk ' /inet [aA]dd?r/ \
                     {print substr ($2, index ($2, ":") + 1) }'`

# Einloggen als ldap_test um die Funktionalität vom LDAP-Client zu prüfen
# Alle Meldungen werden in der datei /tmp/OUTPUT.$$ gepiped
sudo /bin/su - ldap_test -c "ssh ldap_test@$IP_ADRESS echo $? &>/tmp/OUTPUT.$$"


# Hier wird der Returncode vom SSH-Login überprüft
# RETURNCODE_SSH=0   ==> OK
# RETURNCODE_SSH>0   ==> FEHLER
RETURNCODE_SSH=$(cat /tmp/OUTPUT.$$)

if [[ "$RETURNCODE_SSH" == "0" ]]
 then
   RESULT=0
 else
   RESULT=1
fi

by
mr_kaktus
 
Code:
sudo /bin/su - ldap_test -c "ssh ldap_test@$IP_ADRESS ;echo $? &>/tmp/OUTPUT.$$"
Muss da nicht ein ";" mit rein ?

und "tail -1 /tmp/OUTPUT.$$" statt cat...
Falls der Login mal irgendwelche Hallomeldungen ausgibt wäre es "test" anstatt "0".
 
OP
M

mr_kaktus

Member
haveaniceday schrieb:
Muss da nicht ein ";" mit rein ?
Ich hab das vorhin getestet, aber mit ";" sprinngt der bbuser ganz raus.

haveaniceday schrieb:
und "tail -1 /tmp/OUTPUT.$$" statt cat...
Falls der Login mal irgendwelche Hallomeldungen ausgibt wäre es "test" anstatt "0".
Hm... das ist ein Argument. Werde ich denke ich auch so umstellen.

by
mr_kaktus
 
OP
M

mr_kaktus

Member
Hallo Noch mal, ich hab noch ein kleines Prob bei dem ich nicht weiter komme.
Ich hatte das Prob folgendermaßen gelöst:
Code:
sudo /bin/su - ldap_test -c "ssh ldap_test@$IP_ADRESS echo $? &>/tmp/OUTPUT.$$"

Jetzt ist mir aufgefallen, dass ich der ldap_test User sich nicht richtig auslogt.
Wenn sich der ldap_test User einloggt wird durch seine .profile ein ssh-key geladen:
Code:
eval `ssh-agent` &> /dev/null
ssh-add /home/ldap_test/.ssh/private_key &> /dev/null
Beim ausloggen sollte die .bash_logout abgearbeitet und der SSH-Agent beendet werden
Code:
# ssh-agent benden
# -----------------
eval `ssh-agent -k` 2>&1 > /dev/null
Dummerweiße wird die .bash_logout wenn ich es so versuche nicht abgebarbeitet und so mit hab ich dann 100te von ssh-agents offen
Code:
sudo /bin/su - ldap_test -c "ssh ldap_test@$IP_ADRESS echo $? &>/tmp/OUTPUT.$$"
Ich hab es auch wie folgt versucht:
Code:
sudo /bin/su - ldap_test -c "ssh ldap_test@$IP_ADRESS; echo $? &>/tmp/OUTPUT.$$"; exit
Aber da bleibt der ldap_test User stehen und das Exit wird nicht abgearbeitet :(
Hat mir jemand ein Tip ?
Danke.

EDIT:
Nach dem ich jetzt die su-Manpage ein paar mal durch gelesen habe, ist mir folgendes Aufgefallen:
-c, --commmand=COMMAND
pass a single COMMAND to the shell with -c
Also, berechtigt mich bitte, aber wenn ich das jetzt richtig verstanden habe, dann darf ich mit -c nur "ein" Kommando absetzen ?


by mr_kaktus
 
Oben