대화형 세션에만 RemoteCommand를 사용하여 SSH를 구성하는 방법(즉, 명령이 없거나 sftp가 아님)

대화형 세션에만 RemoteCommand를 사용하여 SSH를 구성하는 방법(즉, 명령이 없거나 sftp가 아님)

현재 저는 로컬 및 원격 호스트에서 Fish를 메인 셸로 사용하고 있습니다.

SSH와 SFTP를 통해 원격 호스트에 연결합니다. 기본적으로 모든 연결에서 원격 tmux를 자동으로 열거나 재사용하고 싶기 때문에 다음을 내 항목에 추가했습니다 ~/.ssh/config.

Host example.com
RemoteCommand tmux a; or tmux
RequestTTY yes

문제는 이제 sftp로컬 CLI를 통해 연결하거나 직접 명령을 실행할 수 없다는 것입니다.

➤ ssh example.com ping localhost
Cannot execute command-line and remote command.

➤ sftp example.com
Cannot execute command-line and remote command.
Connection closed

그래서 내 질문은 다음과 같습니다.새로운 대화형 SSH 세션을 열 때 실행될 기본 명령을 어떻게 정의하되 이를 재정의할 수 있도록 합니까?

답변1

옵션 1)

일치를 선택할 수 있습니다(참조:남자 ssh_config)

Match Host example.com exec "test $_ = /usr/bin/ssh"
     RemoteCommand tmux a; or tmux
     RequestTTY yes

이것은 ssh와 sftp의 차이점만을 알려줍니다.

옵션 2

diffe 명령에 대한 몇 가지 자리 표시자 구성을 만듭니다. 예를 들면 다음과 같습니다.

Host tmux.example.com
  HostName example.com
  HostKeyAlias example.com
  RemoteCommand tmux a; or tmux
  RequestTTY yes

이후에도 sftp/ping에 example.com을 사용할 수 있습니다.

답변2

SSH 옵션과 매개변수에서 공백을 처리하기 위해 좀 더 복잡한 것을 사용하고 있습니다.

Match exec "POSIXLY_CORRECT=1 xargs -0 getopt -o 46AaCfGgKkMNnqsTtVvXxYyB:b:c:D:E:e:F:I:i:J:L:l:m:O:o:p:Q:R:S:W:w: --  </proc/$PPID/cmdline | perl -pe 's|.*? -- ||' | { read -r c; eval a=($c); [ ${#a[@]} -le 2 ]; }"
    RemoteCommand my-command-here
    RequestTTY yes

또한 특정 시스템(예: "host xxxx" 내부)에 대해 RemoteCommand를 사용하려는 경우 동일한 트릭을 반대 논리에서 사용할 수 있습니다(호스트 후에 일치가 평가됩니다).

Match exec "POSIXLY_CORRECT=1 xargs -0 getopt -o 46AaCfGgKkMNnqsTtVvXxYyB:b:c:D:E:e:F:I:i:J:L:l:m:O:o:p:Q:R:S:W:w: -- </proc/$PPID/cmdline | perl -pe 's|.*? -- ||' | { read -r c; eval a=($c); [ ${#a[@]} -gt 2 ]; }"
     RemoteCommand none
     RequestTTY auto

Host machine1 machine2 ...
     RemoteCommand my-command-here
     RequestTTY yes

궁금한 사람이 있으면 현재 RemoteCommand를 사용하여 화면을 호출하고 있습니다.

RemoteCommand which screen &>/dev/null && TERM=xterm screen -q -RR "%u-%C" $SHELL -l || $SHELL -l

답변3

한 가지 옵션은 ssh명령에 대한 심볼릭 링크 별칭을 만드는 것입니다.

ln -s /usr/bin/ssh $HOME/bin/ssht

$HOME/bin삶 을 더 쉽게 만들려면 $PATH.

SSH 구성에서:

Match Host example.com exec "test $_ = $HOME/bin/ssht"
     RemoteCommand tmux new-session -A -s mysession
     RequestTTY yes

ssht example.com이제 tmux 및 비 tmux 세션에 각각 또는 를 사용하도록 선택할 수 있습니다 .ssh example.com

답변4

이것은 질문에 직접적으로 대답하지 않습니다. 그러나 나에게는 이것이 근본적인 문제에 대한 해결책이 되었기 때문에 포스팅할 가치가 있다고 생각했습니다.

내가 정말로 원하는 것은 tmux를 자동으로 입력하는 것입니다. 대신, tmux 위에 구축되었지만 더 편리한 byobu를 사용하기 시작했습니다. 예를 들어, 이 사용 사례를 기본적으로 지원합니다.

byobu를 설치한 후 다음을 실행하세요.

byobu-enable

이제 끝났습니다. 다음 대화식 세션은 셸에 관계없이 자동으로 byobu로 들어갑니다. 비대화형 연결은 평소대로 작동합니다.

관련 정보