Bash 스크립트가 있습니다.
- 뭔가를 해라
- 리버스 쉘을 연결하거나 엽니다.
- 다른 일을 해라
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
간단하지 않다는 것입니다.
따라서 해결책은 두 부분으로 구성됩니다.
tmux
백그라운드 연결 에 사용됩니다socat
.ttyecho
각 파이프라인 명령을 백그라운드로 보내는 데 사용됩니다socat
.
ttyecho
는Pratik Sinha의 맞춤형 유틸리티, 그리고 그 중 하나녹슨 상자.
이 명령줄 도구는 기능적으로 ttyecho
Ubuntu 패키지의 일부와 유사하지만 제가 아는 한 도구 개발이 중단되었으며 마지막 Ubuntu 패키지는 12.04용이었습니다.writevt
console-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>