여러 명령을 파이프하여 역방향 쉘(네트워크 네임스페이스)을 socat합니다.

여러 명령을 파이프하여 역방향 쉘(네트워크 네임스페이스)을 socat합니다.

Bash 스크립트가 있습니다.

  1. 뭔가를 해라
  2. 리버스 쉘을 연결하거나 엽니다.
  3. 다른 일을 해라

my-script콘텐츠:

#!/usr/bin/env bash

# does 'some thing'

sudo /usr/bin/nsenter --setuid 1000 --setgid 1000 --net=/var/run/netns/ns-a -- socat file:$(tty),raw,echo=0 tcp:10.10.10.1:2222

# does 'another thing'

터미널에서 이 스크립트를 대화형으로 실행하면 중지되고 사용자 상호 작용을 위한 원격 셸이 제공됩니다.

사용 사례는 스크립트를 갖는 것입니다.

  • 파이프 입력 허용(예: HEREDOC 스타일)
  • 파이프 입력이 제공되지 않으면 대화형 셸이 표시됩니다.

내가 할 수 있기를 원하는 것은 배치 파일(파이프라인 입력)뿐만 아니라 대화형으로 이 스크립트를 사용하는 것입니다.

다음은 저를 당황하게 합니다:

my-script <<EOCMDS
echo 1
echo 2
EOCMDS
2020/12/13 21:28:59 socat[28032] E exactly 2 addresses required (there are 4); use option "-h" for help

당신이 생각할 수있는 솔루션에 감사드립니다.

고쳐 쓰다:

이것은 원격 쉘 설정에 관한 것이 아닙니다. 의심의 여지를 피하기 위해 원격 서버는 연결 시 (bash) 셸을 제공할 준비가 되어 설정되어 수신됩니다. 이 문제는 클라이언트에만 관련됩니다. 이 질문과 관련이 없지만 의심을 더 명확하게 하기 위해 원격 서버는 실제로 네트워크 네임스페이스 전용이 아니라 로컬 클라이언트일 뿐입니다.

답변1

글쎄, 그것은 그렇게 사소한 것이 아니라는 것이 밝혀졌습니다.

사용자가 입장하면

$ wgsh
wgsh@vultr /$

및 파이프 명령:

$ wgsh <<EOD
echo 1
echo 2
echo 3
EOD

쉽지는 않지만 할 수 있습니다.

해결책은 로컬이 socat원격 셸(역방향 셸)을 열도록 하는 것입니다. 파이프된 명령 입력이 감지될 때마다 백그라운드로 이동합니다. 마지막으로 각 파이프라인 명령은 /dev/ptsN연결된 백엔드 에 제출됩니다 socat.

첫 번째 문제는 socat배경을 시도할 때마다 항상 두 개의 추가 매개변수가 있다고 생각한다는 것입니다.쉘 스크립트에서. 불평하다:

socat[3124] E exactly 2 addresses required (there are 4)

두 번째 문제는 다른 사람에게 명령을 실행하는 것이 /dev/ptsN간단하지 않다는 것입니다.

따라서 해결책은 두 부분으로 구성됩니다.

  1. tmux백그라운드 연결 에 사용됩니다 socat.
  2. ttyecho각 파이프라인 명령을 백그라운드로 보내는 데 사용됩니다 socat.

ttyechoPratik Sinha의 맞춤형 유틸리티, 그리고 그 중 하나녹슨 상자.

이 명령줄 도구는 기능적으로 ttyechoUbuntu 패키지의 일부와 유사하지만 제가 아는 한 도구 개발이 중단되었으며 마지막 Ubuntu 패키지는 12.04용이었습니다.writevtconsole-tools

즉, 자신이 직접 컴파일하고 설치해야 할 가능성이 높습니다 ttyecho.

그리고 몇 가지 추가 주름 – 항상 존재하지 않았습니까?

새 tty를 열려면 tmux루트 권한이 필요합니다. 실행할 수 있으려면 다음을 수행하십시오.

sudo --validate
tmux ...

시작된 프로세스 차단 비밀번호가 없으면 다음을 추가해야 합니다 /etc/sudoers.d/<user>.

Defaults: <user> !tty_tickets

모든 것이 준비되면 이것이 작동합니다( ttyecho귀하의 경로에서).

if [ -t 0 -a $# -eq 0 ]
then
  ## No piped commands.
 
  ## 1. Start interactive shell.
  sudo /usr/bin/nsenter --setuid 1000 \
                        --setgid 1000 \
                        --net=/var/run/netns/nns-a \
                        -- \
                        socat file:$(tty),raw,echo=0 \
                               tcp:10.10.10.1:2222
else
  ## Piped commands.
 
  ## 1. Setup sudo --validate for new tty sessions:
  # Add
  #     Defaults: <user> !tty_tickets
  # to the file (chmod 440): /etc/sudoers.d/<user>
  #
  sudo --validate

  ## 2. Start a detached connection to remote shell.
  #
  tmux new-session \
       -d \
       -s a_session \
       'sudo /usr/bin/nsenter --setuid 1000 --setgid 1000 --net=/var/run/netns/nns-a -- socat file:$(tty),raw,echo=0 tcp:10.10.10.1:2222'

  ## 3. Capture the socat process ID
  #
  SOCAT_PID=$(pgrep -u "root" socat)

  ## 4. Get the /dev/pts of the socat connection
  #
  DEV_PTS=$(tmux list-panes -t a_session -F '#{pane_tty}')

  ## 5. Consume all the piped commands
  #
  while read cmd
  do
    sudo /usr/bin/nsenter --setuid 1000 \
                          --setgid 1000 \
                          --net=/var/run/netns/nns-a \
                          -- \
                          ttyexec -n ${DEV_PTS} "${cmd}"
  done

  ## 6. Exit, if not already done.
  #
  if pgrep -u "root" socat
  then
    sudo /usr/bin/nsenter --setuid 1000 \
                          --setgid 1000 \
                          --net=/var/run/netns/nns-a \
                          -- \
                          ttyexec -n ${DEV_PTS} "exit"
  fi
fi

누군가에게 도움이 되었기를 바랍니다.

답변2

리버스 쉘의 경우:

sudo /usr/bin/nsenter --setuid 1000 --setgid 1000 --net=/var/run/netns/ns-a -- socat TCP4:10.10.10.1:2222 EXEC:/bin/bash

그런 다음 백그라운드에서 스크립트를 실행합니다.

./my-script &

반면에:

socat -d TCP4-LISTEN:2222 STDOUT
<commands to execute>

관련 정보