Kiến thức Hữu ích 😍

Lệnh who trong Linux: Hiển thị người dùng đăng nhập & Mẹo quản lý hệ thống


Bạn có bao giờ tự hỏi hệ thống Linux của mình đang có bao nhiêu người dùng đăng nhập cùng một lúc không? Việc biết ai đang truy cập vào hệ thống là một trong những kỹ năng cơ bản nhưng cực kỳ quan trọng đối với bất kỳ quản trị viên hệ thống nào. Nếu không giám sát chặt chẽ, bạn có thể bỏ lỡ những dấu hiệu của một cuộc truy cập trái phép hoặc không thể quản lý tài nguyên hệ thống một cách hiệu quả. Đây là lúc lệnh who trong Linux phát huy sức mạnh của mình. Mặc dù đơn giản, who là một công cụ mạnh mẽ, cung cấp cho bạn cái nhìn nhanh chóng và chính xác về các phiên đăng nhập hiện tại. Bài viết này sẽ đồng hành cùng bạn khám phá từ A-Z về lệnh who: từ chức năng, cách sử dụng cơ bản, các tùy chọn nâng cao, cho đến những ví dụ thực tế và mẹo hữu ích để bạn làm chủ công cụ này, góp phần nâng cao khả năng quản trị và bảo mật hệ thống của mình.

Giới thiệu và chức năng của lệnh who

Ý nghĩa và mục đích của lệnh who

Lệnh who là một trong những công cụ dòng lệnh cơ bản nhất trong môi trường Linux và các hệ điều hành tương tự Unix. Chức năng chính và cốt lõi của nó vô cùng đơn giản: hiển thị danh sách tất cả người dùng hiện đang đăng nhập vào hệ thống. Thông tin này không chỉ dừng lại ở tên người dùng, mà còn bao gồm các chi tiết quan trọng khác như họ đang sử dụng thiết bị đầu cuối (terminal) nào, thời điểm họ bắt đầu phiên làm việc, và đôi khi là địa chỉ IP hoặc tên máy chủ mà họ kết nối từ đó.

Trong quản lý hệ thống, vai trò của lệnh who là không thể thiếu. Nó giống như một người bảo vệ luôn túc trực, cho phép quản trị viên nhanh chóng kiểm tra “ai đang ở trong nhà”. Bằng cách chạy một lệnh duy nhất, bạn có thể ngay lập tức nắm được tình hình hoạt động của người dùng. Điều này đặc biệt quan trọng trong việc giám sát bảo mật. Một tài khoản không xác định hoặc một phiên đăng nhập vào thời điểm bất thường có thể là dấu hiệu cảnh báo sớm về một hành vi xâm nhập trái phép, giúp bạn kịp thời hành động trước khi có thiệt hại xảy ra.

Hình minh họa

So sánh nhanh với các lệnh liên quan (w, users)

Trong kho công cụ của Linux, who không phải là lệnh duy nhất giúp bạn xem thông tin người dùng đang đăng nhập. Có ít nhất hai “người anh em” khác là wusers. Mặc dù cùng mục đích, mỗi lệnh lại có những đặc điểm riêng và phục vụ cho các nhu cầu khác nhau.

Lệnh users là lệnh đơn giản nhất. Khi bạn gõ users, nó chỉ trả về một danh sách các tên người dùng đang đăng nhập, được ngăn cách bởi khoảng trắng. Nó cực kỳ tinh gọn, phù hợp khi bạn chỉ cần biết tên mà không cần thêm bất kỳ chi tiết nào khác.

Lệnh w lại cung cấp một bức tranh toàn cảnh và chi tiết hơn nhiều. Ngoài những thông tin mà who cung cấp (tên người dùng, terminal, thời gian đăng nhập), w còn cho bạn biết hệ thống đã hoạt động được bao lâu (uptime), tải trung bình của hệ thống (load average), và quan trọng nhất là câu lệnh mà mỗi người dùng đang thực thi. Đây là công cụ chẩn đoán mạnh mẽ khi bạn muốn biết chính xác người dùng đang “làm gì” trên hệ thống.

Vậy khi nào nên dùng who? Lệnh who là lựa chọn hoàn hảo khi bạn cần sự cân bằng giữa tính đơn giản và chi tiết. Nó cung cấp nhiều thông tin hơn users nhưng lại gọn gàng và dễ đọc hơn w. Nếu bạn chỉ muốn kiểm tra nhanh ai đang online, từ đâu và từ khi nào, mà không cần biết họ đang chạy chương trình gì, thì who chính là công cụ lý tưởng. Nó đủ nhanh để kiểm tra thường xuyên và đủ chi tiết cho các tác vụ giám sát cơ bản.

