Cách sử dụng SSH Pipe trên Linux

UNIX pipe là một bước tiến lớn trong sự phát triển của hệ điều hành UNIX và giống UNIX. Nó cho phép người dùng thực hiện các tác vụ tính toán phức tạp bằng cách liên kết đầu vào và đầu ra của những chương trình cơ bản với nhau. Bài viết này mở rộng điều đó bằng cách chỉ cho bạn cách sử dụng UNIX pipe trong Linux qua mạng bằng giao thức SSH.

Tìm hiểu về Unix Pipeline

Các pipe trên Unix (và mở rộng ra là Linux) được sử dụng để kết nối các chương trình và làm cho chúng hoạt động cùng nhau. Ví dụ, khi sử dụng cat, bạn có thể hiển thị nội dung của file, nhưng nếu bạn sử dụng dấu gạch đứng (|), bạn có thể xâu chuỗi lệnh cat với lệnh more để giúp đọc file dễ dàng hơn.

cat file1 | more

Ý tưởng cơ bản ở đây là: program1 fileX | program2. Tuy nhiên, nó không chỉ giới hạn ở một file và hai chương trình. Piping có thể trở nên tiên tiến hơn theo nhu cầu của bạn, với nhiều công cụ sửa đổi mà bạn có thể nghĩ ra.

Dưới đây là một số cách để sử dụng tốt pipe (|) trong các tình huống SSH.

Tự động chuyển thư mục nén

Một trong những cách phổ biến nhất khi sử dụng UNIX pipe là lưu trữ đầu ra của chương trình vào một file ở đâu đó trong hệ thống cục bộ. Ví dụ, chạy echo "Hello, MakeTechEasier!" | tee Hello sẽ chạy chương trình echo đồng thời lưu trữ chuỗi “Hello, MakeTechEasier!” bên trong file “Hello”.

Terminal hiển thị chuyển hướng UNIX pipeline cơ bản trong máy cục bộ.
Terminal hiển thị chuyển hướng UNIX pipeline cơ bản trong máy cục bộ.

Điều đó có nghĩa là bạn có thể sử dụng ý tưởng này để chuyển các thư mục trên hai máy chủ Linux. Để làm điều đó, hãy đọc thư mục bạn muốn gửi bằng tar, sau đó chuyển thư mục đó tới SSH daemon:

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

Lệnh này sẽ gói thư mục của bạn vào một kho lưu trữ tar và gửi nó đến đầu ra tiêu chuẩn của lệnh. Sau đó, UNIX pipe sẽ đọc dữ liệu đó và gửi nó đến máy chủ Linux từ xa của bạn bằng SSH.

Bạn cũng có thể đảo ngược lệnh này để lấy file của mình ra khỏi máy chủ từ xa:

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

Đẩy và truy xuất file từ máy chủ từ xa

Bạn cũng có thể sử dụng pipe và SSH để gửi các file riêng lẻ qua mạng. Điều này hoạt động bằng cách sử dụng cat như một cách để tải nội dung của file và gửi file đó qua SSH:

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

Máy chủ từ xa sẽ nhận luồng đầu ra từ tiến trình cat cục bộ và xây dựng lại file như cũ.

Để truy xuất file từ máy chủ từ xa, bạn cần đảo ngược thứ tự của lệnh và cung cấp đường dẫn cho file từ xa:

ssh ramces@remote.host "cat < my.remote.file" | cat > my.local.file
Terminal hiển thị quá trình truyền file riêng lẻ bằng SSH pipe trong Linux.
Terminal hiển thị quá trình truyền file riêng lẻ bằng SSH pipe trong Linux.

Sao lưu và khôi phục ổ từ xa

Tương tự như việc gửi file và thư mục, có thể sao lưu từ xa toàn bộ ổ trong Linux bằng UNIX pipe và SSH. Điều này có thể hữu ích nếu bạn muốn tạo bản sao lưu ngoại vi nhanh chóng và hiện tại bạn không có ổ vật lý dự phòng.

Để sao lưu toàn bộ ổ, hãy chạy dd với biến “if=” được đặt thành ổ bạn muốn sao lưu, sau đó chuyển nó sang SSH daemon của bạn:

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

Đảo ngược lệnh này cũng cho phép bạn khôi phục disk image từ máy từ xa sang ổ đĩa vật lý:

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

Hơn nữa, cú pháp SSH pipe này cũng sẽ hoạt động với các phân vùng ổ đĩa rời rạc. Ví dụ, nếu hệ thống của bạn có phân vùng /home trong “/dev/sda4”, bạn có thể chạy lệnh sau để tạo bản sao lưu của phân vùng đó:

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

Chuyển hướng đầu vào âm thanh sang máy từ xa

Một trong những lợi ích của SSH pipe là chúng cho phép bạn tương tác với các máy từ xa như thể chúng là tài nguyên cục bộ. Điều này bao gồm khả năng khai thác các file thiết bị, chẳng hạn như đầu vào âm thanh của hệ thống.

