Một trong những điều mà tôi luôn yêu thích về Unix và sau đó là Linux là cách nó cho phép tôi kết nối một loạt các lệnh với các đường ống và hoàn thành rất nhiều công việc mà không cần nhiều nỗ lực. Bạn có thể tạo ra đầu ra ở dạng mà bạn cần. Nó không chỉ là sự tồn tại của chính các đường ống, mà còn là sự linh hoạt của các lệnh Linux. Bạn có thể chạy lệnh, chọn các phần của đầu ra, sắp xếp kết quả hoặc khớp trên các chuỗi cụ thể và bạn có thể phân tích kết quả xuống đúng với những gì bạn muốn xem.
Trong bài đăng này, chúng ta sẽ xem xét một vài lệnh thể hiện sức mạnh của đường ống và cách dễ dàng bạn có thể nhận được các lệnh để làm việc cùng nhau.
Lệnh ví dụ đầu tiên này bắt đầu bằng cách sử dụng sudo để chạy lệnh chkrootkit. Lệnh này kiểm tra các dấu hiệu của rootkit trên hệ thống của bạn bằng cách sử dụng một quy trình chi tiết để phát hiện chữ ký có liên quan đến rootkit đã biết. Lệnh sẽ dễ dàng tạo ra hơn 100 dòng đầu ra. Tuy nhiên, để có được một bản tóm tắt rất hữu ích về những gì nó tìm thấy, bạn có thể chạy một lệnh như thế này:
$ sudo chkrootkit | awk '{print $(NF-1) " " $NF}' | sort | uniq -c
1 a while...
2 enp0s25: PF_PACKET(/usr/sbin/NetworkManager)
1 is `/'
21 not found
3 nothing deleted
2 nothing detected
56 nothing found
41 not infected
3 not tested
1 PF_PACKET sockets
1 pts/0 bash
1 suspect files
1 TTY CMD
1 /usr/lib/.build-id /usr/lib/debug/.dwz
1 /var/run/utmp !
Các lệnh ở trên chạy chkrootkit làm gốc, chỉ chọn hai chuỗi cuối cùng trong mỗi dòng đầu ra, sắp xếp kết quả và sau đó đếm số lần mỗi kết quả hai chuỗi được trả về. Mặc dù điều này không có cách nào thay thế cho việc nhìn vào đầu ra hoàn chỉnh,nhưng nó có thể cho bạn biết rất nhiều về tình trạng của hệ thống liên quan đến các rootkit có thể tìm thấy.
Trong đầu ra ở trên, chúng ta có thể dễ dàng thấy rằng hầu hết đầu ra này có khả năng là những gì chúng ta hy vọng sẽ thấy. "Không có gì bị xóa" và "không có gì được phát hiện" là tốt đẹp, nhưng lưu ý 41 tin nhắn "không bị nhiễm" rõ ràng là tin tốt. Thông báo "tệp nghi ngờ" duy nhất thực sự là "không có tệp nghi ngờ" và yêu cầu xem xét lại đầu ra ban đầu để xác nhận.
Biểu thức awk trong lệnh tổng thể đang hiển thị hai trường cuối cùng. Vì NF là cách awk thể hiện số lượng trường, $NF là giá trị của trường cuối cùng và $(NF-1) là giá trị của trường trước đó. Khoảng trống trong các trích dẫn giữ cho các trường này không bị kẹt lại với nhau.
Lệnh sort sau đó sắp xếp tất cả các chữ số đầu ra trong khi lệnh cuối cùng, uniq -c, đếm bao nhiêu lần mỗi dòng đầu ra xuất hiện trong mỗi nhóm tuần tự trong đầu ra tổng thể.
Lưu ý rằng nó giúp làm quen với nơi tất cả các số liệu thống kê đến từ đâu. Nhìn trực tiếp vào đầu ra chkrootkit, bạn có thể sẽ thấy nhiều dòng như thế này
ROOTDIR is `/'
Checking `amd'... not found
Checking `basename'... not infected
Checking `biff'... not found
Checking `chfn'... not infected
Checking `chsh'... not infected
Checking `cron'... not infected
Checking `crontab'... not infected
Checking `date'... not infected
Checking `du'... not infected
Checking `dirname'... not infected
Checking `echo'... not infected
Checking `egrep'... not infected
Checking `env'... not infected
Checking `find'... not infected
Checking `fingerd'... not found
Checking `gpm'... not found
Checking `grep'... not infected
Những dòng này đều cho thấy chkrootkit đã kiểm tra rất nhiều về các nhiễm trùng lệnh có thể xảy ra, nhưng không tìm thấy vấn đề gì. Một lát sau, bạn có thể thấy các dòng như thế này chỉ ra rằng các dấu hiệu có thể của phần mềm độc hại không được tìm thấy trên hệ thống.
Searching for sniffer's logs, it may take a while... nothing found
Searching for HiDrootkit's default dir... nothing found
Searching for t0rn's default files and dirs... nothing found
Searching for t0rn's v8 defaults... nothing found
Lệnh piped cung cấp một bản tóm tắt hữu ích và có thể dễ dàng biến thành một kịch bản để bạn không phải gõ nó hoặc thậm chí nhớ nó mỗi khi bạn muốn sử dụng nó.
#!/bin/bash
sudo chkrootkit | awk '{print $(NF-1) " " $NF}' | sort | uniq -c
Lệnh chỉ mất khoảng 30 giây để chạy trên hệ thống của bạn và giúp bạn dễ dàng chạy các kiểm tra này thường xuyên.
Để tạo danh sách ID quy trình được liên kết với các quy trình mà một số người dùng cụ thể đang chạy, bạn có thể sử dụng một lệnh như thế này:
$ ps aux | grep nemo | grep -v grep | awk '{print $2}'
903665
903674
903680
903695
903703
Lệnh piped này sử dụng ps aux để liệt kê tất cả các quy trình đang chạy, thu hẹp đầu ra xuống chỉ những quy trình được điều hành bởi người dùng nemo, loại trừ lệnh "grep nemo" (vì nó không được điều hành bởi nemo) và sau đó giảm danh sách xuống chỉ còn ID quy trình. Nếu bạn chỉ muốn xem số lượng quy trình thay vì tất cả các ID quá trình, hãy thêm một đường ống khác và lệnh wc -l.
$ ps aux | grep nemo | grep -v grep | awk '{print $2}' | wc -l
5
Nếu bạn đang nhìn vào một người dùng đăng nhập vào bảng điều khiển hệ thống, bạn có thể muốn ống đầu ra đến lệnh cột để bạn thấy tất cả các quy trình trên một màn hình duy nhất.
$ ps aux | grep shs | grep -v grep | awk '{print $2}' | column
4508 4620 4728 4764 4802 4856 4884 4893 5030 6003
4515 4621 4729 4770 4814 4868 4886 4895 5046 897442
4528 4623 4737 4774 4819 4869 4888 4896 5049 897447
4538 4650 4741 4775 4821 4878 4889 4897 5092 897455
4541 4703 4742 4781 4827 4879 4890 4992 5258 904175
4543 4710 4745 4788 4839 4880 4891 5016 5276 904178
4545 4723 4753 4790 4846 4881 4892 5021 5997 904179
Như bạn có thể thấy từ các lệnh ở trên, các đường ống có thể giúp bạn biến đầu ra của các lệnh Linux thành một biểu mẫu hiển thị đúng những gì bạn muốn biết. Và, bất kể các lệnh này trở nên phức tạp như thế nào, bạn có thể lưu chúng dưới dạng bí danh hoặc kịch bản để bạn không phải tạo lại chúng mỗi khi bạn cần sử dụng chúng.