Repository files navigation

TACACS+ Python client

Build Status

A TACACS+ client that supports authentication, authorization and accounting.

Unlike RADIUS, which was designed for similar purposes, the TACACS+ protocol offers basic packet encryption but, as with most crypto designed back then, it's not secure and definitely should not be used over untrusted networks.

This package has been successfully used with the free tac_plus TACACS+ server on a variety of operating systems.

Basic Installation and Usage

$ pip install tacacs_plus
$ tacacs_client -u myuser -H localhost authenticate
$ tacacs_client -u myuser -H localhost authenticate -t pap
$ tacacs_client -u myuser -H localhost -v authenticate -t chap
status: PASS
$ tacacs_client -u myuser -H localhost authorize -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=shell cmd=show cmdarg=version
status: PASS
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=junos-exec
status: REPL
av-pairs:
allow-commands=^acommandregex$
deny-commands=^anothercommandregex$
$ tacacs_client -u myuser -H localhost account -f start -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost account -f stop -c service=shell cmd=show cmdarg=version
$ tacacs_client -h
usage: tacacs_client [-h] -u USERNAME -H HOST [-p PORT] [-l PRIV_LVL]
[-t {ascii,pap,chap}] [-r REM_ADDR] [-P VIRTUAL_PORT]
[--timeout TIMEOUT] [-d] [-v] [-k KEY]
{authenticate,authorize,account} ...
Tacacs+ client with full AAA support:
* Authentication supports both ascii, pap and chap.
* Authorization supports AV pairs and single commands.
* Accounting support AV pairs and single commands.
NOTE: shared encryption key can be set via environment variable TACACS_PLUS_KEY or via argument.
NOTE: user password can be setup via environment variable TACACS_PLUS_PWD or via argument.
positional arguments:
{authenticate,authorize,account}
action to perform over the tacacs+ server
authenticate authenticate against a tacacs+ server
authorize authorize a command against a tacacs+ server
account account commands with accounting flags against a tacacs+ server
optional arguments:
-h, --help show this help message and exit
-u USERNAME, --username USERNAME
user name
-H HOST, --host HOST tacacs+ server address
-p PORT, --port PORT tacacs+ server port (default 49)
-l PRIV_LVL, --priv-lvl PRIV_LVL
user privilege level
-t {ascii,pap,chap}, --authen-type {ascii,pap,chap}
authentication type
-r REM_ADDR, --rem-addr REM_ADDR
remote address (logged by tacacs server)
-P VIRTUAL_PORT, --virtual-port VIRTUAL_PORT
console port used in connection (logged by tacacs server)
--timeout TIMEOUT
-d, --debug enable debugging output
-v, --verbose print responses
-6, --v6 use IPv6 addresses
-k KEY, --key KEY tacacs+ shared encryption key
$ tacacs_client authenticate -h
usage: tacacs_client authenticate [-h] [-p PASSWORD]
optional arguments:
-h, --help show this help message and exit
-p PASSWORD, --password PASSWORD
user password
$ tacacs_client authorize -h
usage: tacacs_client authorize [-h] -c CMDS [CMDS ...]
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
$ tacacs_client account -h
usage: tacacs_client account [-h] -c CMDS [CMDS ...] -f {start,stop,update}
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
-f {start,stop,update}, --flag {start,stop,update}
accounting flag

Programmatic Usage

#!/usr/bin/env pythonfrom __future__ importprint_functionfromtacacs_plus.clientimportTACACSClientfromtacacs_plus.flagsimportTAC_PLUS_ACCT_FLAG_START, TAC_PLUS_ACCT_FLAG_WATCHDOG, TAC_PLUS_ACCT_FLAG_STOPimportsocket# For IPv6, use `family=socket.AF_INET6`cli=TACACSClient('host', 49, 'secret', timeout=10, family=socket.AF_INET)
# authenticate user and passauthen=cli.authenticate('username', 'password')
print("PASS!"ifauthen.validelse"FAIL!")
# authorize user and commandauthor=cli.authorize('username', arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifauthor.validelse"FAIL!")
# start accounting session for commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_START, arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifacct.validelse"FAIL!")
# continue accounting session for another commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_WATCHDOG, arguments=[b"service=shell", b"cmd=debug", b"cmdargs=aaa"])
print("PASS!"ifacct.validelse"FAIL!")
# close accounting sessionacct=cli.account('username', TAC_PLUS_ACCT_FLAG_STOP, arguments=[b"service=shell", b"cmd=exit"])
print("PASS!"ifacct.validelse"FAIL!")

About

A Python-based TACACS+ client that supports authentication, authorization and accounting.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

TACACS+ Python client

Build Status

