Bạn có biết 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 giám sát ai đang truy cập vào hệ thống là một trong những nhiệm vụ 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. Thiếu kiểm soát có thể dẫn đến các lỗ hổng bảo mật, tài nguyên bị chiếm dụng ngoài ý muốn, hoặc đơn giản là bạn không nắm được tình hình hoạt động của máy chủ. Đây chính là lúc một công cụ đơn giản nhưng mạnh mẽ như lệnh who phát huy tác dụng. Lệnh who cung cấp một cách nhanh chóng và hiệu quả để xem danh sách tất cả người dùng đang có phiên làm việc trên hệ thống. Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu sâu hơn 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 sử dụng hiệu quả để tăng cường khả năng giám sát và bảo mật cho hệ thống Linux của bạn.
Giới thiệu và chức năng của lệnh who
Lệnh who là một trong những tiện ích cốt lõi của các hệ điều hành dựa trên Unix/Linux. Chức năng và mục đích của nó rất rõ ràng nhưng lại vô cùng thiết yếu trong quản trị hệ thống hàng ngày.
Ý nghĩa và mục đích của lệnh who
Chức năng chính của lệnh who là hiển thị thông tin về tất cả người dùng hiện đang đăng nhập vào hệ thống. Khi bạn thực thi lệnh này, nó sẽ đọc thông tin từ tệp /var/run/utmp, một tệp hệ thống ghi lại trạng thái đăng nhập của người dùng. Kết quả trả về bao gồm tên người dùng, thiết bị đầu cuối (terminal) mà họ đang kết nối, và thời gian họ bắt đầu phiên đăng nhập.
Trong quản lý hệ thống, vai trò của who không chỉ dừng lại ở việc liệt kê. Nó là công cụ giám sát tuyến đầu, giúp quản trị viên nhanh chóng kiểm tra hoạt động hiện tại trên máy chủ. Ví dụ, bạn có thể dùng lệnh này để xác định các phiên đăng nhập lạ hoặc không được phép, kiểm tra xem một người dùng cụ thể có đang hoạt động hay không, hoặc đơn giản là đếm số lượng phiên làm việc đang diễn ra để đánh giá tải hệ thống. Về mặt bảo mật, việc thường xuyên kiểm tra kết quả của who là một thói quen tốt để phát hiện sớm các dấu hiệu xâm nhập trái phép.
So sánh nhanh với các lệnh liên quan (w, users)
Trong môi trường Linux, có nhiều lệnh giúp bạn xem thông tin người dùng đang đăng nhập, và who, w, users là ba lệnh phổ biến nhất. Mặc dù chúng có vẻ tương tự, mỗi lệnh lại có mục đích và mức độ chi tiết khác nhau.
- Lệnh
users: Đây là lệnh đơn giản nhất. Nó chỉ hiển thị một danh sách các tên người dùng đang đăng nhập, được phân tách bằng khoảng trắng. Lệnh này hữu ích khi bạn chỉ cần một danh sách tên nhanh chóng, đặc biệt là để sử dụng trong các script tự động.
- Lệnh
who: Lệnh này cung cấp nhiều thông tin hơn users. Ngoài tên người dùng, who còn cho bạn biết họ đang đăng nhập từ terminal nào (ví dụ: tty1, pts/0) và thời gian bắt đầu phiên đăng nhập. Điều này giúp bạn có cái nhìn chi tiết hơn về từng phiên làm việc.
- Lệnh
w: Đây là lệnh chi tiết nhất trong cả ba. w không chỉ hiển thị tất cả thông tin mà who cung cấp, mà còn cho biết thêm thời gian không hoạt động (idle time) của người dùng và lệnh mà họ đang thực thi. w là lựa chọn tốt nhất khi bạn cần điều tra sâu hơn về hoạt động của một người dùng cụ thể.
Vậy khi nào nên dùng who? Hãy dùng who khi bạn cần một cái nhìn tổng quan nhanh nhưng vẫn đủ chi tiết về các phiên đăng nhập mà không cần biết họ đang làm gì. Nó là sự cân bằng hoàn hảo giữa sự tối giản của users và sự chi tiết của w.

