Code: Alles auswählen
def connect():
# Parameter, werden eigentlich anders übergeben
keyFile = None # '~/.ssh/id_rsa'
host = 'domain.org'
port = 22
username = 'user'
# Die eigentliche Funktion
transport = paramiko.Transport((host, port))
sftp = None
if keyFile is None:
try:
transport.connect(username=username, password=getpass.getpass('Password? ')))
except paramiko.ssh_exception.BadAuthenticationType:
raise Exception('Set a keyFile!')
else:
key = None
keyFile = os.path.expanduser(keyFile)
try:
key = paramiko.RSAKey.from_private_key_file(keyFile)
except paramiko.ssh_exception.PasswordRequiredException:
key = paramiko.RSAKey.from_private_key_file(keyFile, password=getpass.getpass('Password? '))
transport.connect(username=username, pkey=key)
sftp = paramiko.SFTPClient.from_transport(self.transport)
return transport, sftp
Wenn in der Variable keyFile eine Text steht (zum Beispiel '~/.ssh/id_rsa'), so soll der Login zum Server via PublicKey geschehen, falls nicht wird ein normaler Passwort-Login verwendet.
Angenommen der Nutzer lässt None in der Variable keyFile stehen und es tritt eine paramiko.ssh_exception.BadAuthenticationType-Exception auf, weil der Server nur PublicKey zulässt: Ist es möglich, in den else-Teil zu springen und es mittels PublicKey zu probieren?
Falls keyFile None ist kann man im else-Teil ja den Wert auf '~/.ssh/id_rsa' setzen. Natürlich könnte man auch innerhalb der Exception den ganzen Code nochmals schreiben, aber ich habe nie zweimal denselben Code in einem Programm.
Und ja, man könnte auch eine weitere Funktion connetFromKeyFile() oder ähnliches definieren, meine Frage ist aber ob es möglich ist aus der Exception direkt in den else-Teil zu springen. Würde mich mal interessieren.
mfg