A TACACS+ client that supports authentication, authorization and accounting.

Unlike RADIUS, which was designed for similar purposes, the TACACS+ protocol offers basic packet encryption but, as with most crypto designed back then, it's not secure and definitely should not be used over untrusted networks.

This package has been successfully used with the free tac_plus TACACS+ server on a variety of operating systems.

Basic Installation and Usage

$ pip install tacacs_plus
$ tacacs_client -u myuser -H localhost authenticate
$ tacacs_client -u myuser -H localhost authenticate -t pap
$ tacacs_client -u myuser -H localhost -v authenticate -t chap
status: PASS
$ tacacs_client -u myuser -H localhost authorize -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=shell cmd=show cmdarg=version
status: PASS
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=junos-exec
status: REPL
av-pairs:
allow-commands=^acommandregex$
deny-commands=^anothercommandregex$
$ tacacs_client -u myuser -H localhost account -f start -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost account -f stop -c service=shell cmd=show cmdarg=version
$ tacacs_client -h
usage: tacacs_client [-h] -u USERNAME -H HOST [-p PORT] [-l PRIV_LVL]
[-t {ascii,pap,chap}] [-r REM_ADDR] [-P VIRTUAL_PORT]
[--timeout TIMEOUT] [-d] [-v] [-k KEY]
{authenticate,authorize,account} ...
Tacacs+ client with full AAA support:
* Authentication supports both ascii, pap and chap.
* Authorization supports AV pairs and single commands.
* Accounting support AV pairs and single commands.
NOTE: shared encryption key can be set via environment variable TACACS_PLUS_KEY or via argument.
NOTE: user password can be setup via environment variable TACACS_PLUS_PWD or via argument.
positional arguments:
{authenticate,authorize,account}
action to perform over the tacacs+ server
authenticate authenticate against a tacacs+ server
authorize authorize a command against a tacacs+ server
account account commands with accounting flags against a tacacs+ server
optional arguments:
-h, --help show this help message and exit
-u USERNAME, --username USERNAME
user name
-H HOST, --host HOST tacacs+ server address
-p PORT, --port PORT tacacs+ server port (default 49)
-l PRIV_LVL, --priv-lvl PRIV_LVL
user privilege level
-t {ascii,pap,chap}, --authen-type {ascii,pap,chap}
authentication type
-r REM_ADDR, --rem-addr REM_ADDR
remote address (logged by tacacs server)
-P VIRTUAL_PORT, --virtual-port VIRTUAL_PORT
console port used in connection (logged by tacacs server)
--timeout TIMEOUT
-d, --debug enable debugging output
-v, --verbose print responses
-6, --v6 use IPv6 addresses
-k KEY, --key KEY tacacs+ shared encryption key
$ tacacs_client authenticate -h
usage: tacacs_client authenticate [-h] [-p PASSWORD]
optional arguments:
-h, --help show this help message and exit
-p PASSWORD, --password PASSWORD
user password
$ tacacs_client authorize -h
usage: tacacs_client authorize [-h] -c CMDS [CMDS ...]
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
$ tacacs_client account -h
usage: tacacs_client account [-h] -c CMDS [CMDS ...] -f {start,stop,update}
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
-f {start,stop,update}, --flag {start,stop,update}
accounting flag

Programmatic Usage

#!/usr/bin/env pythonfrom __future__ importprint_functionfromtacacs_plus.clientimportTACACSClientfromtacacs_plus.flagsimportTAC_PLUS_ACCT_FLAG_START, TAC_PLUS_ACCT_FLAG_WATCHDOG, TAC_PLUS_ACCT_FLAG_STOPimportsocket# For IPv6, use `family=socket.AF_INET6`cli=TACACSClient('host', 49, 'secret', timeout=10, family=socket.AF_INET)
# authenticate user and passauthen=cli.authenticate('username', 'password')
print("PASS!"ifauthen.validelse"FAIL!")
# authorize user and commandauthor=cli.authorize('username', arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifauthor.validelse"FAIL!")
# start accounting session for commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_START, arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifacct.validelse"FAIL!")
# continue accounting session for another commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_WATCHDOG, arguments=[b"service=shell", b"cmd=debug", b"cmdargs=aaa"])
print("PASS!"ifacct.validelse"FAIL!")
# close accounting sessionacct=cli.account('username', TAC_PLUS_ACCT_FLAG_STOP, arguments=[b"service=shell", b"cmd=exit"])
print("PASS!"ifacct.validelse"FAIL!")

About

A Python-based TACACS+ client that supports authentication, authorization and accounting.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

TACACS+ Python client

Build Status

A TACACS+ client that supports authentication, authorization and accounting.

