diff --git a/kittens/ssh/main.py b/kittens/ssh/main.py index b558c8c14..88b3d2f7f 100644 --- a/kittens/ssh/main.py +++ b/kittens/ssh/main.py @@ -2,6 +2,7 @@ # vim:fileencoding=utf-8 # License: GPL v3 Copyright: 2018, Kovid Goyal +import os import subprocess import sys @@ -42,14 +43,18 @@ exec -a "-$shell_name" "$0" def parse_ssh_args(args): boolean_ssh_args = {'-' + x for x in '46AaCfGgKkMNnqsTtVvXxYy'} other_ssh_args = {'-' + x for x in 'bBcDeEFIJlLmOopQRSWw'} + passthrough_args = {'-' + x for x in 'Nnf'} ssh_args = [] server_args = [] expecting_option_val = False + passthrough = False for arg in args: if server_args: server_args.append(arg) continue if arg.startswith('-'): + if arg in passthrough_args: + passthrough = True if arg in boolean_ssh_args: ssh_args.append(arg) continue @@ -65,22 +70,24 @@ def parse_ssh_args(args): server_args.append(arg) if not server_args: raise SystemExit('Must specify server to connect to') - return ssh_args, server_args + return ssh_args, server_args, passthrough def main(args): - ssh_args, server_args = parse_ssh_args(args[1:]) - terminfo = subprocess.check_output(['infocmp']).decode('utf-8') - sh_script = SHELL_SCRIPT.replace('TERMINFO', terminfo, 1) - if len(server_args) > 1: - command_to_execute = ["'{}'".format(c.replace("'", """'"'"'""")) for c in server_args[1:]] - command_to_execute = 'cmd=({}); exec "$cmd"'.format(' '.join(command_to_execute)) + ssh_args, server_args, passthrough = parse_ssh_args(args[1:]) + if passthrough: + cmd = ['ssh'] + ssh_args + server_args else: - command_to_execute = '' - sh_script = sh_script.replace('EXEC_CMD', command_to_execute) - cmd = ['ssh'] + ssh_args + ['-t', server_args[0], sh_script] + server_args[1:] - p = subprocess.Popen(cmd) - raise SystemExit(p.wait()) + terminfo = subprocess.check_output(['infocmp']).decode('utf-8') + sh_script = SHELL_SCRIPT.replace('TERMINFO', terminfo, 1) + if len(server_args) > 1: + command_to_execute = ["'{}'".format(c.replace("'", """'"'"'""")) for c in server_args[1:]] + command_to_execute = 'cmd=({}); exec "$cmd"'.format(' '.join(command_to_execute)) + else: + command_to_execute = '' + sh_script = sh_script.replace('EXEC_CMD', command_to_execute) + cmd = ['ssh'] + ssh_args + ['-t', server_args[0], sh_script] + server_args[1:] + os.execvp('ssh', cmd) if __name__ == '__main__':