Cách sử dụng lệnh who cơ bản
Lệnh who rất dễ sử dụng ngay cả với người mới bắt đầu làm quen với Linux. Bạn có thể chạy nó mà không cần bất kỳ tùy chọn nào để có được thông tin cơ bản, hoặc kết hợp với các tùy chọn để tinh chỉnh kết quả đầu ra theo nhu cầu.
Cú pháp đơn giản của lệnh who
Để sử dụng lệnh who ở dạng cơ bản nhất, bạn chỉ cần mở terminal và gõ who, sau đó nhấn Enter.
who
Kết quả trả về sẽ có dạng như sau:
buimanhduc pts/0 2023-10-27 09:15 (192.168.1.10)
root tty1 2023-10-27 08:30
Hãy cùng phân tích ý nghĩa của từng cột trong kết quả trên:
- Cột đầu tiên (
buimanhduc, root): Đây là tên của người dùng (username) đã đăng nhập vào hệ thống.
- Cột thứ hai (
pts/0, tty1): Đây là tên của thiết bị đầu cuối (terminal) mà người dùng đang sử dụng. tty thường chỉ các phiên đăng nhập trực tiếp trên máy, trong khi pts (pseudo-terminal slave) thường đại diện cho các phiên đăng nhập từ xa qua SSH hoặc các trình giả lập terminal đồ họa.
- Cột thứ ba và thứ tư (
2023-10-27 09:15): Đây là ngày và giờ người dùng bắt đầu phiên đăng nhập.
- Phần trong ngoặc đơn (
(192.168.1.10)): Nếu người dùng đăng nhập từ xa, phần này sẽ hiển thị địa chỉ IP hoặc hostname của máy khách.
Các tùy chọn phổ biến và công dụng
Lệnh who trở nên mạnh mẽ hơn khi kết hợp với các tùy chọn (flags). Dưới đây là một số tùy chọn phổ biến và hữu ích nhất.
-H (headers): Tùy chọn này giúp hiển thị tiêu đề cho mỗi cột, giúp kết quả dễ đọc và dễ hiểu hơn.
who -H
Kết quả:
NAME LINE TIME COMMENT
buimanhduc pts/0 2023-10-27 09:15 (192.168.1.10)
root tty1 2023-10-27 08:30

-q (count): Nếu bạn chỉ muốn biết có bao nhiêu người dùng đang đăng nhập và tên của họ là gì, tùy chọn -q là lựa chọn hoàn hảo. Nó sẽ liệt kê các tên người dùng và ở dòng cuối cùng là tổng số phiên đăng nhập.
who -q
Kết quả:
buimanhduc root
# users=2
-b (boot): Tùy chọn này không hiển thị người dùng đăng nhập mà thay vào đó cho bạn biết thời điểm hệ thống được khởi động lần cuối cùng.
who -b
Kết quả:
system boot 2023-10-27 08:00

-T (terminal status): Tùy chọn này thêm một ký tự vào sau tên terminal để cho biết trạng thái của nó.
+ : Terminal cho phép người dùng khác ghi (writable).
- : Terminal không cho phép người dùng khác ghi.
? : Không thể xác định trạng thái terminal.
who -T
Kết quả:
buimanhduc + pts/0 2023-10-27 09:15 (192.168.1.10)
root - tty1 2023-10-27 08:30
Thông tin này hữu ích khi bạn muốn gửi tin nhắn đến terminal của người dùng khác bằng các lệnh như write.

