diff --git a/docs/changelog.rst b/docs/changelog.rst index 0f01c8295..a7822d6de 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -59,6 +59,9 @@ Detailed list of changes - Linux: Update cursor position after all key presses not just pre-edit text changes (:iss:`5241`) +- ssh kitten: Allow ssh kitten to work from inside tmux, provided the tmux + session inherits the correct KITTY env vars (:iss:`5227`) + 0.25.2 [2022-06-07] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/kittens/ssh.rst b/docs/kittens/ssh.rst index df259ac7d..18aa70e02 100644 --- a/docs/kittens/ssh.rst +++ b/docs/kittens/ssh.rst @@ -143,6 +143,16 @@ transmitted instantly without any roundtrip delay. is something POSIX sh compliant, and use :code:`python` as the :opt:`interpreter ` in :file:`ssh.conf`. + +.. note:: + + This may or may not work when using terminal multiplexers, depending on + whether they passthrough the escape codes and if the values of the + environment variables :env:`KITTY_PID` and :env:`KITTY_WINDOW_ID` are + correct in the current session (they can be wrong is connecting to a tmux + session running in different window) and the ssh kitten is run in the + currently active multiplexer window. + .. include:: /generated/conf-kitten-ssh.rst diff --git a/kittens/ssh/main.py b/kittens/ssh/main.py index 5666baf68..6bf354ef8 100644 --- a/kittens/ssh/main.py +++ b/kittens/ssh/main.py @@ -40,7 +40,7 @@ from kitty.utils import ( set_echo as turn_off_echo ) -from ..tui.utils import kitty_opts +from ..tui.utils import kitty_opts, running_in_tmux from .config import init_config from .copy import CopyInstruction from .options.types import Options as SSHOptions @@ -209,7 +209,7 @@ def get_ssh_data(msg: str, request_id: str) -> Iterator[bytes]: if pw != env_data['pw']: raise ValueError('Incorrect password') if rq_id != request_id: - raise ValueError('Incorrect request id') + raise ValueError(f'Incorrect request id: {rq_id!r} expecting the KITTY_PID-KITTY_WINDOW_ID for the current kitty window') except Exception as e: traceback.print_exc() yield f'{e}\n'.encode('utf-8') @@ -557,7 +557,16 @@ def dcs_to_kitty(payload: Union[bytes, str], type: str = 'ssh') -> bytes: if isinstance(payload, str): payload = payload.encode('utf-8') payload = standard_b64encode(payload) - return b'\033P@kitty-' + type.encode('ascii') + b'|' + payload + b'\033\\' + ans = b'\033P@kitty-' + type.encode('ascii') + b'|' + payload + tmux = running_in_tmux() + if tmux: + cp = subprocess.run([tmux, 'set', '-p', 'allow-passthrough', 'on']) + if cp.returncode != 0: + raise SystemExit(cp.returncode) + ans = b'\033Ptmux;\033' + ans + b'\033\033\\\033\\' + else: + ans += b'\033\\' + return ans @run_once