Используйте объемные операции SOCAT несколько машин

Linux
Используйте объемные операции SOCAT несколько машин

Оригинал: Code Logs (идентификатор общедоступной учетной записи WeChat: codelogs), добро пожаловать в общий доступ, пожалуйста, сохраните источник для перепечатки.

Сцены

Много раз нам нужно работать с несколькими машинами в пакетном режиме. В отрасли обычно для этого используется Ansible, но предпосылка использования Ansible для работы с несколькими машинами требует разрешений ssh. К сожалению, для разработчиков, как правило, нет формальной среды. машины может войти в систему только через назначенную запись, что понятно, ведь формальная среда так важна.

Однако, если ваша производственная среда может получить доступ к вашей машине разработки, вы можете получить доступ к машине через обратную оболочку, а затем объединить обратную оболочку с tmux для достижения эффекта одновременной работы нескольких машин, что и будет представлено в этой статье. .

Передняя и обратная оболочка

Если вы знаете команду nc, вы, должно быть, слышали, что nc может создавать прямую или обратную оболочку.Я не буду объяснять здесь концепцию прямой или обратной оболочки.Пример.
Из-за неоднозначности самой команды nc, в некоторых статьях используется команда nc, а в некоторых статьях — netcat. Между ними есть некоторые различия, поэтому в данном примере ncat используется напрямую. во избежание путаницы.

IP-адрес машины разработки: 192.168.0.10. IP сервера 192.168.0.1

#正向Shell,1.服务器上使用ncat监听
ncat -l 9999 -e /bin/bash
#正向Shell,2.开发机上连接
ncat 192.168.0.1 9999

#反向Shell,1.开发机上使用ncat监听
ncat -l 9999
#反向Shell,2.服务器上连接
ncat 192.168.0.10 9999 -e /bin/bash

Эффект следующий:
ncat反向Shell

Forward Shell, ncat прослушивает на сервере порт 9999. Когда машина разработки подключена к ncat, после успешного подключения ncat на сервере откроет процесс bash для обслуживания соединения.
В обратной оболочке ncat прослушивает порт 9999 на машине разработки.Когда сервер подключен к ncat, после успешного подключения ncat на сервере откроет процесс bash для обслуживания соединения.
По сути, разница между прямой и обратной оболочками заключается только в направлении, в котором устанавливается TCP-соединение.Примерный процесс взаимодействия оболочки, предоставляемой ncat, выглядит следующим образом:
ncat(client) <-> ncat(server) <-> bash
При вводе команды в разработке разработчика и введите, команда отправит команду в процесс Bash после получения NCAT (Server), NCAT (Server), команда отправляется в процесс Bash, процесс Bash после выполнения, Результатом команды вернется к NCAT (Server), а NCAT (Server) возвращается в NCAT (клиент) на разработчик через сетевое соединение.

Однако, когда вы на самом деле используете эту обратную оболочку, вы обнаружите много неудобств, таких как использование tail -f для просмотра файлов журнала после того, как вы захотите нажать Ctrl + C для выхода из tail, но обнаружите, что даже процесс ncat завершился, это Самый невыносимый пункт, к тому же, типа "Завершение вкладок/История со стрелкой вверх/vim/Ctrl+d/Ctrl+z" и тому подобное нельзя использовать, очень неудобно. Обычно мы называем полученную оболочку слабой оболочкой, и если мы хотим получить сильную оболочку, нам нужен сокат для игры.

Получить Strong Shell через socat

socat похожа на команду nc, но намного мощнее, чем nc.Например, через socat можно получить полную оболочку следующим образом:

#正向Shell,1.服务器上使用socat监听
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork
#正向Shell,2.开发机上连接
socat file:`tty`,raw,echo=0 tcp:192.168.0.1:9999

#反向Shell,1.开发机上使用socat监听
socat file:`tty`,raw,echo=0 tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork
#反向Shell,2.服务器上连接
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.0.10:9999

Эффект следующий:
socat反向Shell

Принцип похож на ncat, но socat может предоставлять tty и pty, потому что, как и Ctrl + C, это сигнал, предоставляемый терминалом tty для bash, а не символ, поэтому в ncat, поскольку tty отсутствует, Ctrl + C сигнал не может быть передан программе bash на стороне сервера.

