it-swarm.com.de

Automatisch SSH-Passwort mit Skript eingeben

Ich muss ein Skript erstellen, das automatisch ein Kennwort für den OpenSSH ssh -Client eingibt.

Angenommen, ich muss in [email protected] mit dem Kennwort a1234b SSH ausführen.

Ich habe es schon versucht ...

#~/bin/myssh.sh
ssh [email protected]
a1234b

... aber das geht nicht.

Wie kann ich diese Funktionalität in ein Skript integrieren?

163
user1467855

Zuerst müssen Sie sshpass installieren.

  • Ubuntu/Debian: apt-get install sshpass
  • Fedora/CentOS: yum install sshpass
  • Arch: pacman -S sshpass

Beispiel:

sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no [email protected]_SITE.COM

Beispiel für einen benutzerdefinierten Port:

sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no [email protected]_SITE.COM:2400

Anmerkungen:

  • sshpass kann auch ein Kennwort aus einer Datei lesen, wenn das Flag -f übergeben wird.
    • Die Verwendung von -f verhindert, dass das Kennwort angezeigt wird, wenn der Befehl ps ausgeführt wird.
    • Die Datei, in der das Kennwort gespeichert ist, sollte über sichere Berechtigungen verfügen.
241
abbotto

Nachdem ich monatelang nach einer Antwort auf die Frage gesucht hatte, fand ich endlich eine bessere Lösung: ein einfaches Skript zu schreiben.

#!/usr/bin/expect

set timeout 20

set cmd [lrange $argv 1 end]
set password [lindex $argv 0]

eval spawn $cmd
expect "assword:"
send "$password\r";
interact

Setzen Sie es auf /usr/bin/exp, dann können Sie verwenden:

  • exp <password> ssh <anything>
  • exp <password> scp <anysrc> <anydst>

Getan!

81
damn_c

Verwenden Sie die Authentifizierung mit öffentlichem Schlüssel: https://help.ubuntu.com/community/SSH/OpenSSH/Keys

Auf dem Quell-Host muss dies nur einmal ausgeführt werden:

ssh-keygen -t rsa # ENTER to every field
ssh-copy-id [email protected]

Das ist alles, danach können Sie ssh ohne Passwort ausführen.

63
Diego Woitasen

Sie könnten ein Expects-Skript verwenden. Ich habe seit einiger Zeit keine mehr geschrieben, aber es sollte wie folgt aussehen. Sie müssen das Skript mit #!/usr/bin/expect leiten.

#!/usr/bin/expect -f
spawn ssh HOSTNAME
expect "login:" 
send "username\r"
expect "Password:"
send "password\r"
interact
28
Lipongo

Variante I

sshpass -p PASSWORD ssh [email protected]

Variante II

#!/usr/bin/expect -f
spawn ssh [email protected] "touch /home/user/ssh_example"
expect "assword:"
send "PASSWORD\r"
interact
20
RemiZOffAlex

sshpass mit besserer Sicherheit

Ich bin über diesen Thread gestolpert, als ich nach einer Möglichkeit gesucht habe, in einen überlasteten Server zu ssh zu gelangen. Es dauerte über eine Minute, bis der SSH-Verbindungsversuch ausgeführt wurde, und es trat eine Zeitüberschreitung auf, bevor ich ein Kennwort eingeben konnte. In diesem Fall wollte ich in der Lage sein, mein Passwort anzugeben sofort wenn die Eingabeaufforderung verfügbar war.

(Und wenn es nicht schmerzlich klar ist: Bei einem Server in diesem Zustand ist es viel zu spät, um einen öffentlichen Schlüssel einzurichten.)

sshpass zur Rettung. Es gibt jedoch bessere Möglichkeiten, dies zu tun, als sshpass -p.

Meine Implementierung springt direkt zur Eingabeaufforderung für interaktive Kennwörter (es wird keine Zeit verschwendet, um zu sehen, ob ein Austausch öffentlicher Schlüssel stattfinden kann), und das Kennwort wird nie als einfacher Text angezeigt.

#!/bin/sh
# preempt-ssh.sh
# usage: same arguments that you'd pass to ssh normally
echo "You're going to run (with our additions) ssh [email protected]"

# Read password interactively and save it to the environment
read -s -p "Password to use: " SSHPASS 
export SSHPASS

# have sshpass load the password from the environment, and skip public key auth
# all other args come directly from the input
sshpass -e ssh -o PreferredAuthentications=keyboard-interactive -o PubkeyAuthentication=no "[email protected]"

# clear the exported variable containing the password
unset SSHPASS
7
Ian

sshpass + autossh

Ein netter Bonus des bereits erwähnten sshpass ist, dass Sie es mit autossh verwenden können, wodurch noch mehr der interaktiven Ineffizienz beseitigt wird.

sshpass -p mypassword autossh -M0 -t [email protected]

Dies ermöglicht eine automatische Neuverbindung, wenn z. Ihr WLAN wird durch Schließen Ihres Laptops unterbrochen.

7
# create a file that echo's out your password .. you may need to get crazy with escape chars or for extra credit put ASCII in your password...

echo "echo YerPasswordhere" > /tmp/1
chmod 777 /tmp/1

# sets some vars for ssh to play Nice with something to do with GUI but here we are using it to pass creds.


export SSH_ASKPASS="/tmp/1"
export DISPLAY=YOURDOINGITWRONG
setsid ssh [email protected] -p 22

referenz: https://www.linkedin.com/Pulse/youre-doing-wrong-ssh-plain-text-credentials-robert-mccurdy?trk=mp-reader-card

6
RmccurdyDOTcom

Ich glaube nicht, dass ich jemanden gesehen habe, der dies vorschlägt, und das OP hat nur "Drehbuch" gesagt, also ...

Ich musste das gleiche Problem lösen und meine bequemste Sprache ist Python.

Ich habe die Paramiko-Bibliothek benutzt. Außerdem musste ich Befehle ausgeben, für die ich erweiterte Berechtigungen mit Sudo benötigen würde. Es stellt sich heraus, dass Sudo sein Passwort über stdin über das "-S" -Flag akzeptieren kann! Siehe unten:

import paramiko

ssh_client = paramiko.SSHClient()

# To avoid an "unknown hosts" error. Solve this differently if you must...
ssh_client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())

# This mechanism uses a private key.
pkey = paramiko.RSAKey.from_private_key_file(PKEY_PATH)

# This mechanism uses a password.
# Get it from cli args or a file or hard code it, whatever works best for you
password = "password"

ssh_client.connect(hostname="my.Host.name.com",
                       username="username",

                       # Uncomment one of the following...
                       # password=password
                       # pkey=pkey
                       )

# do something restricted
# If you don't need escalated permissions, omit everything before "mkdir"
command "echo {} | Sudo -S mkdir /var/log/test_dir 2>/dev/null".format(password)

# In order to inspect the exit code
# you need go under paramiko's hood a bit
# rather than just using "ssh_client.exec_command()"
chan = ssh_client.get_transport().open_session()
chan.exec_command(command)

exit_status = chan.recv_exit_status()

if exit_status != 0:
    stderr = chan.recv_stderr(5000)

# Note that Sudo's "-S" flag will send the password Prompt to stderr
# so you will see that string here too, as well as the actual error.
# It was because of this behavior that we needed access to the exit code
# to assert success.

    logger.error("Uh oh")
    logger.error(stderr)
else:
    logger.info("Successful!")

Hoffe das hilft jemandem. Mein Anwendungsfall war, Verzeichnisse zu erstellen, Dateien zu senden und zu entpacken und Programme auf jeweils ~ 300 Servern zu starten. Daher war die Automatisierung von größter Bedeutung. Ich habe sshpass ausprobiert und erwartet und bin dann darauf gekommen.

Ich hoffe es hilft jemandem genauso wie mir!

4
John Carrell

Die Antwort von @abbotto hat bei mir nicht funktioniert, musste einige Dinge anders machen:

  1. yum install sshpass geändert in - rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/sshpass-1.05-1.el6 .x86_64.rpm
  2. der Befehl zur Verwendung von sshpass wurde in - geändert. sshpass -p "pass" ssh user @ mysite -p 2122
1
MustSeeMelons

Ich habe eine bessere Lösung, bei der Sie sich mit Ihrem Konto anmelden müssen, als zum Root-Benutzer zu wechseln. Es ist ein Bash-Skript

http://felipeferreira.net/index.php/2011/09/ssh-automatic-login/

1
Xoroz

So melde ich mich bei meinen Servern an.

ssp <server_ip>
  • alias ssp = '/ home/myuser/Documents/ssh_script.sh'
  • cat /home/myuser/Documents/ssh_script.sh

    #!/bin/bash

    sshpass -p meinKennwort ssh root @ $ 1

Und deshalb...

ssp server_ip
1
DimiDak

Ich habe dies wie folgt funktioniert

.ssh/config wurde geändert, um die Ja/Nein-Aufforderung zu entfernen. Ich stecke hinter einer Firewall und mache mir keine Sorgen um gefälschte SSH-Schlüssel

Host *
     StrictHostKeyChecking no

Erstellen Sie eine Antwortdatei für expect, d. H. Answer.expect

set timeout 20
set node [lindex $argv 0]
spawn ssh [email protected] service hadoop-hdfs-datanode restart

expect  "*?assword {
      send "password\r"   <- your password here.

interact

Erstellen Sie Ihr Bash-Skript und rufen Sie einfach expect in der Datei auf

#!/bin/bash
i=1
while [$i -lt 129]    # a few nodes here

  expect answer.expect hadoopslave$i

  i=[$i + 1]
  sleep 5

done

Ruft 128 Hadoop-Datenknoten mit neuer Konfiguration auf - vorausgesetzt, Sie verwenden ein NFS-Mount für die Hadoop-/Conf-Dateien

Hoffe, das hilft jemandem - ich bin ein Windows-Leerer und es hat ungefähr 5 Stunden gedauert, bis ich es herausgefunden habe!

1
WT29

Damit habe ich es geschafft:

SSH_ASKPASS="echo \"my-pass-here\""
ssh -tt remotehost -l myusername
0

Wenn Sie dies auf einem Windows-System tun, können Sie Plink (Teil von PuTTY) verwenden.

plink [email protected] -pw your_password
0