Hình minh họa

Cách sử dụng lệnh who cơ bản

Cú pháp đơn giản của lệnh who

Sử dụng lệnh who ở dạng cơ bản nhất không thể đơn giản hơn. Bạn chỉ cần mở terminal và gõ lệnh who rồi nhấn Enter. Ngay lập tức, hệ thống sẽ trả về một danh sách các phiên đăng nhập đang hoạt động.

Cấu trúc lệnh:
who

Kết quả trả về thường bao gồm ba cột thông tin chính, mỗi cột mang một ý nghĩa riêng:

  1. Tên người dùng (Username): Đây là tên tài khoản của người dùng đã đăng nhập vào hệ thống.
  2. Thiết bị đầu cuối (Terminal): Cột này cho biết người dùng đang kết nối qua kênh nào. Ví dụ, tty1 thường chỉ một phiên đăng nhập trực tiếp trên máy, trong khi pts/0, pts/1… thường là các phiên đăng nhập giả lập (pseudo-terminal) được tạo ra khi kết nối từ xa qua SSH hoặc mở một cửa sổ terminal mới trong giao diện đồ họa.
  3. Thời gian đăng nhập (Login Time): Cung cấp thông tin chính xác về ngày và giờ mà phiên đăng nhập bắt đầu.

Ví dụ, một kết quả có thể trông như thế này:
azweb tty1 2023-10-27 09:15
dev pts/0 2023-10-27 10:30 (192.168.1.10)

Dòng đầu tiên cho biết người dùng azweb đã đăng nhập trực tiếp vào máy tại terminal tty1 vào lúc 09:15 ngày 27/10/2023. Dòng thứ hai cho thấy người dùng dev đang đăng nhập từ xa qua SSH từ địa chỉ IP 192.168.1.10 vào lúc 10:30.

Hình minh họa

Các tùy chọn phổ biến và công dụng

Lệnh who trở nên mạnh mẽ và linh hoạt hơn rất nhiều khi kết hợp với các tùy chọn (options). Những tùy chọn này cho phép bạn tùy chỉnh định dạng đầu ra để lấy được chính xác thông tin bạn cần. Dưới đây là một số tùy chọn phổ biến và hữu ích nhất.

  • -H (hoặc –heading): Hiển thị tiêu đề cột
    Tùy chọn này thêm một dòng tiêu đề vào đầu ra, giúp kết quả trở nên dễ đọc và dễ hiểu hơn rất nhiều, đặc biệt là với người mới.
    Ví dụ: who -H
    Kết quả:
    NAME LINE TIME COMMENT
    azweb tty1 2023-10-27 09:15
  • -q (hoặc –count): Chỉ liệt kê tên người dùng và tổng số
    Nếu bạn chỉ cần một danh sách nhanh các tên người dùng và tổng số phiên đăng nhập, tùy chọn -q là hoàn hảo. Nó cung cấp một đầu ra cực kỳ gọn gàng.
    Ví dụ: who -q
    Kết quả:
    azweb dev
    # users=2
  • -b (hoặc –boot): Hiển thị thời gian hệ thống khởi động
    Tùy chọn này không hiển thị thông tin người dùng, thay vào đó nó cho bạn biết chính xác thời điểm cuối cùng hệ thống được khởi động (boot). Đây là một cách nhanh chóng để kiểm tra uptime của máy chủ.
    Ví dụ: who -b
    Kết quả:
    system boot 2023-10-25 08:00
  • -T (hoặc -w, –mesg): Hiển thị trạng thái terminal của người dùng
    Tùy chọn này thêm một ký tự ngay sau tên terminal, cho biết liệu người dùng khác có thể gửi tin nhắn đến terminal đó hay không (sử dụng lệnh write).
    + +: Terminal đang cho phép nhận tin nhắn.
    + -: Terminal đã bị khóa, không nhận tin nhắn.
    + ?: Không thể xác định trạng thái.
    Ví dụ: who -T
    Kết quả:
    azweb + tty1 2023-10-27 09:15
    Dấu + cho biết terminal tty1 của người dùng azweb đang mở để nhận tin nhắn.

Hình minh họa

Ví dụ thực tế áp dụng lệnh who trong quản lý hệ thống

