Start work on the remote_file kitten

Easy access to files over SSH
This commit is contained in:
Kovid Goyal
2020-09-12 06:36:41 +05:30
parent e6839b45e3
commit d6e27e776b
7 changed files with 239 additions and 7 deletions

View File

@@ -7,7 +7,8 @@ import re
import shlex
import subprocess
import sys
from typing import List, NoReturn, Set, Tuple
from contextlib import suppress
from typing import List, NamedTuple, NoReturn, Optional, Set, Tuple
SHELL_SCRIPT = '''\
#!/bin/sh
@@ -60,6 +61,47 @@ def get_ssh_cli() -> Tuple[Set[str], Set[str]]:
return set('-' + x for x in boolean_ssh_args), set('-' + x for x in other_ssh_args)
class SSHConnectionData(NamedTuple):
binary: str
hostname: str
port: Optional[int] = None
def get_connection_data(args: List[str]) -> Optional[SSHConnectionData]:
boolean_ssh_args, other_ssh_args = get_ssh_cli()
found_ssh = ''
port: Optional[int] = None
expecting_port = False
expecting_option_val = False
for i, arg in enumerate(args):
if not found_ssh:
if os.path.basename(arg).lower() in ('ssh', 'ssh.exe'):
found_ssh = arg
continue
if arg.startswith('-') and not expecting_option_val:
if arg in boolean_ssh_args:
continue
if arg.startswith('-p'):
if arg[2:].isdigit():
with suppress(Exception):
port = int(arg[2:])
elif arg == '-p':
expecting_port = True
expecting_option_val = True
continue
if expecting_option_val:
if expecting_port:
with suppress(Exception):
port = int(arg)
expecting_port = False
expecting_option_val = False
continue
return SSHConnectionData(found_ssh, arg, port)
def parse_ssh_args(args: List[str]) -> Tuple[List[str], List[str], bool]:
boolean_ssh_args, other_ssh_args = get_ssh_cli()
passthrough_args = {'-' + x for x in 'Nnf'}