Unlike RADIUS, which was designed for similar purposes, the TACACS+ protocol offers basic packet encryption but, as with most crypto designed back then, it's not secure and definitely should not be used over untrusted networks.

This package has been successfully used with the free tac_plus TACACS+ server on a variety of operating systems.

Basic Installation and Usage

$ pip install tacacs_plus
$ tacacs_client -u myuser -H localhost authenticate
$ tacacs_client -u myuser -H localhost authenticate -t pap
$ tacacs_client -u myuser -H localhost -v authenticate -t chap
status: PASS
$ tacacs_client -u myuser -H localhost authorize -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=shell cmd=show cmdarg=version
status: PASS
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=junos-exec
status: REPL
av-pairs:
allow-commands=^acommandregex$
deny-commands=^anothercommandregex$
$ tacacs_client -u myuser -H localhost account -f start -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost account -f stop -c service=shell cmd=show cmdarg=version
$ tacacs_client -h
usage: tacacs_client [-h] -u USERNAME -H HOST [-p PORT] [-l PRIV_LVL]
[-t {ascii,pap,chap}] [-r REM_ADDR] [-P VIRTUAL_PORT]
[--timeout TIMEOUT] [-d] [-v] [-k KEY]
{authenticate,authorize,account} ...
Tacacs+ client with full AAA support:
* Authentication supports both ascii, pap and chap.
* Authorization supports AV pairs and single commands.
* Accounting support AV pairs and single commands.
NOTE: shared encryption key can be set via environment variable TACACS_PLUS_KEY or via argument.
NOTE: user password can be setup via environment variable TACACS_PLUS_PWD or via argument.
positional arguments:
{authenticate,authorize,account}
action to perform over the tacacs+ server
authenticate authenticate against a tacacs+ server
authorize authorize a command against a tacacs+ server
account account commands with accounting flags against a tacacs+ server
optional arguments:
-h, --help show this help message and exit
-u USERNAME, --username USERNAME
user name
-H HOST, --host HOST tacacs+ server address
-p PORT, --port PORT tacacs+ server port (default 49)
-l PRIV_LVL, --priv-lvl PRIV_LVL
user privilege level
-t {ascii,pap,chap}, --authen-type {ascii,pap,chap}
authentication type
-r REM_ADDR, --rem-addr REM_ADDR
remote address (logged by tacacs server)
-P VIRTUAL_PORT, --virtual-port VIRTUAL_PORT
console port used in connection (logged by tacacs server)
--timeout TIMEOUT
-d, --debug enable debugging output
-v, --verbose print responses
-6, --v6 use IPv6 addresses
-k KEY, --key KEY tacacs+ shared encryption key
$ tacacs_client authenticate -h
usage: tacacs_client authenticate [-h] [-p PASSWORD]
optional arguments:
-h, --help show this help message and exit
-p PASSWORD, --password PASSWORD
user password
$ tacacs_client authorize -h
usage: tacacs_client authorize [-h] -c CMDS [CMDS ...]
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
$ tacacs_client account -h
usage: tacacs_client account [-h] -c CMDS [CMDS ...] -f {start,stop,update}
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
-f {start,stop,update}, --flag {start,stop,update}
accounting flag

Programmatic Usage

#!/usr/bin/env pythonfrom __future__ importprint_functionfromtacacs_plus.clientimportTACACSClientfromtacacs_plus.flagsimportTAC_PLUS_ACCT_FLAG_START, TAC_PLUS_ACCT_FLAG_WATCHDOG, TAC_PLUS_ACCT_FLAG_STOPimportsocket# For IPv6, use `family=socket.AF_INET6`cli=TACACSClient('host', 49, 'secret', timeout=10, family=socket.AF_INET)
# authenticate user and passauthen=cli.authenticate('username', 'password')
print("PASS!"ifauthen.validelse"FAIL!")
# authorize user and commandauthor=cli.authorize('username', arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifauthor.validelse"FAIL!")
# start accounting session for commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_START, arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifacct.validelse"FAIL!")
# continue accounting session for another commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_WATCHDOG, arguments=[b"service=shell", b"cmd=debug", b"cmdargs=aaa"])
print("PASS!"ifacct.validelse"FAIL!")
# close accounting sessionacct=cli.account('username', TAC_PLUS_ACCT_FLAG_STOP, arguments=[b"service=shell", b"cmd=exit"])
print("PASS!"ifacct.validelse"FAIL!")

About

A Python-based TACACS+ client that supports authentication, authorization and accounting.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

TACACS+ Python client

Build Status

A TACACS+ client that supports authentication, authorization and accounting.

