aliase erstellen

S

shell_b00n

Grünschnabel
Hallo zusammen,

ich bin neu in der Unix/Linux Welt und befasse mich auch seit einiger Zeit damit.
Ich möchte nun eine kleine Aufgabe meistern, jedoch scheitere ich kläglich.
Ich bringe euch mein Problem näher.

Unter /etc/hosts habe ich diverse host namen mit diversen benutzern, nehmen wir an z.b.

host=windows1 benutzer=test
host=windows2 benutzer=test

usw.

Und immer wenn ich mit ssh auf eines der hosts zugreifen möchte gebe ich ein ssh test@windows1 z.b. Jedoch möchte ich dies gerne als alias automatisieren so dass ich
nur noch das alias windows1 eingebe und dann die passwortabfrage erscheint

ich weiß leider nicht wie ich das anstellen soll, so dass die hosts bei jeder sessionanmeldung vorhanden sein können.

hat jemand eine idee?

Gruss
 
Hallo,

mit alias wird das schlecht gehen, da der Name der Verbindung ja variabel ist.
Eine mögliche Lösung wäre ein kleines Skript - nennen wir es remote.sh:
Code:
#! /bin/bash
HOSTNAME=$1
USERNAME=$(grep -i $HOSTNAME /etc/hosts | cut -d "=" -f 3)
ssh $USERNAME@$HOSTNAME

Dann:
Code:
$ chmod +x remote.sh
Und zum Ausführen:
Code:
$ remote.sh windows1

MfG
Schard
 
Hallo Schard,

danke für die mögliche Lösung.
Ich habe mir das etwas anders vorgestellt gehabt.
Die Hosts sind variable, das stimmt.
Kann man denn nicht z.b. mit cat /etc/host den Inhalt ausgeben und darüber z.B. Host und Benutzer (vielleicht mit awk) in verschiedene Variablen zuweisen und in das Muster ssh $USERNAME@$HOSTNAME übergeben und in ein anderes shell script packen?

Gruss
 
Verstehe ich jetzt nicht.
Mit grep wird ja /etc/hosts nach dem jeweiligen Hostnamen durchsucht und der zugehörige Benutzername mittels cut herausgeschnitten.
Das wird dann in die Form $USERNAME@$HOSTNAME gebracht (und direkt an ssh übergeben).
warum willst du denn da für jeden x-beliebeigen hostname ne eigene Umgebungsvariable erstellen?
Bitte erkläre doch mal genau, wozu du das benutzen möchtest.
Vielleicht verstehe ich es dann.

LG
 
Die hosts-Datei hat mit Deinem Problem eigentlich nichts zu tun. Mit der Bash kannst Du Dir in ~/.bashrc oder ~/.bash_profile den Befehl
Code:
alias windows1='ssh test@windows1'
eintragen, um Dein Problem zu loesen. Und das eben fuer jeden Nutzer und jeden Rechner. Hier kannst Du den ganzen Rechnernamen eintragen oder das Kuerzel, das bei Dir in /etc/hosts steht.
 
Hey rikola,

anfänglich hatte ich dies auch über die .bashrc gemacht, jedoch hartcodiert.
Da sich die Hosts immer mal ändern, wollte ich daraus etwas automatisches generieren.

Nur leider reichen meine Shell Programmierkentnisse noch nicht dafür aus, entweder dies mit einer for-/while-/case-Schleife zu lösen.

Hintergrund ist das Administrieren diverser Maschinen über ssh. Die Hostnamen sind über ein Monitoringtool aufgelistet. So dachte ich mir einfach, wenn sich der Name ändert soll mir das Shell skript die aktuellen Hostnamen einfach bereitstellen.

Gruss
 
host=windows1 benutzer=test
host=windows2 benutzer=test

Das solltest du aber nicht in die /etc/hosts schreiben, dafür ist die nicht gedacht...
 
Für ssh hast du die ~/.ssh/config
da kannst du zb
Code:
Host windowshost1
User test

Eintragen, dann wird bei jeder Verbdinung tu windowshost1 automatisch der username test angenommen.
Mehr dazu findest du unter "man ssh_config"
Dann musst du allerdings noch "ssh windowshost1" eingeben, das die verbindung aufbebaut wird, wenn du dich aber immer als user test anmelden willst kannst du auch:
Code:
alias ssh="ssh -l test"
in deine ~/.bashrc eintragen, dabei werden allerdings nur alle aufrufe von "ssh" mit "ssh -l test" ersetzt und du meldest dich überall defaultmäßig per user test an.
 
Du koenntest Dir sicherlich ein Skript schreiben, dass Du dann 'windows1' nennst und Dir beim Aufruf die benoetigten Daten dort herholt, wo sie abgelegt sind und daraus die Befehlszeile bastelt, mit der Du Dich auf dem entsprechenden Rechner einloggen kannst.
Um Dir damit weiterzuhelfen, muessten wir jedoch wissen, wo sie diese Informationen befinden, bzw. in welchem Format sie dort abgespeichert sind. Ich vermute mal, dass dieses Monitoringtool (dessen Namen zu kennen gewiss fuer uns kein Nachteil waere) eine Log-Datei schreibt, in der der Rechnername und evtl. auch der Username drinstehen. Schick doch mal einen Auszug aus dieser Datei oder korrigiere meine Annahme.
 
Hey, ich habe jetzt versucht das Problem mit so einemn Code zu lösen, aber irgendwie funzt das nicht so ganz.

Code:
cat /etc/hosts | while read $LINE
do
   case $LINE in
            \#)  ;; #kommentare ignorieren
            *)
                Hostname=`echo $LINE | awk '{print $2}' | awk '{print $1}' `
                Username=`echo $LINE | awk -F"Username=" '{print $2}' | awk '{print $1}' `
                if [ "$Hostname" != "" && "$Username" != "" ]; then
                        echo "alias $Hostname='ssh $Username@$Hostname'" >> aliase.txt
                fi
                ;;
   esac
done

Als Fehlermeldung bekomme ich bash: [: Fehlende ]'

Gruss
 
Zuletzt bearbeitet:
Hi

"[" prüft immer nur eine Bedingung (man test).

Richtig wäre
Code:
if [ "$Hostname" != "" ] && [ "$Username" != "" ]; then
   echo "alias $Hostname='ssh $Username@$Hostname'" >> aliase.txt
fi

mfg
HeadCrash
 
Ich danke Dir HeadCrash. Da habe ich mich zu sehr an die objektorientierten Sprachen gehalten.

Jedoch scheint wohl in meinem kurzen Skript einen allgemeinen Fehler zu geben. Es tut sich nämlich nichts.

Hintergedanke ist, dass z.b. aus der /etc/hosts Daten verarbeitet, in einer Variablen gespeichert und dann in ein Alias geschrieben werden.

Die Hosts sehen dabei folgendermaßen aus.

Code:
z.B.
# Maschine 1
192.168.0.5  WIN1 #<Username=bla>
# Maschine 2
192.168.0.7  WIN2 #<Username=blu>
# Maschine 3
192.168.0.5  SUS3 #<Username=bli>

usw

Die Informationen erhalte ich mit den awk-Befehlen.
Jetzt möchte ich nur noch die Variablen in Aliase umwandeln und in eine weiter ausführbares Skript übergeben, das z.B. bei der Anmeldung die Hosts in mein .profile vorhanden sind.

Hat jemand ein Tipp für mich?

Grüsse
 
Code:
cat /etc/hosts | while read $LINE
do
   case $LINE in
           [b] \#)  ;; #kommentare ignorieren [/b]
            *)
                Hostname=`echo $LINE | awk '{print $2}' | awk '{print $1}' `
                Username=`echo $LINE | awk -F"Username=" '{print $2}' | awk '{print $1}' `
                if [ "$Hostname" != "" ] && [ "$Username" != "" ]; then
                        echo "alias $Hostname='ssh $Username@$Hostname'" >> aliase.txt
                fi
                ;;
   esac
done

Du liest die line aus der /etc/hosts ein und ignorierst alle Zeilen mit einem '#'.
Welche Zeilen soll dann noch verarbeitet werden?
Das heißt: "works as designed".

Ich möchte dir aber dringend ans Herz legen die Systemdatei /etc/hosts nicht mit diesen Informationen über Benutzer zu misbrauchen.
Die Einträge in der /etc/hosts haben eine klare Struktur:
"IP FQDN HostAliase", außer localhost. Sonderfall!
Da haben m.E. Benutzerinfos nichts drin zu suchen.
Hat saeckereier z.B. auch schon angedeutet.

Warum nicht die /etc/hosts als Grundlage nehmen, als $HOME/meine_hosts o.ä. kopieren und für deine Bedürfnisse anpassen?

Also etwa so (ungetestet)

Code:
MYHOSTS=$HOME/meine_hosts.txt
if [ -f ${MYHOSTS} ] && rm ${MYHOSTS}
while read line
 do
  VAR1=$(awk '{ print $1 }' $line}
   case $VAR1 in
    192.168.0.5)    echo "${VAR1}  user1" >> ${MYHOSTS} ;;
    192.168.0.3)    echo "${VAR1}  user2"  >> ${MYHOSTS} ;;
    esac
done < /etc/hosts
dann nimmst du dein script und arbeitest mit der erzeugten datei weiter.
Mußt sie ja nur neu erzeugen, wenn eine Änderung war oder sie nicht vorhanden ist.
Da läßt sich noch einiges machen und mein code wird sicher auch noch optimierbar sein. (floyd62 und saeckereier haben sicher noch Kommentare dazu ;-)
 
Zuletzt bearbeitet:

Ähnliche Themen

Squid nur zum maskieren der eigenen IP, nicht für Webserver auf port 80

Knobelaufgabe für UNIX Könner (und Hilfe für einen N00b)

Ablösen von Exchange2k3, OWA und W2k3 AD

[HowTo] TeamSpeak 2 - RC2 - Server (Deutsch/Englisch)

Zurück
Oben