Ví dụ thực tế áp dụng lệnh who trong quản lý hệ thống
Lệnh who không chỉ là một công cụ để xem thông tin. Trong thực tế, nó là một phần quan trọng trong bộ công cụ của quản trị viên hệ thống để giám sát và phân tích hoạt động trên máy chủ.
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 who là giám sát bảo mật. Hãy tưởng tượng bạn đang quản lý một máy chủ quan trọng. Việc thường xuyên kiểm tra ai đang đăng nhập là một biện pháp phòng ngừa đơn giản nhưng hiệu quả.
Bạn có thể chạy lệnh who và xem qua danh sách. Nếu bạn thấy một tên người dùng lạ hoặc một phiên đăng nhập từ một địa chỉ IP không quen thuộc, đó có thể là dấu hiệu của một cuộc tấn công. Ví dụ, nếu bạn thấy một tài khoản admin đăng nhập từ một địa chỉ IP ở một quốc gia khác trong khi bạn biết chắc rằng không có ai được phép làm vậy, bạn cần hành động ngay lập tức.
Để giám sát liên tục, bạn có thể sử dụng lệnh watch để tự động chạy who sau mỗi vài giây:
watch who
Lệnh này sẽ làm mới màn hình và hiển thị kết quả của who cứ sau 2 giây, cho phép bạn theo dõi các phiên đăng nhập và đăng xuất trong thời gian thực. Đây là cách tuyệt vời để giám sát hoạt động trên máy chủ một cách trực quan.

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 với nhau thông qua “pipe” (|). Lệnh who cũng không ngoại lệ. Bạn có thể chuyển đầu ra của who sang các lệnh khác như grep, awk, sort, wc để lọc và xử lý dữ liệu.
- Đếm số phiên đăng nhập của một người dùng cụ thể:
Giả sử bạn muốn biết người dùng buimanhduc đang có bao nhiêu phiên đăng nhập. Bạn có thể kết hợp who với grep để lọc và wc -l để đếm số dòng.
who | grep 'buimanhduc' | wc -l
Lệnh này sẽ chỉ hiển thị các dòng chứa buimanhduc từ kết quả của who, sau đó đếm số dòng đó.

- Liệt kê danh sách các địa chỉ IP đang kết nối:
Nếu bạn muốn xem tất cả các địa chỉ IP đang kết nối đến máy chủ, bạn có thể sử dụng awk. Lệnh awk rất mạnh mẽ trong việc xử lý văn bản theo cột.
who | awk '{print $5}'
Lệnh này sẽ lấy kết quả của who và chỉ in ra cột thứ 5, nơi chứa thông tin về địa chỉ IP hoặc hostname. Kết quả có thể chứa các giá trị trống nếu là phiên đăng nhập cục bộ, nhưng nó rất hữu ích để nhanh chóng kiểm tra các kết nối từ xa.

- Xem người dùng đăng nhập gần đây nhất:
Bạn có thể kết hợp với sort để sắp xếp kết quả theo thời gian, mặc dù lệnh last thường phù hợp hơn cho mục đích này. Tuy nhiên, đây là một ví dụ tốt để thấy khả năng kết hợp của các lệnh.
Những ví dụ trên cho thấy who không chỉ là một lệnh độc lập mà còn là một mắt xích quan trọng trong chuỗi các công cụ xử lý dữ liệu trên dòng lệnh, giúp bạn tự động hóa và tùy chỉnh các tác vụ giám sát của mình.
Các vấn đề phổ biến khi sử dụng lệnh who và cách khắc phục
Mặc dù lệnh who khá đơn giản và đáng tin cậy, đôi khi bạn có thể gặp phải một số vấn đề khiến thông tin hiển thị không như mong đợi. Hiểu rõ nguyên nhân và cách khắc phục sẽ giúp bạn sử dụng lệnh này hiệu quả hơn.
Lệnh who không hiển thị đầy đủ thông tin
Một trong những vấn đề phổ biến nhất là lệnh who không hiển thị tất cả người dùng đang đăng nhập, hoặc không hiển thị thông tin chi tiết như địa chỉ IP.
- Nguyên nhân:
- Quyền truy cập: Lệnh
who đọc dữ liệu từ tệp /var/run/utmp (hoặc đôi khi là /var/log/wtmp). Nếu người dùng thực thi lệnh không có quyền đọc tệp này, kết quả có thể bị trống hoặc không đầy đủ. Mặc dù tệp này thường cho phép mọi người dùng đọc, nhưng các cấu hình hệ thống tùy chỉnh hoặc các biện pháp bảo mật tăng cường có thể đã thay đổi quyền mặc định.
- Cấu hình hệ thống: Một số hệ thống hoặc phiên đăng nhập đặc biệt (ví dụ như các phiên được quản lý bởi systemd-logind) có thể không ghi thông tin vào tệp
utmp theo cách truyền thống. Các môi trường container hoặc ảo hóa cũng có thể có cách xử lý riêng.
- Tệp
utmp bị hỏng: Trong những trường hợp hiếm hoi, tệp utmp có thể bị hỏng, dẫn đến việc who không thể đọc và phân tích dữ liệu một cách chính xác.
- Cách xử lý:
- Kiểm tra quyền: Sử dụng lệnh
ls -l /var/run/utmp để kiểm tra quyền của tệp. Đảm bảo rằng người dùng của bạn có quyền đọc nó.
- Chạy với
sudo: Thử chạy lệnh với sudo who. Mặc dù thường không cần thiết, nhưng điều này có thể giúp loại trừ các vấn đề liên quan đến quyền truy cập.
- Kiểm tra các lệnh khác: So sánh kết quả của
who với w hoặc ps aux | grep bash để xem liệu có sự khác biệt nào không. Nếu các lệnh khác hiển thị người dùng mà who không thấy, vấn đề có thể nằm ở cách hệ thống ghi lại các phiên đăng nhập.

