Shell-Skript zur Anmeldung an einem SSH-Server

29

Ich habe versucht, ein Shell-Skript zu schreiben, das die automatische Anmeldung an einem SSH-Server mit dem im Skript angegebenen Kennwort ermöglicht. Ich habe folgenden Code geschrieben:

set timeout 30
/usr/bin/ssh -p 8484 [email protected]
expect 
{
   "[email protected]'s password" 
   {
      send "password\r" 
   }
}

Dieser Code wird nicht ordnungsgemäß ausgeführt, fordert jedoch zur Eingabe des Kennworts auf. Kann mir bitte jemand bei der Lösung helfen?

pradeepchhetri
quelle

Antworten:

36

Ich habe einmal ein expectSkript geschrieben, um mich bei einem SSH-Server anzumelden (wie in Ihrem Fall), und mein Skript sah ungefähr so ​​aus:

#!/usr/bin/expect

spawn ssh [email protected]
expect "password"
send "MyPassword\r"
interact

Ich denke, vielleicht interactfehlt das in deinem Drehbuch.

saeedn
quelle
dies absolut funktioniert gut für mich , und ich bin an dieser Stelle stecken, bietet die interact interaktives Terminal mit Eingabeaufforderung, aber ich versuche , weiter mehr Schritte zu automatisieren , wie zu tun cdund lsund den Inhalt der Datei als auch lesen. Ist es möglich, nach der Interaktion zu tun? Bitte antworten Sie
Hansiemithun
@ Hansie Sie können einen lsBefehl nach dem Login senden . Führen Sie beispielsweise nach dem Senden des Kennworts einen expectBefehl mit dem Eingabeaufforderungstext aus (um sicherzustellen, dass Sie angemeldet sind) send "ls\r". All dies geht vor interact.
Saeedn
die frage war leicht falsch und es tut mir leid, nachdem ich ls gemacht und den inhalt gelesen habe, kann ich den gleichen ausdrucken. Aber wie bekommt man das aus der ssh-Sitzung in eine Variable, auf die vom lokalen Rechner zugegriffen werden kann? ref: stackoverflow.com/questions/32341234/expect-script-return-value . Aber die Ausgabe funktioniert bei mir nicht. Meine Frage gepostet: stackoverflow.com/questions/51628465/… . Ich muss file_listnach dem Beenden von der lokalen Eingabeaufforderung
zugreifen
31

Du machst es falsch. Sie möchten ein passwortloses SSH-Schlüsselpaar generieren und dann (sofern der Server die RSA-Schlüsselauthentifizierung unterstützt) einsteigen, ohne ein Passwort für alle eingeben zu müssen. Dies ist ein Sicherheitsrisiko, wenn Ihr privater Schlüssel an einem Ort aufbewahrt wird, an dem er gestohlen werden könnte.

Folge diesen Schritten:

  1. mkdir -p ~/.ssh
  2. cd ~/.ssh
  3. ssh-keygen -type dsa -i mysshkeys
  4. Drücken Sie, Returnwenn Sie zur Eingabe einer Passphrase aufgefordert werden
  5. Drücken Sie Returnzur Bestätigung ein zweites Mal.

In Ihrem ~/.sshVerzeichnis befinden sich nun zwei Dateien mysshkey.pubund mysshkey. mysshkey.pubIst Ihr öffentlicher Schlüssel, kann dieser sicher auf Remote-Servern abgelegt werden. mysshkeyIst Ihr privater, kennwortloser Schlüssel, ist es nicht sicher, ihn auf Remote-Servern abzulegen (oder an einem Ort, an dem jemand anderes eine Kopie erhalten könnte).

Auf dem Server, in den Sie SSH möchten:

  1. Melden Sie sich beim Remote-Server an
  2. mkdir -p ~/.ssh
  3. Kopieren Sie den Inhalt von mysshkey.pubin~/.ssh/authorized_keys
  4. Stellen Sie sicher , dass ~/.ssh/authorized_keysheißt chmod‚d600

Um es nun auf Ihrem lokalen Computer in Aktion zu setzen, führen Sie den folgenden Befehl aus:

ssh -i ~/.ssh/mysshkey <remote_server_ip>

Und Sie werden angemeldet, ohne zur Eingabe eines Passworts aufgefordert zu werden.

