163 lines
4.9 KiB
Python
Executable File
163 lines
4.9 KiB
Python
Executable File
#!/home/rhetenor/Projects/esp/python/.venv/bin/python
|
|
|
|
import argparse
|
|
import os
|
|
import sys
|
|
|
|
import webrepl
|
|
|
|
examples="""webreplcmd --host 192.168.4.1 --password ulx3s ls
|
|
webreplcmd --host 192.168.4.1 --password ulx3s get src-remote-file.txt dest-local-file.txt
|
|
webreplcmd --host 192.168.4.1 --password ulx3s put src-local-file.txt dest-remote-file.txt
|
|
webreplcmd --host 192.168.4.1 --password ulx3s cat main.py
|
|
webreplcmd --host 192.168.4.1 --password ulx3s cmd 'import os; os.listdir()'
|
|
"""
|
|
|
|
parser = argparse.ArgumentParser(description='webrepl - connect to websocket webrepl',
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
epilog=examples)
|
|
parser.add_argument('--host', '-i', default=os.environ.get('WEBREPL_HOST', None), help="Host to connect to")
|
|
parser.add_argument('--port', '-P', type=int, default=os.environ.get('WEBREPL_PORT', 8266), help="Port to connect to")
|
|
parser.add_argument('--verbose', '-v', action='store_true', help="Verbose information")
|
|
parser.add_argument('--debug', '-d', action='store_true', help="Enable debugging messages")
|
|
parser.add_argument('--password', '-p', default=os.environ.get('WEBREPL_PASSWORD', None), help="Use following password to connect")
|
|
parser.add_argument('--before', '-B', action='append', default=os.environ.get('WEBREPL_BEFORE', None), help="command to execute before")
|
|
parser.add_argument('--cmd', '-c', action='append', default=os.environ.get('WEBREPL_CMD', None), help="command to execute")
|
|
parser.add_argument('--after', '-A', action='append', default=os.environ.get('WEBREPL_AFTER', None), help="command to execute after")
|
|
parser.add_argument('commands', metavar='CMD', type=str, nargs='+',
|
|
help='commands for repl')
|
|
|
|
args = parser.parse_args()
|
|
|
|
if not args.host:
|
|
print("You need to specify host")
|
|
parser.print_usage()
|
|
sys.exit()
|
|
|
|
password=''
|
|
if not args.password:
|
|
print("You need to specify password")
|
|
try:
|
|
import getpass
|
|
password = getpass.getpass()
|
|
except:
|
|
parser.print_usage()
|
|
sys.exit()
|
|
else:
|
|
password = args.password
|
|
|
|
if not args.commands or len(args.commands)<1:
|
|
print("Command is not recognized/given")
|
|
parser.print_usage()
|
|
sys.exit()
|
|
|
|
repl=webrepl.Webrepl(**{})
|
|
|
|
if args.debug:
|
|
repl.debug = True
|
|
|
|
if args.verbose:
|
|
repl.verbose = True
|
|
|
|
try:
|
|
repl.connect(args.host, args.port)
|
|
repl.login(password)
|
|
except Exception as e:
|
|
print("Error connecting to host",args.host,"at port",args.port,":",e)
|
|
sys.exit()
|
|
|
|
if not repl.connected:
|
|
print("Not connected. Check your password!")
|
|
sys.exit()
|
|
|
|
if args.before:
|
|
for cmd in args.before:
|
|
print("[i] Issuing command: "+cmd)
|
|
try:
|
|
r=repl.send_cmd(cmd)
|
|
print(r.decode())
|
|
except Exception as e:
|
|
print("[e] Error running command:",cmd,":",e)
|
|
|
|
cmd = args.commands[0].lower()
|
|
|
|
if cmd == "ver" or cmd == "version":
|
|
if args.verbose:
|
|
print("[i] Getting version")
|
|
ver=repl.get_ver()
|
|
print("[i] Version ",ver[0], ver[1], ver[2])
|
|
elif cmd == "list" or cmd == "ls":
|
|
print("[i] Listing")
|
|
r=repl.sendcmd("import os; os.listdir()")
|
|
print(r.decode())
|
|
elif cmd == "get" or cmd == "download":
|
|
if len(args.commands)<3:
|
|
sys.stderr.write("Not enough arguments for "+cmd+"\n")
|
|
sys.exit()
|
|
source=args.commands[1]
|
|
dest=args.commands[2]
|
|
if args.verbose:
|
|
print("[i] Downloading "+source+" to "+dest)
|
|
repl.get_file(source, dest)
|
|
elif cmd == "put" or cmd == "upload":
|
|
if len(args.commands)<3:
|
|
sys.stderr.write("Not enough arguments for "+cmd+"\n")
|
|
sys.exit()
|
|
source=args.commands[1]
|
|
dest=args.commands[2]
|
|
if args.verbose:
|
|
print("[i] Uploading "+source+" to "+dest)
|
|
repl.put_file(source, dest)
|
|
elif cmd == "del" or cmd == "rm" or cmd == "dele":
|
|
if len(args.commands)<2:
|
|
sys.stderr.write("Not enough arguments for "+cmd+"\n")
|
|
sys.exit()
|
|
filename=args.commands[1]
|
|
if args.verbose:
|
|
print("[i] Deleting "+filename)
|
|
r=repl.sendcmd("import os; os.remove('"+filename+"')")
|
|
print(r.decode())
|
|
elif cmd == "print" or cmd == "cat" or cmd == "type":
|
|
if len(args.commands)<2:
|
|
sys.stderr.write("Not enough arguments for "+cmd+"\n")
|
|
sys.exit()
|
|
source=args.commands[1]
|
|
if args.verbose:
|
|
print("[i] Content of file",source)
|
|
r=repl.get_file_content(source)
|
|
print(r.decode())
|
|
elif cmd == "command" or cmd == "cmd":
|
|
if len(args.commands)<2:
|
|
sys.stderr.write("Not enough arguments for "+cmd+"\n")
|
|
sys.exit()
|
|
cmd=args.commands[1]
|
|
if args.verbose:
|
|
print("[i] Executing "+cmd)
|
|
r=repl.sendcmd(cmd)
|
|
print(r.decode())
|
|
else:
|
|
sys.stderr.write("Command not recognized\n")
|
|
|
|
if args.cmd:
|
|
for cmd in args.cmd:
|
|
print("[i] Issuing command: "+cmd)
|
|
try:
|
|
r=repl.send_cmd(cmd)
|
|
print(r.decode())
|
|
except Exception as e:
|
|
print("[e] Error running command:",cmd,":",e)
|
|
|
|
if args.after:
|
|
for cmd in args.after:
|
|
print("[i] Issuing command: "+cmd)
|
|
try:
|
|
r=repl.send_cmd(cmd)
|
|
print(r.decode())
|
|
except Exception as e:
|
|
print("[e] Error running command:",cmd,":",e)
|
|
|
|
if args.verbose:
|
|
print("[i] closing REPL/WS")
|
|
repl.disconnect()
|
|
|