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"
Комментарии (0)