| 1 | # Copyright (c) Twisted Matrix Laboratories. |
|---|
| 2 | # See LICENSE for details. |
|---|
| 3 | |
|---|
| 4 | # |
|---|
| 5 | from twisted.conch.ssh.transport import SSHClientTransport, SSHCiphers |
|---|
| 6 | from twisted.python import usage |
|---|
| 7 | |
|---|
| 8 | import sys |
|---|
| 9 | |
|---|
| 10 | class ConchOptions(usage.Options): |
|---|
| 11 | |
|---|
| 12 | optParameters = [['user', 'l', None, 'Log in using this user name.'], |
|---|
| 13 | ['identity', 'i', None], |
|---|
| 14 | ['ciphers', 'c', None], |
|---|
| 15 | ['macs', 'm', None], |
|---|
| 16 | ['port', 'p', None, 'Connect to this port. Server must be on the same port.'], |
|---|
| 17 | ['option', 'o', None, 'Ignored OpenSSH options'], |
|---|
| 18 | ['host-key-algorithms', '', None], |
|---|
| 19 | ['known-hosts', '', None, 'File to check for host keys'], |
|---|
| 20 | ['user-authentications', '', None, 'Types of user authentications to use.'], |
|---|
| 21 | ['logfile', '', None, 'File to log to, or - for stdout'], |
|---|
| 22 | ] |
|---|
| 23 | |
|---|
| 24 | optFlags = [['version', 'V', 'Display version number only.'], |
|---|
| 25 | ['compress', 'C', 'Enable compression.'], |
|---|
| 26 | ['log', 'v', 'Enable logging (defaults to stderr)'], |
|---|
| 27 | ['nox11', 'x', 'Disable X11 connection forwarding (default)'], |
|---|
| 28 | ['agent', 'A', 'Enable authentication agent forwarding'], |
|---|
| 29 | ['noagent', 'a', 'Disable authentication agent forwarding (default)'], |
|---|
| 30 | ['reconnect', 'r', 'Reconnect to the server if the connection is lost.'], |
|---|
| 31 | ] |
|---|
| 32 | |
|---|
| 33 | compData = usage.Completions( |
|---|
| 34 | mutuallyExclusive=[("agent", "noagent")], |
|---|
| 35 | optActions={ |
|---|
| 36 | "user": usage.CompleteUsernames(), |
|---|
| 37 | "ciphers": usage.CompleteMultiList( |
|---|
| 38 | SSHCiphers.cipherMap.keys(), |
|---|
| 39 | descr='ciphers to choose from'), |
|---|
| 40 | "macs": usage.CompleteMultiList( |
|---|
| 41 | SSHCiphers.macMap.keys(), |
|---|
| 42 | descr='macs to choose from'), |
|---|
| 43 | "host-key-algorithms": usage.CompleteMultiList( |
|---|
| 44 | SSHClientTransport.supportedPublicKeys, |
|---|
| 45 | descr='host key algorithms to choose from'), |
|---|
| 46 | #"user-authentications": usage.CompleteMultiList(? |
|---|
| 47 | # descr='user authentication types' ), |
|---|
| 48 | }, |
|---|
| 49 | extraActions=[usage.CompleteUserAtHost(), |
|---|
| 50 | usage.Completer(descr="command"), |
|---|
| 51 | usage.Completer(descr='argument', |
|---|
| 52 | repeat=True)] |
|---|
| 53 | ) |
|---|
| 54 | |
|---|
| 55 | def __init__(self, *args, **kw): |
|---|
| 56 | usage.Options.__init__(self, *args, **kw) |
|---|
| 57 | self.identitys = [] |
|---|
| 58 | self.conns = None |
|---|
| 59 | |
|---|
| 60 | def opt_identity(self, i): |
|---|
| 61 | """Identity for public-key authentication""" |
|---|
| 62 | self.identitys.append(i) |
|---|
| 63 | |
|---|
| 64 | def opt_ciphers(self, ciphers): |
|---|
| 65 | "Select encryption algorithms" |
|---|
| 66 | ciphers = ciphers.split(',') |
|---|
| 67 | for cipher in ciphers: |
|---|
| 68 | if not SSHCiphers.cipherMap.has_key(cipher): |
|---|
| 69 | sys.exit("Unknown cipher type '%s'" % cipher) |
|---|
| 70 | self['ciphers'] = ciphers |
|---|
| 71 | |
|---|
| 72 | |
|---|
| 73 | def opt_macs(self, macs): |
|---|
| 74 | "Specify MAC algorithms" |
|---|
| 75 | macs = macs.split(',') |
|---|
| 76 | for mac in macs: |
|---|
| 77 | if not SSHCiphers.macMap.has_key(mac): |
|---|
| 78 | sys.exit("Unknown mac type '%s'" % mac) |
|---|
| 79 | self['macs'] = macs |
|---|
| 80 | |
|---|
| 81 | def opt_host_key_algorithms(self, hkas): |
|---|
| 82 | "Select host key algorithms" |
|---|
| 83 | hkas = hkas.split(',') |
|---|
| 84 | for hka in hkas: |
|---|
| 85 | if hka not in SSHClientTransport.supportedPublicKeys: |
|---|
| 86 | sys.exit("Unknown host key type '%s'" % hka) |
|---|
| 87 | self['host-key-algorithms'] = hkas |
|---|
| 88 | |
|---|
| 89 | def opt_user_authentications(self, uas): |
|---|
| 90 | "Choose how to authenticate to the remote server" |
|---|
| 91 | self['user-authentications'] = uas.split(',') |
|---|
| 92 | |
|---|
| 93 | # def opt_compress(self): |
|---|
| 94 | # "Enable compression" |
|---|
| 95 | # self.enableCompression = 1 |
|---|
| 96 | # SSHClientTransport.supportedCompressions[0:1] = ['zlib'] |
|---|