Unlike RADIUS, which was designed for similar purposes, the TACACS+ protocol offers basic packet encryption but, as with most crypto designed back then, it's not secure and definitely should not be used over untrusted networks.

This package has been successfully used with the free tac_plus TACACS+ server on a variety of operating systems.

Basic Installation and Usage

$ pip install tacacs_plus
$ tacacs_client -u myuser -H localhost authenticate
$ tacacs_client -u myuser -H localhost authenticate -t pap
$ tacacs_client -u myuser -H localhost -v authenticate -t chap
status: PASS
$ tacacs_client -u myuser -H localhost authorize -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=shell cmd=show cmdarg=version
status: PASS
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=junos-exec
status: REPL
av-pairs:
allow-commands=^acommandregex$
deny-commands=^anothercommandregex$
$ tacacs_client -u myuser -H localhost account -f start -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost account -f stop -c service=shell cmd=show cmdarg=version
$ tacacs_client -h
usage: tacacs_client [-h] -u USERNAME -H HOST [-p PORT] [-l PRIV_LVL]
[-t {ascii,pap,chap}] [-r REM_ADDR] [-P VIRTUAL_PORT]
[--timeout TIMEOUT] [-d] [-v] [-k KEY]
{authenticate,authorize,account} ...
Tacacs+ client with full AAA support:
* Authentication supports both ascii, pap and chap.
* Authorization supports AV pairs and single commands.
* Accounting support AV pairs and single commands.
NOTE: shared encryption key can be set via environment variable TACACS_PLUS_KEY or via argument.
NOTE: user password can be setup via environment variable TACACS_PLUS_PWD or via argument.
positional arguments:
{authenticate,authorize,account}
action to perform over the tacacs+ server
authenticate authenticate against a tacacs+ server
authorize authorize a command against a tacacs+ server
account account commands with accounting flags against a tacacs+ server
optional arguments:
-h, --help show this help message and exit
-u USERNAME, --username USERNAME
user name
-H HOST, --host HOST tacacs+ server address
-p PORT, --port PORT tacacs+ server port (default 49)
-l PRIV_LVL, --priv-lvl PRIV_LVL
user privilege level
-t {ascii,pap,chap}, --authen-type {ascii,pap,chap}
authentication type
-r REM_ADDR, --rem-addr REM_ADDR
remote address (logged by tacacs server)
-P VIRTUAL_PORT, --virtual-port VIRTUAL_PORT
console port used in connection (logged by tacacs server)
--timeout TIMEOUT
-d, --debug enable debugging output
-v, --verbose print responses
-6, --v6 use IPv6 addresses
-k KEY, --key KEY tacacs+ shared encryption key
$ tacacs_client authenticate -h
usage: tacacs_client authenticate [-h] [-p PASSWORD]
optional arguments:
-h, --help show this help message and exit
-p PASSWORD, --password PASSWORD
user password
$ tacacs_client authorize -h
usage: tacacs_client authorize [-h] -c CMDS [CMDS ...]
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
$ tacacs_client account -h
usage: tacacs_client account [-h] -c CMDS [CMDS ...] -f {start,stop,update}
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
-f {start,stop,update}, --flag {start,stop,update}
accounting flag

Programmatic Usage

#!/usr/bin/env pythonfrom __future__ importprint_functionfromtacacs_plus.clientimportTACACSClientfromtacacs_plus.flagsimportTAC_PLUS_ACCT_FLAG_START, TAC_PLUS_ACCT_FLAG_WATCHDOG, TAC_PLUS_ACCT_FLAG_STOPimportsocket# For IPv6, use `family=socket.AF_INET6`cli=TACACSClient('host', 49, 'secret', timeout=10, family=socket.AF_INET)
# authenticate user and passauthen=cli.authenticate('username', 'password')
print("PASS!"ifauthen.validelse"FAIL!")
# authorize user and commandauthor=cli.authorize('username', arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifauthor.validelse"FAIL!")
# start accounting session for commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_START, arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifacct.validelse"FAIL!")
# continue accounting session for another commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_WATCHDOG, arguments=[b"service=shell", b"cmd=debug", b"cmdargs=aaa"])
print("PASS!"ifacct.validelse"FAIL!")
# close accounting sessionacct=cli.account('username', TAC_PLUS_ACCT_FLAG_STOP, arguments=[b"service=shell", b"cmd=exit"])
print("PASS!"ifacct.validelse"FAIL!")

About

A Python-based TACACS+ client that supports authentication, authorization and accounting.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

TACACS+ Python client

Build Status

A TACACS+ client that supports authentication, authorization and accounting.

Unlike RADIUS, which was designed for similar purposes, the TACACS+ protocol offers basic packet encryption but, as with most crypto designed back then, it's not secure and definitely should not be used over untrusted networks.