Dies ist eine sehr bevorzugte Methode zur Verwaltung automatisierter Anmeldungen, da Sie Ihr Kennwort nicht an mehreren Stellen fest codieren müssen, die aktualisiert werden müssen, wenn Sie es jemals ändern.

synthesizerpatel
quelle
2
Ich würde RSA-Schlüssel anstelle von DSA verwenden. Aber abgesehen davon, stimme voll zu.
Glglgl
12
Manchmal können Sie dem Remote-Host keine Schlüssel hinzufügen, z. B. Netzwerkgeräte.
DarkHeart
1
Ich habe es versucht. ssh fragt immer noch nach einem Passwort. Müssen Sie speziell eine IP-Adresse angeben? Ich habe es sowohl mit <user> @ <domain-name> als auch nur mit dem Domainnamen versucht.
Jay Bienvenu
Dieser Befehl sagte zu viele Argumente? (für Schritt 3)
Joseph Astrahan
Ich musste zu ssh-keygen -t dsa wechseln und stattdessen den Dateispeicherort manuell eingeben.
Joseph Astrahan
20

Auf Debian-basierten Distributionen bietet das sshpassPaket eine einfachere Möglichkeit, das zu tun, was Sie wollen. Das Paket ist für viele andere beliebte Distributionen verfügbar. Sie müssen es zuerst einrichten:

echo 'YourPassword' > passwordFile.txt
chmod 600 passwordFile.txt

Rufen Sie dann den SSH-Befehl über ein Skript wie das folgende auf:

sshpass -f /path/to/passwordFile.txt /usr/bin/ssh -p 8484 [email protected]

Dies bietet mehr Flexibilität, z. B. wenn Sie ein anderes Gebietsschema verwenden oder das Kennwort ändern müssen, als wenn Sie Lösungen verwenden expect.

likeitlikeit
quelle
7

Installieren Sie zuerst den sshPass sudo apt-get install sshpass

Erstellen Sie dann einen Alias ​​in der .bashrc-Datei als

alias sshLogin='sshpass -p <your ssh password> ssh username@remote_host'

Laden Sie nun Ihre geänderte .bashrc-Datei von neu source ~/.bashrc

Sie sind jetzt fertig.

Jetzt können Sie das ssh mit dem oben erstellten Alias sshLoginim Terminal ausführen .

bpathak
quelle
5

Sie können dies verwenden:

sshpass -p 'yourpassword'  ssh user@ip
Behrooz Mohamadi Nasab
quelle
2

Alles was Sie brauchen, um einen Hash-Schlüssel zu erstellen und auf Ihrem PC zu speichern

Tipp einfach

ssh-keygen -t rsa -b 4096 # just press Enter till the end

dann eintreten

ssh-copy-id <user>@<server>

Dann normal einloggen mit

ssh <user>@<server>

Jetzt brauchen Sie kein Passwort

Hinweis: Das Speichern Ihres Passworts im Klartext ist gefährlich

Diese Methode erstellt einen Hash-Wert Ihres Kennworts mit RSA mit einem öffentlichen Schlüssel der Länge 4096, der sehr sicher ist.

Mohammad Hizzani
quelle
1
Dies scheint eine Wiederholung dieser Antwort zu sein .
Roaima
#roaima Ja, aber es deutet auf den unglaublich nützlichen ssh-copy-idBefehl hin, den sonst niemand erwähnte. Ich stimme dem zu.
Huw Walters
1

SSH Passwordless Login mit SSH Keygen in 5 einfachen Schritten :

Umgebungssetup: Bildbeschreibung hier eingeben

Schritt 1: Authentifizierung von SSH-Kegen-Schlüsseln unter - (192.168.0.12)
Melden Sie sich zuerst mit einem Benutzer beim Server 192.168.0.12 an und generieren Sie mit dem folgenden Befehl ein Paar öffentlicher Schlüssel.

Bildbeschreibung hier eingeben

Schritt 2: Erstellen eines SSH-Verzeichnisses unter - 192.168.0.11
Verwenden Sie SSH vom Server 192.168.0.12, um eine Verbindung zum Server 192.168.0.11 herzustellen, und erstellen Sie das SSH-Verzeichnis unter diesem Server mithilfe des folgenden Befehls.

Bildbeschreibung hier eingeben

