2016-04-14 3 views
2

Ich habe ein Python-Skript, das einen Linux-Benutzer erstellt, mit einem Benutzernamen und einem Passwort als Argumente. Ich möchteWie Passwörter als Argument an ein Python-Skript über SSH übergeben?

  • rufen Sie das Skript direkt (zB ./pass.py)
  • rufen Sie das Skript auf dem gleichen VM von Python (zB subprocess.Popen('/pass.py'))
  • rufen Sie das Skript aus einer anderen VM aus Python über SSH. (Z.B. subprocess.Popen(['ssh', 'host', 'pass.py'))

TL; DR den endgültigen Code snippit prüfen und

getpass Arbeiten für den ersten Fall in Frage stellen.

password = getpass.getpass() 

Allerdings, wenn ich diese über ssh laufen, (ssh myhost /path/to/script.py username) bekomme ich folgende Ausgabe:

/usr/lib64/python2.6/getpass.py:83: GetPassWarning: Can not control echo on the terminal. 
    passwd = fallback_getpass(prompt, stream) 
Warning: Password input may be echoed. 
Password: password123 

Auch, wenn ich dieses Skript in Python laufen mit subprocess:

# Running from same host 
proc = subprocess.Popen(['./pass.py'], stdin=subprocess.PIPE) 
# Running from different host 
proc = subprocess.Popen(['ssh', 'myhost', '/path/to/pass.py', 'username'], stdin=subprocess.PIPE) 

Es scheint um subprocess.Popen hängen und wird das Passwort nicht akzeptieren.

Wenn ich jedoch getpass.getpass() los und ersetzen Sie es durch raw_input, funktioniert es für die Fälle 2 und 3. Es gibt nicht das Passwort zurück.

ich daher statt der folgenden denke, die --script als Argument übernimmt und fragt nach dem Passwort über raw_input:

import sys, getpass, argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("username") 
parser.add_argument("-s", "--script", action="store_true") 
args = parser.parse_args() 
username = args.username 
if args.script: 
    password = raw_input("Password: ") 
else: 
    password = getpass.getpass() 

Diese alle drei meiner Fälle erfüllt und scheint nicht das Passwort zu Echo .

Stimmt die Annahme, dass dies sicher ist und das Passwort nicht protokolliert wird?

Antwort

0

Sie können -t während einer SSH-Sitzung hinzufügen, die ein echofreies Terminal erzwingt. Auf dem Client:

#!/usr/bin/env python 

import subprocess 

subprocess.call(["ssh", "-t", remote_host, "./add_user.py", "test_user"]) 

Dann sollten Sie in der Lage sein, auf dem Server für ein Remote-Passwort verwenden getpass. Sie können es auch direkt aufrufen oder über ein anderes Skript aufrufen:

#!/usr/bin/env python 

import getpass, argparse 

parser = argparse.ArgumentParser() 
parser.add_argument("username") 
args = parser.parse_args() 
username = args.username 
password = getpass.getpass() 
Verwandte Themen