Процесс взаимодействия с оболочкой, предоставляемый socat, вероятно, выглядит следующим образом:
tty <-> socat(client) <-> socat(server) <-> pty <-> bash

Итак, что такое tty? Я не очень хорошо понимаю здесь.Вы можете просто думать, что клавиатура и экран ttys.Содержимое клавиатуры будет использоваться как ввод tty, а вывод tty будет отображаться на экране .

tmux реализует одновременную работу нескольких машин

tmux — терминальный мультиплексор, чаще всего используется для реализации разделенного экрана, так как реверсивный шелл можно получить через socat, затем отображать реверсивный шелл каждой машины на каждом разделенном экране tmux, можно посмотреть подробнее Результат выполнения команды обратная оболочка, и в то же время операция tty специального разделенного экрана перенаправляется на несколько обратных оболочек одновременно, что реализует одновременную работу нескольких машин, и эффект следующий:

Ниже приведена команда для достижения работы с несколькими машинами:

# 1.开发机上监听
nohup socat tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork exec:'bash socatscript.sh' &
# 2.在多个服务器上连接
nohup socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.0.10:9999 &
# 3.进入tmux分屏界面
tmux a -t socatSession

Это реализация скрипта socatscript.sh

#!/bin/bash

SOCKDIR=$(mktemp -d)
SOCKF=${SOCKDIR}/usock
SESSION_NAME=${1:-socatSession}
WINDOW_NAME=${2:-socatWindown}

# create session and window
tmux has-session -t $SESSION_NAME
if [[ $? -eq 1 ]];then
    tmux new -s $SESSION_NAME -n $WINDOW_NAME -d "socat file:\`tty\`,raw,echo=0 exec:'ncat -lk 9998'"
fi
# split windown 0
tmux split-window -h -t 0 "socat file:\`tty\`,raw,echo=0 UNIX-LISTEN:${SOCKF},umask=0077"
tmux select-pane -t 0
tmux select-layout -t $WINDOW_NAME main-horizontal
tmux resize-pane -t 0 -y 2
# Wait for socket
while test ! -e ${SOCKF} ; do sleep 1 ; done
while ! $(ncat -z localhost 9998) ;do sleep 1; done;
# Use socat to ship data between the unix socket and STDIO.
socat -U STDOUT TCP:localhost:9998 &
exec socat STDIO UNIX-CONNECT:${SOCKF}

Основная функция заключается в том, что всякий раз, когда есть обратное соединение оболочки, на TMux создается новый разделенный экран, а обратная оболочка отображается на новом разделенном экране. В то же время предоставляется специальный разделенный экран (верхний) , Команды, введенные на этом разделенном экране, будут пересылаться каждой обратной оболочке.
Если вы обнаружите, что текст не может обратить Shell в полноэкранном режиме, необходимоstty rows 63 columns 204Сбросить ширину и высоту отображения текущего tty.
И, если у вас есть права доступа к машине ssh, а также вы хотите использовать этот метод разделения экрана tmux для выполнения команд, вам нужно всего лишь заменить bash на ssh следующим образом:

# 1.开发机上监听
nohup socat tcp-listen:9999,bind=0.0.0.0,reuseaddr,fork exec:'bash socatscript.sh' &
# 2.开发机上,使用ssh连接到多个机器
nohup socat exec:'sshpass -p "xxx" ssh root@192.168.0.10',pty,stderr,setsid,sigint,sane tcp:localhost:9999 &
# 3.进入tmux分屏界面
tmux a -t socatSession

Разве это не круто, даже ansible можно установить без него!

Суммировать

Команда socat очень мощная и заслуживает хорошего изучения.В то же время, когда вы будете учиться успешно, вы обнаружите, что ваше понимание различных концепций поднялось на шаг вперед.

Прошлый контент

Повышение эффективности работы, навыки написания сценариев Shell (2)
Повысьте эффективность работы, curl вызывает защищенный подписью интерфейс (3)
Повысьте эффективность работы, вам поможет команда jq (4)