fuse.py: GUI für fusessh connect...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich möchte gern eine Möglichkeit haben über fuse eine sshfs einzubinden. Das soll möglichst bequem ein und ausschaltbar sein. (Hab noch kein Programm dafür gefunden)

Damit das einbinden einfach und schnell passieren kann, hab ich mal gesucht, ob man an den GNOME password-keyring von Python aus dran kommt. Ich hab was gefunden:
http://www.rittau.org/gnome/python/keyring.py

Das geht schon mal super einfach und es funktioniert.

Nun möchte ich per subprocess das Mounting anstoßen und dabei das Passwort angeben.
Das Problem ist allerdings, es erscheint immer ein Fenster von OpenSSH auf und verlangt das Passwort (Wenn ich es Eclipse starte).
Wenn ich das ganze in der Konsole ausführe, kann ich aber anscheinend auch kein Passwort mit process.stdin.write() angeben. Der Passwort-Prompt scheint bis zum User anzukommen.

Was da jemand weiter?

EDIT: Hm. Hab eine mögliche Erklärung gefunden:
Rebecca hat geschrieben:ssh und su (und wohl auch sudo) funktionieren nur, wenn sie ueber ptys/ttys ausgefuehrt werden, und nicht ueber pipes an stdin/stdout/stderr, wie es subprocess/popen/ machen.
http://www.python-forum.de/post-64126.html#64126

EDIT2: Evtl. eine Lösung gefunden:
modelnine hat geschrieben:Interaktive Shell zeichnet sich dadurch aus, dass sie an ein Terminal gebunden ist, und wenn eben die Programme eine interaktive Shell verlangen, dann bleibt Dir nix anderes übrig als Dich ans pty-Modul zu wenden, was ihnen ein echten Terminal vorspielt...
http://www.python-forum.de/post-32768.html#32768

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
tiax
User
Beiträge: 152
Registriert: Samstag 23. Juli 2005, 17:28
Kontaktdaten:

ein für die ganze Sitzung gestarteter SSH-Agent, dessen Kennwort mittels Seahorse auch im GNOME-Keyring gespeichert werden kann oder das mittels libpam-ssh statt dem lokalen Kennwort genutzt wird, um die lokale Sitzung zu ermöglichen, würde dir da wohl viel Ärger sparen und wäre eine "gebräuchliche" Lösung.
Ne invoces expellere non possis
[url=xmpp://florian@florianheinle.de]xmpp:florian@florianheinle.de[/url]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

@tiax: Wenn du mir sagen kannst, wie das genau funktioniert, versuche ich das mal... Kann es sein, das der SSH-Agent nur für die Passphrase bei einem Public-Key-Auth funktioniert?
Weißt du wo ich eine Anleitung dafür finde?

Zwischenzeitlich hab ich es mal mit pexpect probiert:

Code: Alles auswählen

import os, sys, subprocess
import pexpect

from keyring import Keyring

SSHFS_BIN = "/usr/bin/sshfs"

username = "UserName"
server = "domain.tld"
server_dir = "/home/"

port = "22"
keyring_type = "sftp"

home_dir = os.environ["HOME"]
fuse_dir = "%s/FUSE/sshfs/%s" % (home_dir, server)
print "use fuse dir:", fuse_dir

address = "%s@%s" % (username, server)

cmd = (
    '%(sshfs_bin)s'
    ' %(address)s:%(server_dir)s'
    ' %(fuse_dir)s'
    ' -o port=%(port)s'
) % {
    "sshfs_bin": SSHFS_BIN,
    "address": address,
    "server_dir": server_dir,
    "fuse_dir": fuse_dir,
    "port": port,
}
print cmd

child = pexpect.spawn(cmd, timeout=5)
child.expect('password:')

k = Keyring(address, server, keyring_type)
username, password = k.get_credentials()

child.sendline(password)
print child.before
child.close()
Das sollte eigentlich so gehen. .expect('password:') trifft auch zu. das senden mit sendline() geht auch. Dennoch bekomme ich den OpenSSH Dialog für die Eingabe des Passwortes :(

EDIT: Hm! Warum so umständlich. Es gibt ja Die Python-FUSE-Bindings: http://fuse.sourceforge.net/wiki/index.php/FusePython
Die schau ich mir mal an...

EDIT2: Ne, FusePython ist nicht wirklich das was ich dachte. Anscheinend ist es dazu da, ein eigenes Filesystem zu bauen :(

EDIT3: Ah! Es scheint zu gehen, wenn ich child.expect('password:') das ein wenig toleranter mache: seen = child.expect('.*password:.*') :?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten