iTerm2: Как я могу запустить локальную команду из удаленного сеанса? - PullRequest
0 голосов
/ 09 мая 2020

iTerm2 интеграция с оболочкой имеет некоторые хитрые приемы, такие как его команда it2copy, которая копирует в локальный буфер обмена, даже если я вошел на удаленную машину через s sh.

Можно ли его использовать для запуска произвольных команд оболочки?

Например, когда я вошел в систему через s sh, я хочу выполнить команду, чтобы открыть редактор на моем локальном компьютере. VSCode может открыть удаленный каталог с помощью этой команды:

code --remote ssh-remote+myserver /home/stuart/some-directory

Я хочу запустить эту команду локально из сеанса s sh на удаленном компьютере.


PS - - Я знаю, что есть альтернатива: вместо использования обратного канала iTerm2 создать (вложенное) s sh соединение назад с моей локальной машиной для выполнения команд через s sh. Но у этого есть различные недостатки, отсюда и этот вопрос.

Мне также известен параметр PermitLocalCommand в ~/.ssh/config, который позволяет мне отправить escape-код (~C), за которым следует локальный команда (!code --remote ...). Но я надеюсь на решение, которое я смогу использовать в скрипте или bash псевдониме.

Например, если бы it2local существовал, я бы использовал его так:

alias code_here='it2local "code --remote ssh-remote+$(uname -n) $(pwd)"'

Если это возможно только с s sh, я хотел бы услышать об этом.

1 Ответ

1 голос
/ 12 мая 2020

Правильный способ сделать это - использовать iTerm2 Triggers , который может запускать произвольную команду (среди других параметров) всякий раз, когда в выходных данных вашего терминала появляется определенный шаблон c.

Гипотетическая команда it2local, которую я описал выше, просто должна будет отобразить некоторый предопределенный шаблон триггера на ваш терминал вместе с командой, которую вы хотите выполнить.

В моем случае я не реализовал generi c it2local команда. (Возможно, я обновлю этот ответ позже.) На данный момент я реализовал сценарий, который обслуживает мой конкретный c вариант использования: открытие удаленного файла с помощью VSCode. Код, который я использую, показан ниже.

#!/bin/sh

#
# This file contains the code and instructions to set up an iTerm2 "Trigger" from a
# remote ssh session that will open up VSCode on your local machine to edit a
# file on the remote server over ssh.
#
# Author: Stuart Berg
#         https://github.com/stuarteberg
#         bergs@janelia.hhmi.org

# SETUP OVERVIEW
# --------------
# - Install the VS Code Remote Development Extension Pack
# - Ideally, setup passwordless ssh access to the remote machines you want to access
# - Place this script somewhere on your local machine (and make sure it's executable).
# - Copy the localcode() shell function below into your remote machine's .bashrc
# - Define the Trigger in iTerm2 as defined below.
#
# Notes:
#   Docs for iTerm2 Triggers: https://iterm2.com/documentation-triggers.html
#   Docs for VSCode Remote Extension: https://code.visualstudio.com/docs/remote/remote-overview
#   - CLI: https://github.com/microsoft/vscode-remote-release/issues/585#issuecomment-536580102

# iTerm2 Preferences Setup
# ------------------------
#
# In your iTerm2 preferences, set up a Trigger (Profiles > Advanced > Triggers > Edit)
#
# Regular Expression:  .*ITERM-TRIGGER-open-with-local-vscode-remote ([^ ]+) ([^ ]+) ([^ ]+)
#             Action:  Run Command...
#         Parameters:  /path/to/this/script \1 \2 \3
#
# Tip: For additional feedback, try adding a duplicate entry with a "Post Notifcation" action.

# HOW TO TEST
# -----------
#
# NOTE: The new trigger will not be active for already-open terminal sessions.
#       Open a new terminal after you add the trigger to your preferences.
#
# To test it, ssh into the remote machine, and try the 'localcode' function:
#
#   localcode .
#   localcode /some/dir
#   localcode /some/file
#   localcode /some/file remote-machine-name
#
# If something is going wrong, inspect /tmp/iterm-vscode-trigger.log

#
# Put this in your remote ~/.bashrc
#
localcode() (
    CMD=ITERM-TRIGGER-open-with-local-vscode-remote
    MACHINE=${2-$(uname -n)}
    FILENAME=${1-.}
    if [[ -d ${FILENAME} ]]; then
        FILENAME=$(cd $FILENAME; pwd)
        FTYPE=directory
    elif [[ -f ${FILENAME} ]]; then
        DIRNAME=$(cd $(dirname $FILENAME); pwd)
        FILENAME=${DIRNAME}/$(basename ${FILENAME})
        FTYPE=file
    else
        1>&2 echo "Not a valid file or directory: ${FILENAME}"
        exit 1
    fi

    echo ${CMD} ${FTYPE} ${MACHINE} ${FILENAME}
)
export -f localcode

#
# Copy this whole file onto your local machine, or at least the following lines.
# Make sure it is executable (chmod +x /path/to/this/script)
#
trigger_vscode_remote_editing() (
    VSCODE=/usr/local/bin/code
    LOGFILE=/tmp/iterm-vscode-trigger.log
    FTYPE=$1
    MACHINE=$2
    FILEPATH=$3


    TS="["$(date "+%Y-%m-%d %H:%M:%S")"]"
    echo "${TS} Triggered: ""$@" >> ${LOGFILE}

    # https://github.com/microsoft/vscode-remote-release/issues/585#issuecomment-536580102
    if [[ "${FTYPE}" == "directory" ]]; then
        CMD="${VSCODE} --remote ssh-remote+${MACHINE} ${FILEPATH}"
    elif [[ "${FTYPE}" == "file" ]]; then
        CMD="${VSCODE} --file-uri vscode-remote://ssh-remote+${MACHINE}${FILEPATH}"
    else
        echo "${TS} Error: Bad arguments." >> ${LOGFILE}
        exit 1
    fi

    echo "${TS} ${CMD}" >> ${LOGFILE}
    ${CMD}
)

trigger_vscode_remote_editing "$@"

...