Thông tin đăng nhập không cập nhật chính xác
Đôi khi bạn có thể thấy một người dùng vẫn xuất hiện trong danh sách của who mặc dù họ đã đăng xuất. Đây được gọi là các “phiên ma” (ghost sessions).
- Nguyên nhân:
- Đăng xuất không đúng cách: Nếu một phiên đăng nhập kết thúc đột ngột (ví dụ: mất kết nối mạng, tắt máy khách mà không đăng xuất), tiến trình dọn dẹp để xóa bản ghi khỏi tệp
utmp có thể không được thực thi.
- Cache hoặc độ trễ: Một số hệ thống có thể có độ trễ nhỏ trong việc cập nhật tệp
utmp. Mặc dù hiếm, điều này vẫn có thể xảy ra.
- Tiến trình zombie: Người dùng đã đăng xuất, nhưng một số tiến trình của họ vẫn còn treo lại trong hệ thống, khiến hệ thống nghĩ rằng phiên làm việc vẫn còn hoạt động.
- Mẹo kiểm tra và đồng bộ lại:
- Xác minh bằng
ps: Sử dụng lệnh ps -u <username> để kiểm tra xem người dùng đó có còn bất kỳ tiến trình nào đang chạy hay không. Nếu không có tiến trình nào, khả năng cao đó là một phiên ma.
- Tìm và “kill” tiến trình: Nếu bạn xác định được tiến trình gây ra phiên đăng nhập ma, bạn có thể sử dụng lệnh
kill để chấm dứt nó. Điều này thường sẽ dọn dẹp bản ghi trong utmp. Ví dụ, tìm PID của shell đăng nhập và dùng kill -9 <PID>.
- Kiên nhẫn: Trong một số trường hợp, hệ thống sẽ tự động dọn dẹp các phiên không hợp lệ sau một thời gian. Tuy nhiên, việc chủ động kiểm tra vẫn là cần thiết trong môi trường yêu cầu bảo mật cao.
Bằng cách hiểu rõ những vấn đề này, bạn có thể tự tin hơn khi phân tích kết quả của lệnh who và đảm bảo rằng thông tin bạn nhận được là chính xác.
Mẹo và best practices khi sử dụng lệnh who
Để tận dụng tối đa sức mạnh của lệnh who, không chỉ dừng lại ở việc biết các tùy chọn cơ bản. Áp dụng các mẹo và thực hành tốt nhất sau đây sẽ giúp bạn nâng cao kỹ năng quản trị hệ thống và bảo mật của mình.
- Sử dụng kết hợp với script tự động giám sát người dùng:
Thay vì kiểm tra thủ công, hãy tự động hóa việc giám sát. Bạn có thể viết một script Bash đơn giản chạy định kỳ (sử dụng cron job) để kiểm tra số lượng người dùng. Nếu số lượng người dùng vượt quá một ngưỡng nhất định hoặc nếu một người dùng không mong muốn xuất hiện, script có thể gửi email cảnh báo cho bạn.
#!/bin/bash
MAX_USERS=5
CURRENT_USERS=$(who | wc -l)
if [ "$CURRENT_USERS" -gt "$MAX_USERS" ]; then
echo "Canh bao: So luong nguoi dung vuot nguong. Hien tai co $CURRENT_USERS nguoi dung." | mail -s "Canh bao an ninh he thong" admin@yourdomain.com
fi
Đây là một cách chủ động để giám sát hệ thống thay vì phản ứng sau khi sự cố đã xảy ra.

