diff --git a/tsshbatch.py b/tsshbatch.py index 0558abd..4bfb642 100755 --- a/tsshbatch.py +++ b/tsshbatch.py @@ -20,7 +20,7 @@ CMDINCL = PROGENV + "CMDS" HOSTINCL = PROGENV + "HOSTS" -CVSID = "$Id: tsshbatch.py,v 1.177 2014/03/27 22:12:33 tundra Exp $" +CVSID = "$Id: tsshbatch.py,v 1.178 2014/03/28 20:16:39 tundra Exp $" VERSION = CVSID.split()[2] CPRT = "(c)" DATE = "2011-2014" @@ -70,7 +70,7 @@ HOSTNOISE = '[%s]' HOSTLIST = 'Hosts' INDENTWIDTH = 8 -OPTIONSLIST = 'KG:H:NP:Sef:hkn:p:tvxy' +OPTIONSLIST = 'KG:H:NP:ST:ef:hkn:p:tvxy' PADWIDTH = 12 PATHDELIM = ':' PATHSEP = os.sep @@ -89,7 +89,7 @@ USAGE = \ PROGVER + "\n" +\ HOMEPAGE + "\n\n" +\ - "Usage: tsshbatch.py [-NSehkvxy -G 'file dest' -P 'file dest' -f cmdfile -n name -p pw ] -H 'host ..' | hostlistfile [command arg ... ]\n" +\ + "Usage: tsshbatch.py [-NSTehkvxy -G 'file dest' -P 'file dest' -f cmdfile -n name -p pw ] -H 'host ..' | hostlistfile [command arg ... ]\n" +\ " where,\n" +\ "\n" +\ " -K Force password prompting - Overrides previous -k\n" +\ @@ -98,13 +98,14 @@ " -N Force prompting for username\n" +\ " -P 'file dest' PUT local file to host dest directory\n" +\ " -S Force prompting for sudo password\n" +\ + " -T seconds Timeout for ssh connection attempts\n" +\ " -e Don't report remote host stderr output\n" +\ " -f cmdfile Read commands from file\n" +\ " -h Display help\n" +\ " -k Use key exchange-based authentication\n" +\ " -n name Specify login name\n" +\ " -p pw Specify login password\n" +\ - " -t Run in test mode, don't actually execute commands\n" +\ + " -t Run in test mode, don't actually execute commands\n" +\ " -v Display extended program version information\n" +\ " -x Turn off test mode (if on) and execute requests\n" +\ " -y Turn on 'noisy' reporting for additional detail\n" @@ -141,9 +142,10 @@ eBADSUDO = "sudo Failed (Check Password Or Command!) sudo Error Report: %s" eBADTXRQ = "Bad Transfer Request: %s Must Have Exactly 1 Source And 1 Destination!" eBADDEFINE = "Bad Symbol Definition: %s" +eBADTIMEOUT = "Timeout Value Must Be an Integer!" eFXERROR = "File Transfer Error: %s" eINCLUDECYCLE = "Circular Include At: %s" -eNOCONNECT = "Cannot Connect To %s" +eNOCONNECT = "Cannot Connect: %s" eNOHOSTS = "No Hosts Specified!" eNOLOGIN = "Cannot Login! (Login/Password Bad?)" @@ -176,6 +178,7 @@ PWORD = "" # Password REPORTERR = True # Report stderr output from remote host TESTMODE = True # Run program in test mode, don't actually execute commands +TIMEOUT = 10 # Connection attempt timeout (sec) UNAME = "" # Login name @@ -249,9 +252,9 @@ ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) if KEYEXCHANGE: - ssh.connect(host) + ssh.connect(host, timeout=TIMEOUT) else: - ssh.connect(host, username=user, password=pw) + ssh.connect(host, username=user, password=pw, timeout=TIMEOUT) sftp = ssh.open_sftp() @@ -288,9 +291,6 @@ ssh.close() except: - - sftp.close() - ssh.close() ErrorExit(eFXERROR % (sys.exc_info()[1])) # End of 'HostFileTransfer()' @@ -306,10 +306,10 @@ ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) if KEYEXCHANGE: - ssh.connect(host) + ssh.connect(host, timeout=TIMEOUT) else: - ssh.connect(host, username=user, password=pw) + ssh.connect(host, username=user, password=pw, timeout=TIMEOUT) PrintReport([host, CONSUCCESS]) @@ -373,7 +373,7 @@ # Everything else is some kind of connection problem except: - PrintReport([host, FAILURE % (eNOCONNECT % sys.exc_info()[1].strerror)], HANDLER=PrintStderr) + PrintReport([host, FAILURE % (eNOCONNECT % str(sys.exc_info()[1]))], HANDLER=PrintStderr) ssh.close() @@ -590,6 +590,12 @@ if opt == "-S": GETSUDOPW = True + if opt == "-T": + try: + TIMEOUT = int(val) + except: + ErrorExit(eBADTIMEOUT) + if opt == "-e": REPORTERR = False