# vi:et:ts=4:tw=0 """ fssa.py Search for an ssh-agent for the calling user and attach to it if found. Tested on poxix only """ # This is a Python port of Steve Allen's fsa.sh script found # at http://www.ucolick.org/~sla/ssh/sshcron.html # Ported by Mark W. Alexander import os if os.name == 'posix': import pwd, stat, sys from commands import getoutput def fssa(key=None): """ fssa(key=None) Searches /tmp/ssh-* owned by the calling user for ssh-agent sockets. If key is provided, only sockets matching the key will be considered. If key is not provided, the calling users username will be used instead. """ user, pw, uid, gid, gecos, home, shell = pwd.getpwuid(os.getuid()) if key is None: key = user # Find /tmp/ssh-* dirs owned by this user candidate_dirs=[] for filename in os.listdir('/tmp'): file_stat = os.stat("/tmp/%s" % (filename)) if file_stat[stat.ST_UID] == os.getuid() \ and stat.S_ISDIR(file_stat[stat.ST_MODE]) \ and filename.find('ssh-') == 0: candidate_dirs.append("/tmp/%s" % filename) candidate_sockets=[] for d in candidate_dirs: for f in os.listdir(d): file_stat = os.stat("%s/%s" % (d, f)) if file_stat[stat.ST_UID] == os.getuid() \ and stat.S_ISSOCK(file_stat[stat.ST_MODE]) \ and f.find('agent.') == 0: candidate_sockets.append("%s/%s" % (d, f)) alive = None # order by pid, prefering sockets where the parent pid # is gone. This gives preference to agents running in the # background and reaped by init (maybe). Only works on # systems with a /proc filesystem if stat.S_ISDIR(os.stat("/proc")[stat.ST_MODE]): reorder=[] for s in candidate_sockets: pid = s[s.find('.')+1:] try: stat.S_ISDIR(os.stat("/proc/%s" % pid)[stat.ST_MODE]) reorder.append(s) except: reorder.insert(0,s) candidate_sockets = reorder for s in candidate_sockets: os.environ['SSH_AUTH_SOCK'] = s try: pubkey = getoutput("ssh-add -l 2>/dev/null") except: continue if pubkey.find(key): alive = 1 break os.environ.pop('SSH_AUTH_SOCK') if alive: return pubkey else: return None