# 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 <slash@dotnetslash.net>
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
|