Schritt 3: Hochladen von generierten öffentlichen Schlüsseln auf - 192.168.0.11
Verwenden Sie SSH vom Server 192.168.0.12 und laden Sie den neu generierten öffentlichen Schlüssel (id_rsa.pub) auf den Server 192.168.0.11 im Benutzerverzeichnis .sshals Dateinamen authorized_keys hoch .

Bildbeschreibung hier eingeben

Schritt 4: Festlegen von Berechtigungen für - 192.168.0.11
Aufgrund unterschiedlicher SSH-Versionen auf Servern müssen Berechtigungen für .sshVerzeichnis und authorized_keysDatei festgelegt werden.

Bildbeschreibung hier eingeben

Schritt 5: Login von 192.168.0.12 auf 192.168.0.11 Server ohne Passwort
Ab sofort können wir uns als Sheena User vom Server 192.168.0.12 als tecmint User ohne Passwort bei 192.168.0.11 einloggen.

Bildbeschreibung hier eingeben

Premraj
quelle
Danke ... das hat bei mir geklappt, außer bei Schritt 4 bekam ich eine dramatische "Warnung": "UNGESCHÜTZTE PRIVATSCHLÜSSELDATEI! ... ... /. Ssh / id_rsa" sind zu offen. ... privater Schlüssel wird sein ignoriert ... schlechte Berechtigungen ". Ich habe chmod 700 id_rsaim Verzeichnis .ssh in der lokalen (Client, dh 192.168.0.12 in Ihrem Beispiel) Server: Problem gelöst
Mike Nagetier
2
Bitte posten Sie keine Bilder von Text .
Roaima
1

Wie bereits in anderen Antworten beschrieben, verwende ich es auch, sshpassaber ich kombiniere es mit dem readBefehl, um mein Passwort in einer temporären Umgebungsvariablen zu speichern. Auf diese Weise wird mein Passwort niemals in Klartext geschrieben. Hier ist der einzeilige Befehl, den ich verwende:

read -s PASS; sshpass -p $PASS ssh <user>@<host adress>

Danach müssen Sie Ihr Passwort eingeben (nichts erscheint auf dem Bildschirm) und dann die Eingabetaste drücken, um die Verbindung zu öffnen.

Sturmreiter
quelle
0

Ich habe das kürzlich gemacht, das kann dir helfen:

sshpass -p 'password' username@ipaddress

Wenn dies nicht funktioniert, müssen Sie Schlüssel auf dem anderen Computer generieren, mit dem Sie eine Verbindung herstellen möchten

ssh-keygen

Es generiert private und öffentliche Schlüssel und fragt Sie nach einem Speicherort. Leer lassen. Es speichert die Schlüssel im .ssh-Ordner. Standardmäßig werden Sie nach einer Passphrase gefragt Name des öffentlichen Schlüssels für 'authorized_keys'

cd .ssh/
mv id_rsa.pub authorized_keys
useradd -d /home/username username

Dadurch wird der Benutzer zur Liste hinzugefügt. Wechseln Sie in das Ausgangsverzeichnis, geben Sie die Berechtigung und starten Sie die sshd-Dienste neu

chmod 700 /home/username/.ssh
chmod 644 /home/username/.ssh/authorized_keys
chown root:root /home/dozee
sudo service sshd restart

Jetzt müssen Sie den privaten Schlüssel auf das System an der Stelle verschieben, an der Sie den Befehl ssh ausführen möchten. Anschließend können Sie eine Verbindung mit herstellen

sshpass -p 'password' ssh -i id_rsa username@ip

Wenn auch das nicht funktioniert, gehen Sie in / etc / ssh und öffnen Sie sshd_config mit dem vim-Editor. Prüfen Sie, ob pubkeyAuthenticatoin auf yes eingestellt ist oder nicht. Wenn dies nicht der Fall ist, starten Sie die sshd-Dienste neu und probieren Sie es aus, es wird definitiv funktionieren .

Utkarsh Gupta
quelle
0

Das erste Argument ist der Hostname und das zweite das Passwort.

     #!/usr/bin/expect
     set pass [lindex $argv 1]
     set host [lindex $argv 0]
     spawn ssh -t root@$host echo Hello
     expect "*assword: "
     send "$pass\n";
     interact

Ausführung: ./script.expect

Shivam Mehrotra
quelle