This package has been successfully used with the free tac_plus TACACS+ server on a variety of operating systems.

Basic Installation and Usage

$ pip install tacacs_plus
$ tacacs_client -u myuser -H localhost authenticate
$ tacacs_client -u myuser -H localhost authenticate -t pap
$ tacacs_client -u myuser -H localhost -v authenticate -t chap
status: PASS
$ tacacs_client -u myuser -H localhost authorize -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=shell cmd=show cmdarg=version
status: PASS
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=junos-exec
status: REPL
av-pairs:
allow-commands=^acommandregex$
deny-commands=^anothercommandregex$
$ tacacs_client -u myuser -H localhost account -f start -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost account -f stop -c service=shell cmd=show cmdarg=version
$ tacacs_client -h
usage: tacacs_client [-h] -u USERNAME -H HOST [-p PORT] [-l PRIV_LVL]
[-t {ascii,pap,chap}] [-r REM_ADDR] [-P VIRTUAL_PORT]
[--timeout TIMEOUT] [-d] [-v] [-k KEY]
{authenticate,authorize,account} ...
Tacacs+ client with full AAA support:
* Authentication supports both ascii, pap and chap.
* Authorization supports AV pairs and single commands.
* Accounting support AV pairs and single commands.
NOTE: shared encryption key can be set via environment variable TACACS_PLUS_KEY or via argument.
NOTE: user password can be setup via environment variable TACACS_PLUS_PWD or via argument.
positional arguments:
{authenticate,authorize,account}
action to perform over the tacacs+ server
authenticate authenticate against a tacacs+ server
authorize authorize a command against a tacacs+ server
account account commands with accounting flags against a tacacs+ server
optional arguments:
-h, --help show this help message and exit
-u USERNAME, --username USERNAME
user name
-H HOST, --host HOST tacacs+ server address
-p PORT, --port PORT tacacs+ server port (default 49)
-l PRIV_LVL, --priv-lvl PRIV_LVL
user privilege level
-t {ascii,pap,chap}, --authen-type {ascii,pap,chap}
authentication type
-r REM_ADDR, --rem-addr REM_ADDR
remote address (logged by tacacs server)
-P VIRTUAL_PORT, --virtual-port VIRTUAL_PORT
console port used in connection (logged by tacacs server)
--timeout TIMEOUT
-d, --debug enable debugging output
-v, --verbose print responses
-6, --v6 use IPv6 addresses
-k KEY, --key KEY tacacs+ shared encryption key
$ tacacs_client authenticate -h
usage: tacacs_client authenticate [-h] [-p PASSWORD]
optional arguments:
-h, --help show this help message and exit
-p PASSWORD, --password PASSWORD
user password
$ tacacs_client authorize -h
usage: tacacs_client authorize [-h] -c CMDS [CMDS ...]
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
$ tacacs_client account -h
usage: tacacs_client account [-h] -c CMDS [CMDS ...] -f {start,stop,update}
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
-f {start,stop,update}, --flag {start,stop,update}
accounting flag

Programmatic Usage

#!/usr/bin/env pythonfrom __future__ importprint_functionfromtacacs_plus.clientimportTACACSClientfromtacacs_plus.flagsimportTAC_PLUS_ACCT_FLAG_START, TAC_PLUS_ACCT_FLAG_WATCHDOG, TAC_PLUS_ACCT_FLAG_STOPimportsocket# For IPv6, use `family=socket.AF_INET6`cli=TACACSClient('host', 49, 'secret', timeout=10, family=socket.AF_INET)
# authenticate user and passauthen=cli.authenticate('username', 'password')
print("PASS!"ifauthen.validelse"FAIL!")
# authorize user and commandauthor=cli.authorize('username', arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifauthor.validelse"FAIL!")
# start accounting session for commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_START, arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifacct.validelse"FAIL!")
# continue accounting session for another commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_WATCHDOG, arguments=[b"service=shell", b"cmd=debug", b"cmdargs=aaa"])
print("PASS!"ifacct.validelse"FAIL!")
# close accounting sessionacct=cli.account('username', TAC_PLUS_ACCT_FLAG_STOP, arguments=[b"service=shell", b"cmd=exit"])
print("PASS!"ifacct.validelse"FAIL!")

About

A Python-based TACACS+ client that supports authentication, authorization and accounting.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

TACACS+ Python client

Build Status

A TACACS+ client that supports authentication, authorization and accounting.

Unlike RADIUS, which was designed for similar purposes, the TACACS+ protocol offers basic packet encryption but, as with most crypto designed back then, it's not secure and definitely should not be used over untrusted networks.

