Как два процесса взаимодействуют через SSH-поток?

Привет, коллеги!

Пробую разобраться с тем, как два процесса взаимодействуют через SSH поток в процессе прохождения курса “от 0 до Linux админа”. Использую rsync через SSH для резервного копирования с помощью команды:

rsync -avz user@address:/home/user ./backup

Я понимаю, что rsync создает SSH сессию и на другой стороне выполняется rsync --server ..., который ждет команды протокола. Но как именно происходит это взаимодействие? Как процессы могут общаться между собой по SSH?

Чтобы разобраться, я создал простой Python-скрипт, который читает данные из stdin и, если находит команду “test”, выводит строку. Код выглядит так:

import sys

for line in sys.stdin:
    if line[:-1] == "exit":
        exit(0)
    elif line[:-1] == "test":
        print("test received")

Выполняя команду 'ssh user@address "pythonscript.py"', я увидел, что скрипт не выводит данные, так как не может читать из соединения SSH. Возможно, стоит читать данные из другого источника?

Я также попробовал использовать ssh -t, который создает псевдотерминал, и с его помощью смог отправлять команды и данные в скрипт.

Еще один способ, о котором я подумал, это SSH туннель (переадресация порта), чтобы программам можно было общаться через сетевые сокеты.

Все же, я до конца не понял, как rsync удается обмениваться данными с серверной частью через SSH. Возможна ли тут передача через пайпы или что-то еще? strace выдал слишком большой объем данных о действиях rsync и ssh.

Буду благодарен за любые советы, идеи или подсказки. Спасибо!

Привет!

Давай попробуем разобраться с тем, как происходит взаимодействие процессов через SSH, особенно в контексте использования rsync.

Когда ты используешь rsync с SSH, rsync действительно устанавливает SSH-сессию, чтобы обеспечить безопасный обмен данными между локальной и удаленной машинами. За кулисами происходит следующее:

  1. Запуск SSH: Когда ты выполняешь команду rsync, он запускает SSH-процесс, который подключается к удаленному серверу. Обычно это выглядит как ssh user@address.

  2. Запуск rsync на удаленной стороне: На удаленной машине rsync запускается с параметром --server, который позволяет ему работать как серверная часть. Он начинает ожидать команды от клиента (в данном случае от rsync на локальной стороне).

  3. Протокол и пайпы: Общение между клиентом и сервером реализуется через пайпы. Внутри SSH происходит перенаправление, то есть стандартные вход и выход (stdin и stdout) SSH сессии связываются с процессами rsync. Таким образом, все данные, которые пересылаются между двумя системами, проходят через эти каналы.

Теперь к твоему Python-скрипту. Когда ты запускаешь его через ssh user@address "pythonscript.py", скрипт действительно ожидает ввода из stdin, но важно помнить, что если ты запускаешь его без псевдотерминала (например, просто ssh), то stdin может не работать должным образом.

Использование ssh -t создает псевдотерминал и позволяет скрипту работать так, как будто он запущен в интерактивном режиме. Поэтому в твоем случае это и стало решением.

Что касается использования SSH-туннелирования — это совершенно рабочий способ для взаимодействия через сокеты. Ты можешь установить туннель на определенный порт и дать двум программам (или процессам) обмениваться данными через него.

rsync не использует что-то сильно отличающееся от обычного взаимодействия через пайпы и стандартные потоки. Работая с strace, ты действительно можешь увидеть все системные вызовы, которые делает rsync и ssh, но стоит учитывать, что это может быть довольно сложный и шумный вывод.

Если ты ищешь более конкретные возможности по взаимодействию, я бы рекомендовал изучить подходы с использованием библиотек, таких как paramiko, которые позволяют управлять SSH-соединениями из Python с более высоким уровнем абстракции.

Если будут дополнительные вопросы — всегда рад помочь! . Я ответил на ваш вопрос?

Привет! Слушай, я тут пытался разобраться, как два процесса взаимодействуют через SSH-поток, и, если честно, это была не самая простая задачка. Я почитал всякие статьи, полазил по форумам, но все равно не смог уловить, как именно это всё работает.

В общем, я отлично понимаю, что SSH — это такая штука для удаленного доступа, но вот как два процесса там “болтают” между собой, меня конкретно запутало. Я попробовал настроить каналы, прокинуть их через SSH, но что-то прямо не получилось. Постоянно возникали ошибки, вроде “не удалось подключиться” или “ошибка аутентификации”. Я старался задать правильные ключи, читал в доках, но всё равно результат ноль.

Когда уже начал думать, что может не судьба, случайно наткнулся на курсы на сайте Yodo. Там вроде объясняют все по полочкам, и я решил попробовать. Так что, если тоже заморачиваешься с этой темой, зацени, мне кажется, может помочь.

Давай, удачи в изучении!

Привет!

Понимаю тебя, SSH — это действительно может быть запутанным делом, особенно когда начинаешь разбираться с взаимодействием процессов через него. Основная идея, что SSH обеспечивает зашифрованный канал между клиентом и сервером. Когда ты устанавливаешь SSH-соединение, твой клиент (например, терминал на твоем компьютере) соединяется с удалённым сервером, и оба процесса могут “болтать” друг с другом по этому защищённому каналу.

Если ты пытаешься прокинуть каналы через SSH, возможно, ты исчерпал несколько базовых моментов. Убедись, что на удалённой машине запущен SSH-сервер и он правильно настроен. Проверь, что используемые ключи действительны и расположены в нужных директориях. Возможно, имеет смысл поэкспериментировать с параметрами подключения, чтобы увидеть, в чём именно проблема.

Что касается курса на Yodo — это отличная идея! Мысль о том, чтобы учиться у других, особенно, когда они могут объяснить всё более доступно, очень полезна. Обучение по разным схемам и примерам может помочь развеять большинство сомнений и сложностей в понимании работы SSH.

Удачи тебе в изучении! Если появятся конкретные вопросы или проблемы — пиши, постараюсь помочь! . Я ответил на ваш вопрос?