/opt/tier1adv/bin
NameSizeModeActions
adddomainkey11790755editdlrm
addlocaldomain22810755editdlrm
addspf38450755editdlrm
baksync207180700editdlrm
build_maxemails_config11690755editdlrm
checkip43000755editdlrm
chpass33360755editdlrm
create_db14210755editdlrm
dcv24270755editdlrm
downchk46030755editdlrm
editquota35120755editdlrm
exim_tidydb30360755editdlrm
ipusage76240755editdlrm
mysqlconnectioncheck68770755editdlrm
proxydomains98220755editdlrm
rmdomainkey11820755editdlrm
rmlocaldomain22810755editdlrm
rmpwb21230755editdlrm
rmspf9100755editdlrm
runweblogs10450755editdlrm
sdig198450755editdlrm
server_overview207810755editdlrm
simpleps31240755editdlrm
switch20300755editdlrm
unblock27960755editdlrm
updateuserdomains7740755editdlrm
usernano7830755editdlrm
validate_zone11100755editdlrm
whoowns11550755editdlrm
Edit: /opt/tier1adv/bin/switch (2030B)
#!/opt/support/venv/bin/python3 """Switch to another user's shell""" import argparse import subprocess import sys import select import os from argparse import ArgumentTypeError as BadArg import pymysql sys.path.insert(0, '/opt/support/lib') from arg_types import cpuser_safe_arg def is_cwp(): """Returns true the server is CWP""" return os.path.exists("/usr/local/cwp") def cwp_user_safe(user: str) -> str: """Returns the username if the CWP user is safe by verifying it exists in CWP, raises an exception otherwise""" try: mysql_conn = pymysql.connect( read_default_file="~/.my.cnf", db="root_cwp" ) cursor = mysql_conn.cursor() result = cursor.execute( f"SELECT * FROM `user` WHERE `username` = '{user}'" ) # result is number of lines found cursor.close() mysql_conn.close() except Exception as e: print(e) raise BadArg('Failed to query MySQL') from e if result == 0: raise BadArg('user does not exist or is restricted') return user def switch(username: str): """Switches to ``username``""" # We use subprocess because we actually want to pass our raw file # descriptors to the child in this instance. with subprocess.Popen( ['/bin/su', '-s', '/bin/bash', '-', username] ) as shell: shell.communicate() def parse_args() -> str: """Parses command line arguments and returns a username""" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('user', type=valid_user, help="user to switch to") return parser.parse_args().user def valid_user(user: str) -> str: if user == 'wordpress': return user if is_cwp(): return cwp_user_safe(user) return cpuser_safe_arg(user) def main(): """Handle command line access""" if select.select([sys.stdin], [], [], 0.0)[0]: sys.exit("Cannot have stdin") user = parse_args() switch(user) if __name__ == "__main__": main()