Kiểm tra người dùng đăng nhập để phát hiện truy cập trái phép

Một trong những ứng dụng quan trọng nhất của lệnh who trong môi trường doanh nghiệp là giám sát bảo mật. Hãy tưởng tượng bạn là quản trị viên hệ thống cho một máy chủ quan trọng của AZWEB. Việc kiểm tra định kỳ ai đang đăng nhập là một phần không thể thiếu trong quy trình bảo mật hàng ngày.

Bạn có thể thiết lập thói quen chạy lệnh who -H mỗi sáng khi bắt đầu làm việc. Lệnh này sẽ cung cấp một danh sách rõ ràng các phiên làm việc đang hoạt động. Khi xem xét kết quả, bạn cần chú ý đến những điểm bất thường sau:

  • Tài khoản lạ: Có tài khoản nào mà bạn không nhận ra hoặc không nên có mặt trên hệ thống không?
  • Thời gian đăng nhập bất thường: Một phiên đăng nhập được bắt đầu vào lúc 3 giờ sáng có thể là một dấu hiệu đáng ngờ, trừ khi đó là thời gian làm việc của một nhân viên cụ thể.
  • Nguồn kết nối lạ: Cột cuối cùng thường hiển thị địa chỉ IP nguồn. Nếu bạn thấy một kết nối từ một quốc gia hoặc một dải IP không quen thuộc, đó là một cảnh báo đỏ cần phải điều tra ngay lập tức.

Ví dụ, nếu bạn thấy một dòng như:
hacker pts/2 2023-10-27 03:15 (203.0.113.55)
Bạn sẽ ngay lập tức nhận ra tài khoản “hacker” không hợp lệ và địa chỉ IP lạ. Nhờ lệnh who, bạn đã có thông tin ban đầu để bắt đầu quá trình điều tra, chẳng hạn như kiểm tra logs hệ thống, xác định quy trình của người dùng đó bằng lệnh ps, và cuối cùng là chấm dứt phiên làm việc của họ và vá lỗ hổng bảo mật.

Hình minh họa

Kết hợp who với các lệnh khác để phân tích sâu hơn

Sức mạnh thực sự của các công cụ dòng lệnh Linux nằm ở khả năng kết hợp chúng lại với nhau thông qua “ống dẫn” (pipe |). Lệnh who cũng không ngoại lệ. Bằng cách chuyển đầu ra của who sang các lệnh khác như grep, awk, hoặc wc, bạn có thể thực hiện các phân tích phức tạp và tự động hóa các tác vụ giám sát.

  • Lọc thông tin một người dùng cụ thể với grep:
    Nếu bạn chỉ muốn kiểm tra các phiên đăng nhập của một người dùng tên là dev, bạn có thể sử dụng lệnh:
    who | grep '^dev '
    Lệnh này sẽ lọc và chỉ hiển thị những dòng bắt đầu bằng “dev “, giúp bạn nhanh chóng xem người dùng đó đang có bao nhiêu phiên làm việc và từ đâu.
  • Đếm tổng số phiên đăng nhập với wc:
    Mặc dù who -q có thể làm điều này, việc sử dụng wc -l (word count – lines) là một ví dụ kinh điển về sức mạnh của pipe.
    who | wc -l
    Lệnh này sẽ đếm số dòng trong đầu ra của who, tương đương với tổng số phiên đăng nhập đang hoạt động.
  • Trích xuất và sắp xếp tên người dùng duy nhất với awksort:
    Giả sử bạn muốn có một danh sách các tài khoản đang đăng nhập, nhưng mỗi tài khoản chỉ xuất hiện một lần dù họ có nhiều phiên. Bạn có thể kết hợp các lệnh sau:
    who | awk '{print $1}' | sort -u
    • awk '{print $1}' sẽ chỉ lấy cột đầu tiên (tên người dùng).
    • sort -u sẽ sắp xếp danh sách và loại bỏ các tên trùng lặp (-u là unique).

    Kết quả là một danh sách sạch sẽ các tài khoản duy nhất đang online, rất hữu ích cho việc báo cáo và thống kê.

Hình minh họa

Các vấn đề phổ biến khi sử dụng lệnh who và cách khắc phục

Lệnh who không hiển thị đầy đủ thông tin

Đôi khi, bạn có thể chạy lệnh who và nhận được một danh sách trống hoặc thiếu một số người dùng mà bạn biết chắc chắn đang đăng nhập. Tình trạng này có thể gây hoang mang, nhưng thường có những nguyên nhân cụ thể và cách khắc phục.