This package has been successfully used with the free tac_plus TACACS+ server on a variety of operating systems.

Basic Installation and Usage

$ pip install tacacs_plus
$ tacacs_client -u myuser -H localhost authenticate
$ tacacs_client -u myuser -H localhost authenticate -t pap
$ tacacs_client -u myuser -H localhost -v authenticate -t chap
status: PASS
$ tacacs_client -u myuser -H localhost authorize -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=shell cmd=show cmdarg=version
status: PASS
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=junos-exec
status: REPL
av-pairs:
allow-commands=^acommandregex$
deny-commands=^anothercommandregex$
$ tacacs_client -u myuser -H localhost account -f start -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost account -f stop -c service=shell cmd=show cmdarg=version
$ tacacs_client -h
usage: tacacs_client [-h] -u USERNAME -H HOST [-p PORT] [-l PRIV_LVL]
[-t {ascii,pap,chap}] [-r REM_ADDR] [-P VIRTUAL_PORT]
[--timeout TIMEOUT] [-d] [-v] [-k KEY]
{authenticate,authorize,account} ...
Tacacs+ client with full AAA support:
* Authentication supports both ascii, pap and chap.
* Authorization supports AV pairs and single commands.
* Accounting support AV pairs and single commands.
NOTE: shared encryption key can be set via environment variable TACACS_PLUS_KEY or via argument.
NOTE: user password can be setup via environment variable TACACS_PLUS_PWD or via argument.
positional arguments:
{authenticate,authorize,account}
action to perform over the tacacs+ server
authenticate authenticate against a tacacs+ server
authorize authorize a command against a tacacs+ server
account account commands with accounting flags against a tacacs+ server
optional arguments:
-h, --help show this help message and exit
-u USERNAME, --username USERNAME
user name
-H HOST, --host HOST tacacs+ server address
-p PORT, --port PORT tacacs+ server port (default 49)
-l PRIV_LVL, --priv-lvl PRIV_LVL
user privilege level
-t {ascii,pap,chap}, --authen-type {ascii,pap,chap}
authentication type
-r REM_ADDR, --rem-addr REM_ADDR
remote address (logged by tacacs server)
-P VIRTUAL_PORT, --virtual-port VIRTUAL_PORT
console port used in connection (logged by tacacs server)
--timeout TIMEOUT
-d, --debug enable debugging output
-v, --verbose print responses
-6, --v6 use IPv6 addresses
-k KEY, --key KEY tacacs+ shared encryption key
$ tacacs_client authenticate -h
usage: tacacs_client authenticate [-h] [-p PASSWORD]
optional arguments:
-h, --help show this help message and exit
-p PASSWORD, --password PASSWORD
user password
$ tacacs_client authorize -h
usage: tacacs_client authorize [-h] -c CMDS [CMDS ...]
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
$ tacacs_client account -h
usage: tacacs_client account [-h] -c CMDS [CMDS ...] -f {start,stop,update}
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
-f {start,stop,update}, --flag {start,stop,update}
accounting flag

Programmatic Usage

#!/usr/bin/env pythonfrom __future__ importprint_functionfromtacacs_plus.clientimportTACACSClientfromtacacs_plus.flagsimportTAC_PLUS_ACCT_FLAG_START, TAC_PLUS_ACCT_FLAG_WATCHDOG, TAC_PLUS_ACCT_FLAG_STOPimportsocket# For IPv6, use `family=socket.AF_INET6`cli=TACACSClient('host', 49, 'secret', timeout=10, family=socket.AF_INET)
# authenticate user and passauthen=cli.authenticate('username', 'password')
print("PASS!"ifauthen.validelse"FAIL!")
# authorize user and commandauthor=cli.authorize('username', arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifauthor.validelse"FAIL!")
# start accounting session for commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_START, arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifacct.validelse"FAIL!")
# continue accounting session for another commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_WATCHDOG, arguments=[b"service=shell", b"cmd=debug", b"cmdargs=aaa"])
print("PASS!"ifacct.validelse"FAIL!")
# close accounting sessionacct=cli.account('username', TAC_PLUS_ACCT_FLAG_STOP, arguments=[b"service=shell", b"cmd=exit"])
print("PASS!"ifacct.validelse"FAIL!")

About

A Python-based TACACS+ client that supports authentication, authorization and accounting.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

TACACS+ Python client

Build Status

A TACACS+ client that supports authentication, authorization and accounting.

Unlike RADIUS, which was designed for similar purposes, the TACACS+ protocol offers basic packet encryption but, as with most crypto designed back then, it's not secure and definitely should not be used over untrusted networks.

This package has been successfully used with the free tac_plus TACACS+ server on a variety of operating systems.

