SSH 구성에서 강제 쉘

SSH 구성에서 강제 쉘

Match exec ....ssh/config에서 몇 가지 규칙을 사용하고 있습니다 . (구체적으로는 내 IP 주소를 기반으로 ProxyJump를 변경합니다.) 매뉴얼 페이지에서 설명합니다.

exec 키워드는 사용자 쉘에서 지정된 명령을 실행합니다. 명령이 종료 상태 0을 반환하면 조건은 true로 간주됩니다. 공백 문자가 포함된 명령은 따옴표로 묶어야 합니다.

나는 구문이 상당히 다른 두 개의 쉘(zsh 및 xonsh)을 사용하므로 두 쉘 모두에서 동일하게 작동하는 exec 문을 작성하기가 어렵습니다. 사용자의 쉘을 사용하는 대신 ssh가 exec 명령을 특정 쉘에 전달하도록 강제하는 방법이 있습니까?

이는 로컬 셸을 사용하여 수행되며 원격 서버에서 실행되는 셸과는 아무 관련이 없습니다.

2021년 9월 9일에 수정됨:

자세한 내용은 다음과 같습니다. 내 SSH 구성에는 다음이 있습니다.

match !exec "ifconfig | egrep -q 'inet (123\.45\.|67\.89\.)'"
    ProxyJump hop

이것은 bash 구문입니다. 작은따옴표는 원시 문자열을 강제로 해석하므로 슬래시가 egrep에 전달됩니다.

xonsh에서 이 구문은 Python 문자열 인용 규칙으로 인해 불법입니다. 비활성화된 참조를 사용해야 합니다 r'123\.'. 문자열 참조는 여전히 $SHELL의 현재 값에 따라 변경될 수 있는 외부 쉘에 의해 실행되기 때문에 exec 명령 내에서 다른 쉘을 호출하여 이 문제를 해결할 수 없습니다.

답변1

SSH 구성 파일 내에서 특정 셸을 강제로 실행하는 방법을 찾을 수 없습니다. 나는 유일한 선택은 쉘을 선택하고 SSH를 시작하는 방법이 $SHELL올바르게 설정되었는지 확인하는 것이라고 믿습니다.

이는 여러 가지 방법으로 달성할 수 있습니다. 이 예에서는 내 ssh_config가 bash 구문을 사용하고 이를 xonsh에서 호출하려고 한다고 가정하지만 호환되지 않는 셸의 모든 조합은 동일하게 잘 작동해야 합니다.

래퍼 스크립트

한 가지 방법은 초기에 래퍼 스크립트를 추가하여 PATHSHELL을 올바르게 설정하는 것입니다.

~/빈/ssh:

#!/bin/bash
# Set the shell to use within .ssh/config
SHELL=/bin/bash exec /usr/bin/ssh "$@"

그런 다음 실행 가능하게 만듭니다( chmod +x ~/bin/ssh).

~/.xonshrc 또는 호출 셸 구성 파일:

# Prepend to PATH
$PATH = p`~/bin` + $PATH

.ssh/config이는 사용되는 모든 도구(예: sshuttle, sshfs 등)에 필요합니다.

Xonsh 별칭

내 xonsh 특정 솔루션의 경우 별칭 기능을 사용했습니다.

~/.xonshrc:

def bash_shell(cmd):
    import functools
    def alias(cmd, args):
        with __xonsh__.env.swap(SHELL="/bin/bash"):
            ![@(cmd) @(args)]
    return functools.partial(alias, cmd)
aliases |= {
    'ssh': bash_shell('ssh'),
    'sshuttle': bash_shell('sshuttle'),
    # ...
}

관련 정보