Nguyên nhân:

  1. Quyền truy cập: Lệnh who hoạt động bằng cách đọc thông tin từ một tệp hệ thống đặc biệt, thường là /var/run/utmp. Nếu người dùng thực thi lệnh không có quyền đọc tệp này, kết quả trả về sẽ không chính xác hoặc trống rỗng. Đây là vấn đề phổ biến trong các hệ thống được cấu hình bảo mật cao.
  2. Cấu hình hệ thống tối giản: Một số hệ thống Linux được tùy chỉnh tối giản, chẳng hạn như trong các container Docker hoặc môi trường nhúng, có thể không duy trì tệp utmp. Trong trường hợp này, lệnh who sẽ không có nguồn dữ liệu để hoạt động.
  3. Tệp utmp bị hỏng: Mặc dù hiếm gặp, tệp utmp có thể bị hỏng do tắt hệ thống không đúng cách hoặc lỗi hệ thống tệp, dẫn đến việc who không thể đọc được nó.

Cách xử lý:

  1. Kiểm tra quyền: Hãy thử chạy lệnh với quyền quản trị viên bằng cách sử dụng sudo who. Nếu lệnh này trả về kết quả đầy đủ, vấn đề nằm ở quyền truy cập của tài khoản người dùng hiện tại. Bạn cần xem xét lại chính sách phân quyền trên hệ thống.
  2. Kiểm tra sự tồn tại của tệp: Sử dụng lệnh ls -l /var/run/utmp để xác nhận tệp có tồn tại và kiểm tra quyền của nó.
  3. Sử dụng các lệnh thay thế: Nếu who không hoạt động do cấu hình hệ thống, bạn có thể thử các phương pháp khác để kiểm tra người dùng, ví dụ như lệnh ps aux | grep sshd để xem các tiến trình liên quan đến kết nối SSH.

Hình minh họa

Thông tin đăng nhập không cập nhật chính xác

Một vấn đề khác đôi khi xảy ra là lệnh who hiển thị một phiên đăng nhập của người dùng dù họ đã đăng xuất. Những phiên “ma” này có thể gây nhầm lẫn và lo ngại về bảo mật.

Nguyên nhân:

  1. Phiên đăng nhập kết thúc không đúng cách: Nguyên nhân phổ biến nhất là do phiên làm việc bị chấm dứt đột ngột. Ví dụ, người dùng bị mất kết nối mạng, máy tính cá nhân của họ bị treo, hoặc một tiến trình bị “kill” thay vì đăng xuất một cách bình thường. Khi đó, hệ thống có thể không kịp cập nhật (xóa) bản ghi tương ứng trong tệp utmp.
  2. Độ trễ của hệ thống (Cache): Trong một số trường hợp, có thể có một độ trễ nhỏ giữa thời điểm người dùng đăng xuất và thời điểm tệp utmp được cập nhật.

Mẹo kiểm tra và đồng bộ lại:

  1. Xác minh bằng lệnh ps: Đây là cách đáng tin cậy nhất. Nếu who báo người dùng dev đang đăng nhập, hãy chạy lệnh ps -u dev. Nếu lệnh này không trả về tiến trình nào đang hoạt động thuộc về người dùng dev, rất có thể đó là một phiên “ma”.
  2. Kiểm tra với lệnh w: Lệnh w đôi khi có thể cung cấp thông tin chính xác hơn về trạng thái của terminal. Nếu w cũng hiển thị phiên đó nhưng ở trạng thái “idle” (không hoạt động) trong một thời gian rất dài, khả năng cao là phiên đó không còn hoạt động.
  3. Dọn dẹp thủ công (Thận trọng): Trong những trường hợp cực đoan và chỉ dành cho quản trị viên có kinh nghiệm, việc khởi động lại một số dịch vụ hệ thống hoặc thậm chí khởi động lại toàn bộ máy chủ sẽ dọn dẹp các tệp utmpwtmp, loại bỏ các phiên “ma”. Tuy nhiên, đây là giải pháp cuối cùng và cần cân nhắc kỹ lưỡng.

Mẹo và best practices khi sử dụng lệnh who

Sử dụng kết hợp với script tự động giám sát người dùng

