#! /usr/bin/env python3 """pwgen generates passwords for your needs. Usage: pwgen [OPTION...] -c, --chars STRING define a charset -C, --charset ascii|hex|alphanum use a predefined charset (default=ascii) -h, --help display this help -l, --length INTEGER passwords length (default=64) -n, --number INTEGER number of passwords (default=1)""" # imports from random import SystemRandom import getopt import sys # usage exception class Usage(Exception): def __init__(self, msg): self.msg = msg # main function def main(argv=None): if argv is None: argv = sys.argv try: # parse command line options try: opts, argv = getopt.getopt(argv[1:], "c:C:hl:n:", ["chars=", "charset=", "help", "length=", "number="]) except getopt.error as msg: raise Usage(msg) # define default args chars = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~" length = 64 number = 1 # process options for opt, arg in opts: if opt in ("-c", "--chars"): try: chars = str(arg) except ValueError as err: raise Usage(err) if opt in ("-C", "--charset"): if(arg == "alphanum"): chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" elif(arg == "ascii"): chars = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~" elif(arg == "hex"): chars = "0123456789ABCDEF" if opt in ("-h", "--help"): print(__doc__) return 0 if opt in ("-l", "--length"): try: length = int(arg) except ValueError as err: raise Usage(err) if opt in ("-n", "--number"): try: number = int(arg) except ValueError as err: raise Usage(err) # generate passwords random = SystemRandom() for i in range(number): print("".join([random.choice(chars) for i in range(length)])) # print last character indicator to stderr print(' ' * (length - 1) + '^', file=sys.stderr) except Usage as err: print(err.msg, file=sys.stderr) print("for help use --help", file=sys.stderr) return 2 if __name__ == "__main__": sys.exit(main())