- Không chạy lệnh với quyền thấp nếu cần xem thông tin chi tiết:
Mặc dù who thường hoạt động với người dùng thông thường, một số thông tin chi tiết hoặc trong các môi trường được cấu hình bảo mật cao có thể yêu cầu quyền cao hơn. Nếu bạn nghi ngờ kết quả không đầy đủ, hãy thử chạy với sudo. Luôn hiểu rõ bối cảnh và quyền hạn cần thiết để có được bức tranh toàn cảnh chính xác nhất.
- Hạn chế lạm dụng để tránh ảnh hưởng hiệu năng hệ thống:
Lệnh who rất nhẹ và hầu như không ảnh hưởng đến hiệu năng. Tuy nhiên, nếu bạn đặt nó trong một vòng lặp chạy liên tục với tần suất rất cao (ví dụ, nhiều lần mỗi giây) trên một hệ thống có hàng ngàn người dùng, nó vẫn có thể tạo ra một lượng tải I/O không cần thiết. Hãy sử dụng các công cụ giám sát một cách hợp lý, ví dụ như dùng watch với khoảng thời gian từ 2-5 giây là đủ cho hầu hết các nhu cầu.
- 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 trạng thái hiện tại. Để có một cái nhìn toàn diện về bảo mật, bạn cần xem cả lịch sử. Hãy làm quen với các lệnh như last (hiển thị lịch sử các lần đăng nhập thành công) và lastb (hiển thị lịch sử các lần đăng nhập thất bại). Việc kết hợp thông tin từ who, last, và các tệp log hệ thống (/var/log/auth.log hoặc tương đương) sẽ cung cấp một bức tranh hoàn chỉnh về ai đã, đang và cố gắng truy cập vào hệ thống của bạn.
Bằng cách tuân thủ những thực hành tốt nhất này, bạn sẽ biến lệnh who từ một công cụ thông tin đơn giản thành một phần không thể thiếu trong chiến lược giám sát và bảo mật hệ thống Linux của mình.

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, một công cụ tuy nhỏ bé nhưng lại nắm giữ vai trò quan trọng trong việc quản lý và giám sát hệ thống. Từ việc hiển thị danh sách người dùng đang đăng nhập một cách nhanh chóng, đến khả năng kết hợp với các lệnh khác để phân tích sâu hơn, who đã chứng tỏ mình là một trợ thủ đắc lực cho bất kỳ ai làm việc với Linux, từ người mới bắt đầu cho đến các quản trị viên hệ thống chuyên nghiệp.
Lợi ích chính của who nằm ở sự đơn giản và hiệu quả. Nó cung cấp một cái nhìn tức thì về trạng thái hoạt động của người dùng, giúp bạn dễ dàng phát hiện các phiên đăng nhập bất thường và tăng cường bảo mật cho hệ thống. Bằng cách áp dụng các mẹo và thực hành tốt nhất như tự động hóa giám sát qua script hay kết hợp với việc phân tích lịch sử đăng nhập, bạn có thể nâng cao đáng kể khả năng kiểm soát và bảo vệ máy chủ của mình.
Đừng chỉ đọc và ghi nhớ, hãy mở ngay cửa sổ terminal của bạn và bắt đầu thực hành với lệnh who. Hãy thử các tùy chọn khác nhau, kết hợp nó với grep, awk để xem bạn có thể khám phá được những thông tin hữu ích nào về hệ thống của mình. Nếu bạn muốn tìm hiểu sâu hơn về quản lý người dùng, hãy tiếp tục khám phá các lệnh nâng cao hơn như last và lastb để theo dõi lịch sử đăng nhập.