Basic Installation and Usage

$ pip install tacacs_plus
$ tacacs_client -u myuser -H localhost authenticate
$ tacacs_client -u myuser -H localhost authenticate -t pap
$ tacacs_client -u myuser -H localhost -v authenticate -t chap
status: PASS
$ tacacs_client -u myuser -H localhost authorize -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=shell cmd=show cmdarg=version
status: PASS
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=junos-exec
status: REPL
av-pairs:
allow-commands=^acommandregex$
deny-commands=^anothercommandregex$
$ tacacs_client -u myuser -H localhost account -f start -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost account -f stop -c service=shell cmd=show cmdarg=version
$ tacacs_client -h
usage: tacacs_client [-h] -u USERNAME -H HOST [-p PORT] [-l PRIV_LVL]
[-t {ascii,pap,chap}] [-r REM_ADDR] [-P VIRTUAL_PORT]
[--timeout TIMEOUT] [-d] [-v] [-k KEY]
{authenticate,authorize,account} ...
Tacacs+ client with full AAA support:
* Authentication supports both ascii, pap and chap.
* Authorization supports AV pairs and single commands.
* Accounting support AV pairs and single commands.
NOTE: shared encryption key can be set via environment variable TACACS_PLUS_KEY or via argument.
NOTE: user password can be setup via environment variable TACACS_PLUS_PWD or via argument.
positional arguments:
{authenticate,authorize,account}
action to perform over the tacacs+ server
authenticate authenticate against a tacacs+ server
authorize authorize a command against a tacacs+ server
account account commands with accounting flags against a tacacs+ server
optional arguments:
-h, --help show this help message and exit
-u USERNAME, --username USERNAME
user name
-H HOST, --host HOST tacacs+ server address
-p PORT, --port PORT tacacs+ server port (default 49)
-l PRIV_LVL, --priv-lvl PRIV_LVL
user privilege level
-t {ascii,pap,chap}, --authen-type {ascii,pap,chap}
authentication type
-r REM_ADDR, --rem-addr REM_ADDR
remote address (logged by tacacs server)
-P VIRTUAL_PORT, --virtual-port VIRTUAL_PORT
console port used in connection (logged by tacacs server)
--timeout TIMEOUT
-d, --debug enable debugging output
-v, --verbose print responses
-6, --v6 use IPv6 addresses
-k KEY, --key KEY tacacs+ shared encryption key
$ tacacs_client authenticate -h
usage: tacacs_client authenticate [-h] [-p PASSWORD]
optional arguments:
-h, --help show this help message and exit
-p PASSWORD, --password PASSWORD
user password
$ tacacs_client authorize -h
usage: tacacs_client authorize [-h] -c CMDS [CMDS ...]
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
$ tacacs_client account -h
usage: tacacs_client account [-h] -c CMDS [CMDS ...] -f {start,stop,update}
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
-f {start,stop,update}, --flag {start,stop,update}
accounting flag

Programmatic Usage

#!/usr/bin/env pythonfrom __future__ importprint_functionfromtacacs_plus.clientimportTACACSClientfromtacacs_plus.flagsimportTAC_PLUS_ACCT_FLAG_START, TAC_PLUS_ACCT_FLAG_WATCHDOG, TAC_PLUS_ACCT_FLAG_STOPimportsocket# For IPv6, use `family=socket.AF_INET6`cli=TACACSClient('host', 49, 'secret', timeout=10, family=socket.AF_INET)
# authenticate user and passauthen=cli.authenticate('username', 'password')
print("PASS!"ifauthen.validelse"FAIL!")
# authorize user and commandauthor=cli.authorize('username', arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifauthor.validelse"FAIL!")
# start accounting session for commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_START, arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifacct.validelse"FAIL!")
# continue accounting session for another commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_WATCHDOG, arguments=[b"service=shell", b"cmd=debug", b"cmdargs=aaa"])
print("PASS!"ifacct.validelse"FAIL!")
# close accounting sessionacct=cli.account('username', TAC_PLUS_ACCT_FLAG_STOP, arguments=[b"service=shell", b"cmd=exit"])
print("PASS!"ifacct.validelse"FAIL!")

About

A Python-based TACACS+ client that supports authentication, authorization and accounting.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

TACACS+ Python client

Build Status

A TACACS+ client that supports authentication, authorization and accounting.

Unlike RADIUS, which was designed for similar purposes, the TACACS+ protocol offers basic packet encryption but, as with most crypto designed back then, it's not secure and definitely should not be used over untrusted networks.

This package has been successfully used with the free tac_plus TACACS+ server on a variety of operating systems.

Basic Installation and Usage

