GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Senden eines Passworts über SSH oder SCP mit subprocess.Popen

Das OpenSSH scp Dienstprogramm ruft ssh auf Programm, um die SSH-Verbindung zum Remote-Host herzustellen, und der ssh-Prozess übernimmt die Authentifizierung. Die ssh Das Dienstprogramm akzeptiert kein Kennwort in der Befehlszeile oder in seiner Standardeingabe. Ich glaube, dass dies eine bewusste Entscheidung seitens der OpenSSH-Entwickler ist, weil sie der Meinung sind, dass die Leute sicherere Mechanismen wie die schlüsselbasierte Authentifizierung verwenden sollten. Jede Lösung zum Aufrufen von ssh folgt einem dieser Ansätze:

  1. Verwenden Sie anstelle eines Passworts einen SSH-Schlüssel zur Authentifizierung.
  2. Verwenden Sie sshpass, Expect oder ein ähnliches Tool, um die Antwort auf die Passwortabfrage zu automatisieren.
  3. Verwenden (missbrauchen) Sie die SSH_ASKPASS-Funktion, um ssh zu erhalten um das Passwort zu erhalten, indem Sie einen anderen Befehl aufrufen, der hier oder hier oder in einigen der Antworten hier beschrieben wird.
  4. Bitten Sie den SSH-Serveradministrator, die hostbasierte Authentifizierung zu aktivieren und diese zu verwenden. Beachten Sie, dass die hostbasierte Authentifizierung nur für bestimmte Netzwerkumgebungen geeignet ist. Weitere Hinweise finden Sie hier und hier.
  5. Schreiben Sie Ihren eigenen SSH-Client mit Perl, Python, Java oder Ihrer bevorzugten Sprache. Es gibt ssh-Client-Bibliotheken für die meisten modernen Programmiersprachen, und Sie hätten die volle Kontrolle darüber, wie der Client das Passwort erhält.
  6. Laden Sie den SSH-Quellcode herunter und erstellen Sie eine modifizierte Version von ssh das funktioniert wie du willst.
  7. Verwenden Sie einen anderen SSH-Client. Es sind andere ssh-Clients verfügbar, sowohl kostenlose als auch kommerzielle. Einer davon könnte Ihren Anforderungen besser entsprechen als der OpenSSH-Client.

In diesem speziellen Fall, da Sie bereits scp aufrufen Aus einem Python-Skript scheint einer der folgenden der vernünftigste Ansatz zu sein:

  1. Verwenden Sie pexpect, das Python-Erwartungsmodul, um scp aufzurufen und geben Sie das Passwort ein.
  2. Verwenden Sie paramiko, die Python-SSH-Implementierung, um diese SSH-Aufgabe auszuführen, anstatt ein externes Programm aufzurufen.

Hier ist eine Funktion zu ssh mit einem Passwort mit pexpect :

import pexpect
import tempfile

def ssh(host, cmd, user, password, timeout=30, bg_run=False):                                                                                                 
    """SSH'es to a host using the supplied credentials and executes a command.                                                                                                 
    Throws an exception if the command doesn't return 0.                                                                                                                       
    bgrun: run command in the background"""                                                                                                                                    
                                                                                                                                                                               
    fname = tempfile.mktemp()                                                                                                                                                  
    fout = open(fname, 'w')                                                                                                                                                    
                                                                                                                                                                               
    options = '-q -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -oPubkeyAuthentication=no'                                                                         
    if bg_run:                                                                                                                                                         
        options += ' -f'                                                                                                                                                       
    ssh_cmd = 'ssh %[email protected]%s %s "%s"' % (user, host, options, cmd)                                                                                                                 
    child = pexpect.spawn(ssh_cmd, timeout=timeout)  #spawnu for Python 3                                                                                                                          
    child.expect(['[pP]assword: '])                                                                                                                                                                                                                                                                                               
    child.sendline(password)                                                                                                                                                   
    child.logfile = fout                                                                                                                                                       
    child.expect(pexpect.EOF)                                                                                                                                                  
    child.close()                                                                                                                                                              
    fout.close()                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                        
    fin = open(fname, 'r')                                                                                                                                                     
    stdout = fin.read()                                                                                                                                                        
    fin.close()                                                                                                                                                                
                                                                                                                                                                               
    if 0 != child.exitstatus:                                                                                                                                                  
        raise Exception(stdout)                                                                                                                                                
                                                                                                                                                                               
    return stdout

Ähnliches sollte mit scp möglich sein .


Die zweite Antwort, die Sie verlinkt haben, schlägt vor, dass Sie Pexpect verwenden (was normalerweise der richtige Weg ist, um mit Befehlszeilenprogrammen zu interagieren, die Eingaben erwarten). Es gibt einen Fork davon, der für python3 funktioniert und den Sie verwenden können.


Linux
  1. SSH-Passwortautomatisierung in Linux mit sshpass

  2. Ssh – Erhalten Sie immer noch eine Passwortabfrage mit Ssh mit Authentifizierung mit öffentlichem Schlüssel?

  3. Oring mit True in einem Befehl über SSH?

  4. So deaktivieren Sie die SSH-Anmeldung mit Passwort

  5. So richten Sie Rsync mit SSH unter UNIX / Linux ein (rsync ohne Passwort)

SSH-Passworttest mit Hydra unter Kali Linux

So übertragen Sie Dateien mit Rsync über SSH

Führen Sie SSH und SCP ohne Passworteingabe auf openSSH aus

Wie richte ich Rsync ohne Passwort mit SSH unter UNIX / Linux ein?

Rsync mit SSH-Aufforderung zur Eingabe des Remote-Passworts

Ist es unsicher, einen ansiblen Benutzer mit passwortlosem sudo zu haben?