Để thực hiện việc này, hãy chạy một subshell ALSA từ xa bằng SSH và gửi đầu ra của nó tới daemon ALSA cục bộ của bạn:

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

Điều này sẽ lắng nghe thiết bị đầu vào âm thanh mặc định trên máy từ xa và phát những gì nó nghe được trên hệ thống của bạn. Điều đó có nghĩa là, việc lật các lệnh xung quanh sẽ gửi đầu vào âm thanh của máy cục bộ đến đầu ra âm thanh của máy chủ từ xa:

Terminal hiển thị luồng âm thanh đang hoạt động bằng SSH pipe.
Terminal hiển thị luồng âm thanh đang hoạt động bằng SSH pipe.
arecord -f cd | ssh ramces@remote.host "aplay"

ALSA SSH pipe cũng sẽ hoạt động khi bạn kết hợp nó với các công cụ phát âm thanh khác. Chẳng hạn, bạn có thể gửi đầu ra arecord từ SSH pipe tới ffmpeg:

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

Truyền phát video trực tiếp từ webcam từ xa

Một cách sử dụng tuyệt vời khác của các SSH pipe trong Linux là truyền phát các nguồn cấp dữ liệu webcam video trực tiếp. Cũng giống như âm thanh, điều này cho phép bạn tận dụng lợi thế thiết bị của máy chủ từ xa và hiển thị đầu ra của thiết bị đó trên máy cục bộ của bạn.

Để truyền phát từ webcam của máy chủ từ xa, hãy chạy SSH với shell con ffmpeg, sau đó chuyển nó tới ứng dụng client phát video trên máy cục bộ của bạn:

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

Lệnh này sẽ truyền phát video thô từ webcam đầu tiên trên máy từ xa của bạn.

Nguồn cấp dữ liệu video webcam đang hoạt động đi qua SSH pipe trong Linux.
Nguồn cấp dữ liệu video webcam đang hoạt động đi qua SSH pipe trong Linux.

Bạn cũng có thể ghi lại cảnh quay từ webcam từ xa sang một file riêng. Bạn có thể thực hiện việc này bằng cách gửi dữ liệu từ SSH pipe tới tee trước khi chuyển hướng dữ liệu đó đến trình phát video của mình:

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

In văn bản trên console từ xa

Ngoài âm thanh và video, bạn cũng có thể sử dụng SSH pipe để gửi văn bản thô trên TTY của máy từ xa. Điều này hữu ích nếu bạn muốn gửi thông báo trạng thái tới hệ thống không có GUI.

Để bắt đầu, hãy tạo một FIFO pipe trên máy cục bộ của bạn:

mkfifo my-fifo

Chạy lệnh nghe tail bằng FIFO của bạn và gửi đầu ra của nó tới SSH daemon:

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

Kiểm tra xem FIFO pipe mới của bạn có hoạt động qua mạng hay không bằng cách gửi dữ liệu văn bản bằng lệnh echo:

echo "Hello, MakeTechEasier!" > my-fifo
Terminal hiển thị văn bản tùy ý trong console TTY của máy.
Terminal hiển thị văn bản tùy ý trong console TTY của máy.

Lưu ý: Việc gửi văn bản tới TTY của máy sẽ chỉ hoạt động nếu bạn đăng nhập bằng tài khoản root của máy đó.

Đưa dữ liệu từ xa vào clipboard cục bộ

Nhược điểm lớn nhất của clipboard hệ thống là nó chỉ hoạt động với máy cục bộ. Đây là sự cố nếu bạn đang làm việc với nhiều máy tính và muốn truyền dữ liệu mà không tạo file tạm thời.

Một cách để khắc phục điều này là tạo một SSH pipe có thể đọc và gửi file từ xa trực tiếp vào clipboard hệ thống cục bộ của bạn:

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

Lệnh này sẽ kết nối với máy từ xa của bạn, chạy tiện ích cat sau đó bắt đầu đọc file “ramces.txt”. Sau khi hoàn tất, nó sẽ gửi dữ liệu từ xa trở lại máy cục bộ của bạn và chuyển hướng dữ liệu đó đến clipboard hệ thống.

Terminal hiển thị clipboard của máy cục bộ sau SSH pipe.
Terminal hiển thị clipboard của máy cục bộ sau SSH pipe.

Bạn cũng có thể đẩy clipboard hiện tại của hệ thống dưới dạng file trên máy từ xa bằng cách sử dụng lệnh sau:

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

Học cách gửi dữ liệu qua mạng bằng cách sử dụng UNIX pipe và SSH chỉ là bước đầu tiên để hiểu cách mạng máy tính hoạt động. Tìm hiểu thêm về mạng của bạn bằng cách theo dõi nơi các gói của bạn đi bằng Traceroute.

Thứ Sáu, 26/01/2024 08:14
51 👨 148
0 Bình luận
Sắp xếp theo
    ❖ Linux