Để nâng cao khả năng giám sát, bạn không nên chỉ dựa vào việc chạy lệnh who thủ công. Hãy tự động hóa nó! Bạn có thể viết một script Bash đơn giản để kiểm tra số lượng người dùng đang đăng nhập và gửi cảnh báo nếu con số này vượt quá một ngưỡng nhất định hoặc nếu một tài khoản cụ thể xuất hiện.
Ví dụ một script đơn giản:

#!/bin/bash
USER_COUNT=$(who | wc -l)
THRESHOLD=5
if [ "$USER_COUNT" -gt "$THRESHOLD" ]; then
  echo "Canh bao: Co $USER_COUNT nguoi dung dang dang nhap vao he thong." | mail -s "Canh bao an ninh" admin@azweb.vn
fi

Sau đó, bạn có thể dùng cron job để chạy script này định kỳ, ví dụ 15 phút một lần, giúp bạn giám sát hệ thống 24/7.

Hình minh họa

Không chạy lệnh với quyền thấp nếu cần xem thông tin chi tiết

Như đã đề cập, who cần quyền đọc các tệp hệ thống quan trọng. Nếu bạn đang thực hiện một tác vụ kiểm tra bảo mật nghiêm túc, hãy luôn đảm bảo bạn đang chạy lệnh với đủ quyền hạn (ví dụ: qua sudo). Điều này đảm bảo bạn nhận được một bức tranh đầy đủ và chính xác nhất, không bỏ sót bất kỳ phiên đăng nhập nào.

Hạn chế lạm dụng để tránh ảnh hưởng hiệu năng hệ thống

Mặc dù who là một lệnh rất nhẹ và nhanh, việc lạm dụng nó trong các vòng lặp cực nhanh (ví dụ, chạy mỗi giây) trong các script tự động có thể tạo ra một lượng nhỏ tải không cần thiết cho hệ thống. Thay vì kiểm tra liên tục, hãy xác định một khoảng thời gian hợp lý cho việc giám sát, chẳng hạn như mỗi 5 phút hoặc 15 phút. Điều này vừa đảm bảo bạn cập nhật kịp thời, vừa không gây ảnh hưởng đến hiệu năng của các ứng dụng chính đang chạy trên máy chủ.

Thường xuyên kiểm tra lịch sử đăng nhập, không chỉ dựa vào who

Lệnh who chỉ cho bạn thấy “ai đang ở đây ngay bây giờ”. Nó không cho bạn biết ai đã ở đây trước đó. Để có một cái nhìn toàn diện về bảo mật, bạn phải kết hợp who với việc kiểm tra lịch sử đăng nhập. Hãy làm quen với lệnh last, lệnh này đọc tệp /var/log/wtmp để hiển thị lịch sử các lần đăng nhập thành công. Thường xuyên rà soát kết quả của cả wholast sẽ giúp bạn phát hiện các mẫu hành vi bất thường và tăng cường khả năng phòng thủ cho hệ thống của mình.

Hình minh họa

Kết luận

Qua bài viết này, chúng ta đã cùng nhau khám phá lệnh who trong Linux, từ những chức năng cơ bản nhất đến các ứng dụng thực tế trong công việc quản trị hệ thống. Rõ ràng, dù chỉ là một lệnh đơn giản, who lại đóng vai trò vô cùng quan trọng như một công cụ giám sát và bảo mật tuyến đầu. Nó cung cấp một cách nhanh chóng, hiệu quả để trả lời câu hỏi “Ai đang trên hệ thống của tôi?”, giúp các quản trị viên có cái nhìn tức thời về hoạt động của người dùng, từ đó phát hiện sớm các dấu hiệu bất thường.

Lợi ích của việc thành thạo lệnh who và biết cách kết hợp nó với các công cụ dòng lệnh khác là không thể phủ nhận. Nó không chỉ giúp bạn quản lý tài nguyên tốt hơn mà còn là một mắt xích thiết yếu trong chuỗi các biện pháp bảo mật hệ thống. AZWEB khuyến khích bạn hãy bắt đầu áp dụng lệnh who ngay hôm nay trên các hệ thống Linux của mình. Hãy biến nó thành một thói quen, một phản xạ tự nhiên khi bạn muốn kiểm tra “sức khỏe” của máy chủ. Bằng cách đó, bạn đang từng bước nâng cao kỹ năng và xây dựng một nền tảng quản trị vững chắc hơn. Để tìm hiểu sâu hơn, bạn có thể khám phá thêm các lệnh quản lý người dùng nâng cao như last, whoami, và các kỹ thuật viết script giám sát tự động.

Đánh giá