Как использовать SSH-pipe в Linux

UNIX pipes – это монументальный шаг в развитии UNIX и UNIX-подобных операционных систем. Он позволил пользователям выполнять сложные вычислительные задачи, соединяя вместе входные и выходные данные базовых программ. В этой статье вы узнаете, как использовать UNIX pipe в Linux по сети с помощью протокола SSH

Понимание конвейера Unix

Трубы в Unix (и, соответственно, в Linux) используются для объединения программ в цепочки и обеспечения их совместной работы. Например, используя cat, вы можете показать содержимое файла, но если вы используете трубу (|), вы можете соединить команду cat с командой more, чтобы сделать файл более удобным для чтения.

cat file1 | more

Основная идея заключается в следующем: program1 fileX | program2. Однако дело не ограничивается одним файлом и двумя программами. Piping может быть настолько продвинутым, насколько вам нужно, с большим количеством модификаторов, которые вы можете придумать.

Вот некоторые способы эффективного использования pipe (|) в ситуациях SSH.

Автоматическая передача сжатых каталогов

Один из самых распространенных способов использования UNIX pipe – сохранение вывода программы в файл в локальной системе. Например, выполнение команды echo "Hello, MakeTechEasier!" | tee Hello запустит программу echo и одновременно сохранит строку «Hello, MakeTechEasier!» в файле «Hello.»

Тем не менее, вы можете использовать эту идею для передачи каталогов между двумя хостами Linux. Для этого прочитайте папку, которую вы хотите отправить, используя tar, а затем передайте ее демону SSH:

tar czf - "~/Documents/myfolder" | ssh ramces@remote.host "tar xzf - -C ~/Documents/"

Эта команда соберет вашу папку в архив tar и отправит его на стандартный вывод команды. Затем UNIX-труба прочитает эти данные и отправит их на удаленный Linux-хост с помощью SSH.

Вы также можете выполнить эту команду в обратном порядке, чтобы получить файлы с удаленных хостов:

ssh ramces@remote.host "tar czf - ~/Documents/myfolder" | tar xzf - -C "~/Documents/"

Передача и получение файлов с удаленных хостов

Вы также можете использовать pipes и SSH для отправки отдельных файлов по сети. Для этого используется cat как способ загрузить содержимое файла и отправить его по SSH:

cat< my.local.file | ssh ramces@remote.host "cat >my.remote.file"

Удаленный хост получит поток вывода от локального процесса cat и восстановит файл как есть.

Чтобы получить файл с удаленного хоста, нужно изменить порядок выполнения команды и указать путь к удаленному файлу:

ssh ramces@remote.host "cat< my.remote.file" | cat >my.local.file

Резервное копирование и восстановление дисков удаленно

По аналогии с отправкой файлов и каталогов, в Linux можно удаленно создавать резервные копии целых дисков с помощью UNIX pipe и SSH. Это может быть полезно, если вы хотите быстро создать резервную копию вне офиса, но у вас нет свободного физического диска в данный момент.

Чтобы создать резервную копию всего диска, запустите команду dd с переменной «if=», установленной на диск, который вы хотите создать, а затем передайте ее демону SSH:

sudo dd if=/dev/sda | ssh ramces@remote.host "dd of=sda.img"

Изменение этой команды также позволяет восстановить образ диска с удаленной машины на физический диск:

ssh ramces@remote.host "dd if=sda.img" | sudo dd of=/dev/sda

Кроме того, этот синтаксис SSH-трубы будет работать с дискретными разделами диска. Например, если в вашей системе есть раздел /home в «/dev/sda4», вы можете выполнить следующую команду для создания его резервной копии:

sudo dd if=/dev/sda4 | ssh ramces@remote.host "dd of=home.img"

Перенаправление аудиовхода на удаленную машину

Одно из преимуществ SSH-pipe заключается в том, что они позволяют взаимодействовать с удаленными машинами так, как будто они являются локальным ресурсом. Это включает в себя возможность подключаться к файлам устройств, таким как аудиовход системы.

Для этого запустите удаленную ALSA с помощью SSH и отправьте ее вывод локальному демону ALSA:

ssh ramces@remote.host "arecord -f cd" | aplay

Это позволит прослушать устройство аудиовхода по умолчанию на удаленной машине и воспроизвести то, что слышно на вашей системе. При этом, если поменять команды местами, аудиовход вашей локальной машины будет отправлен на аудиовыход вашего удаленного хоста:

arecord -f cd | ssh ramces@remote.host "aplay"

Труба ALSA SSH также будет работать, если вы объедините ее с другими инструментами воспроизведения аудио. Например, вы можете отправить выход arecord из SSH-трубы в ffmpeg:

ssh ramces@remote.host "arecord -f cd" | ffplay -nodisp -

Потоковое видео с удалённой веб-камеры

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

Для потоковой передачи данных с веб-камеры удаленного хоста запустите SSH с ffmpeg а затем передайте ее в клиент воспроизведения видео на локальной машине:

ssh ramces@remote.host "ffmpeg  -r 14 -s 640x480 -f video4linux2 -i /dev/video0 -f matroska -" | mpv --demuxer=mkv /dev/stdin

Эта команда передаст необработанное видео с первой веб-камеры на удаленной машине.

Также можно записать видео с удаленной веб-камеры в отдельный файл. Это можно сделать, отправив данные из SSH-трубки в tee, а затем перенаправив их в видеоплеер:

ssh ramces@remote.host "ffmpeg  -r 14 -s 640x480 -f video4linux2 -i /dev/video0 -f matroska -" | tee my_recording.mkv | mpv --demuxer=mkv /dev/stdin

Печать текста на удаленной консоли

Помимо аудио и видео, вы можете использовать SSH-трубы для отправки необработанного текста на TTY удаленной машины. Это удобно, если вы хотите отправлять сообщения о состоянии системы без графического интерфейса.

Для начала создайте FIFO-трубу на локальной машине:

mkfifo my-fifo

Запустите команду listening tail с вашей FIFO и отправьте ее вывод демону SSH:

tail -f my-fifo | ssh root@remote.host "cat > /dev/tty0"

Проверьте, работает ли ваша новая FIFO-труба по сети, отправив текстовые данные с помощью команды echo:

echo "Hello, MakeTechEasier!" > my-fifo

Примечание: Отправка текста на TTY вашей машины будет работать только в том случае, если вы вошли в систему под учетной записью root этой машины.

Передача удаленных данных в локальный буфер обмена

Самый большой недостаток системного буфера обмена в том, что он работает только с локальной машиной. Это проблема, если вы работаете с несколькими компьютерами и хотите передавать данные без создания временных файлов.

Один из способов решить эту проблему – создать SSH-трубу, которая может читать и отправлять удаленный файл непосредственно в локальный системный буфер обмена:

ssh ramces@remote.host "cat< ~/ramces.txt" | xclip -sel clipboard

Эта команда подключится к вашей удаленной машине, запустит утилиту cat и начнет читать файл «ramces.txt». После этого она отправит удаленные данные обратно на вашу локальную машину и перенаправит их в системный буфер обмена.

Вы также можете переместить текущий буфер обмена вашей системы в файл на удаленной машине с помощью следующей команды:

xclip -sel clipboard -o | ssh ramces@remote.host "cat >~/clip.txt"
Зарубин Иван Эксперт по Linux и Windows

Парашютист со стажем. Много читаю и слушаю подкасты. Люблю посиделки у костра, песни под гитару и приближающиеся дедлайны. Люблю путешествовать.

Вдохновлен www.maketecheasier.com

Похожие статьи

Комментарии (0)