$ pip install tacacs_plus
$ tacacs_client -u myuser -H localhost authenticate
$ tacacs_client -u myuser -H localhost authenticate -t pap
$ tacacs_client -u myuser -H localhost -v authenticate -t chap
status: PASS
$ tacacs_client -u myuser -H localhost authorize -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=shell cmd=show cmdarg=version
status: PASS
$ tacacs_client -u myuser -H localhost -v authorize -t pap -c service=junos-exec
status: REPL
av-pairs:
allow-commands=^acommandregex$
deny-commands=^anothercommandregex$
$ tacacs_client -u myuser -H localhost account -f start -c service=shell cmd=show cmdarg=version
$ tacacs_client -u myuser -H localhost account -f stop -c service=shell cmd=show cmdarg=version
$ tacacs_client -h
usage: tacacs_client [-h] -u USERNAME -H HOST [-p PORT] [-l PRIV_LVL]
[-t {ascii,pap,chap}] [-r REM_ADDR] [-P VIRTUAL_PORT]
[--timeout TIMEOUT] [-d] [-v] [-k KEY]
{authenticate,authorize,account} ...
Tacacs+ client with full AAA support:
* Authentication supports both ascii, pap and chap.
* Authorization supports AV pairs and single commands.
* Accounting support AV pairs and single commands.
NOTE: shared encryption key can be set via environment variable TACACS_PLUS_KEY or via argument.
NOTE: user password can be setup via environment variable TACACS_PLUS_PWD or via argument.
positional arguments:
{authenticate,authorize,account}
action to perform over the tacacs+ server
authenticate authenticate against a tacacs+ server
authorize authorize a command against a tacacs+ server
account account commands with accounting flags against a tacacs+ server
optional arguments:
-h, --help show this help message and exit
-u USERNAME, --username USERNAME
user name
-H HOST, --host HOST tacacs+ server address
-p PORT, --port PORT tacacs+ server port (default 49)
-l PRIV_LVL, --priv-lvl PRIV_LVL
user privilege level
-t {ascii,pap,chap}, --authen-type {ascii,pap,chap}
authentication type
-r REM_ADDR, --rem-addr REM_ADDR
remote address (logged by tacacs server)
-P VIRTUAL_PORT, --virtual-port VIRTUAL_PORT
console port used in connection (logged by tacacs server)
--timeout TIMEOUT
-d, --debug enable debugging output
-v, --verbose print responses
-6, --v6 use IPv6 addresses
-k KEY, --key KEY tacacs+ shared encryption key
$ tacacs_client authenticate -h
usage: tacacs_client authenticate [-h] [-p PASSWORD]
optional arguments:
-h, --help show this help message and exit
-p PASSWORD, --password PASSWORD
user password
$ tacacs_client authorize -h
usage: tacacs_client authorize [-h] -c CMDS [CMDS ...]
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
$ tacacs_client account -h
usage: tacacs_client account [-h] -c CMDS [CMDS ...] -f {start,stop,update}
optional arguments:
-h, --help show this help message and exit
-c CMDS [CMDS ...], --cmds CMDS [CMDS ...]
list of cmds to authorize
-f {start,stop,update}, --flag {start,stop,update}
accounting flag

Programmatic Usage

#!/usr/bin/env pythonfrom __future__ importprint_functionfromtacacs_plus.clientimportTACACSClientfromtacacs_plus.flagsimportTAC_PLUS_ACCT_FLAG_START, TAC_PLUS_ACCT_FLAG_WATCHDOG, TAC_PLUS_ACCT_FLAG_STOPimportsocket# For IPv6, use `family=socket.AF_INET6`cli=TACACSClient('host', 49, 'secret', timeout=10, family=socket.AF_INET)
# authenticate user and passauthen=cli.authenticate('username', 'password')
print("PASS!"ifauthen.validelse"FAIL!")
# authorize user and commandauthor=cli.authorize('username', arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifauthor.validelse"FAIL!")
# start accounting session for commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_START, arguments=[b"service=shell", b"cmd=show", b"cmdargs=version"])
print("PASS!"ifacct.validelse"FAIL!")
# continue accounting session for another commandacct=cli.account('username', TAC_PLUS_ACCT_FLAG_WATCHDOG, arguments=[b"service=shell", b"cmd=debug", b"cmdargs=aaa"])
print("PASS!"ifacct.validelse"FAIL!")
# close accounting sessionacct=cli.account('username', TAC_PLUS_ACCT_FLAG_STOP, arguments=[b"service=shell", b"cmd=exit"])
print("PASS!"ifacct.validelse"FAIL!")

About

A Python-based TACACS+ client that supports authentication, authorization and accounting.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages