для работы нужны модули paramiko и progressbar Code: #!/usr/bin/env python """ sh.imizu@yahoo.com """ import sys import socket import paramiko import optparse import logging import ftplib import fileinput import progressbar as bar from multiprocessing import Pool, log_to_stderr from urlparse import urlparse def parse(file): f = fileinput.input([file]) q = [] try: for line in f: u = urlparse("ftp://" + line[:-1]) try: q.append((u.username,u.password,u.hostname,u.port)) except ValueError: pass except IOError: print "The file does not exist, exiting gracefully." sys.exit() f.close() q[:] = [x for x in q if x is not None] return q def ssh_check(q): on = False port = 22 try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(q[2], username=q[0], password=q[1], port=port, timeout=timeout) on = True ssh.close() except: pass return on,q def ftp_check(q): on = False if q[3]: port = q[3] else: port = 21 try: socket.setdefaulttimeout = timeout ftp = ftplib.FTP(q[2],timeout=timeout) ftp.login(q[0], q[1]) on = True ftp.close() except: pass return on,q def write_(a,b): f = open ( output + "-true", 'w' ) for aa in a: f.write("+++\t%s:%s@%s\n" % (aa[0],aa[1],aa[2])) f.close() fb = open ( output + "-false", 'w' ) for bb in b: fb.write("---\t%s:%s@%s\n" % (bb[0],bb[1],bb[2])) fb.close() def spawn(what,parsed,x): class line_up(): def update(self, pbar): return "+" + str(len(a)) + "/-" + str(len(b)) + "/" + str(total) pool = Pool(processes=x) a,b,total = [],[],len(parsed) widgets = [bar.Percentage(), ' ', bar.Bar(marker='-'),' ', bar.ETA(),' ',line_up()] pbar = bar.ProgressBar(widgets=widgets, maxval=total).start() results = [pool.apply_async(what, [t]) for t in parsed] for r in results: try: q = r.get() if q[0]: a.append(q[1]) else: b.append(q[1]) try: pbar.update(len(a) + len(b)) except AssertionError: pass except IndexError: pass pbar.finish() print return a,b def main(): p = optparse.OptionParser(description='FTP/SSH list checker', prog='py-check', version='0.1', usage='%prog -m ftp/ssh -t num-of-threads -o out-file-prefix') p.add_option('-t', type="int", dest="threads", help='Number of threads to spawn', default=5) p.add_option('-m', type="string", dest="mode", help='Mode to run: ftp/ssh', default="ssh") p.add_option('-o', type="string", dest="output", help='File to store results', default="check") p.add_option('-T', type="int", dest="timeout", help='Timeout in seconds', default=10) options, arguments = p.parse_args() global timeout,output timeout,output = options.timeout,options.output paramiko.util.log_to_file('/dev/null') if len(arguments) == 1: if options.mode == "ssh": what = ssh_check elif options.mode == "ftp": what = ftp_check else: what = ssh_check a, b = spawn(what,parse(arguments[0]),options.threads) write_(a,b) else: p.print_help() if __name__ == '__main__': main()