Lệnh SSH: cách dùng tùy chọn -l, -p, -i và kiểm tra lỗi kết nối

Môi trường thử nghiệmHọ RHELAlmaLinux 9.8OpenSSH 9.9p1Phía nhận Debian 12 · OpenSSH 9.2p1 tài khoản thườngTài khoản root
Lệnh mạngsshVị trí/usr/bin/ssh

Lệnh SSH là lệnh của trình khách OpenSSH dùng để kết nối tới máy chủ Linux từ xa qua kết nối được mã hóa theo dạng ssh tài-khoản@địa-chỉ-máy-chủ và chạy lệnh trên máy chủ đã kết nối. Chúng tôi chạy ssh từ một máy chủ AlmaLinux 9 sang một máy chủ Debian 12 và kiểm tra lần lượt từ bước xác minh khóa máy chủ ở lần kết nối đầu tiên đến các tùy chọn -l, -p, -i, việc chạy lệnh từ xa và đầu ra gỡ lỗi của -v. Kết quả cho thấy có thể kiểm tra trước bằng ssh -G, không cần kết nối, xem các tùy chọn thực sự được áp dụng thế nào.

Đầu ra bên dưới là kết quả chạy trên hai máy chủ, giữ nguyên. Địa chỉ máy chủ và tài khoản, tên máy, đường dẫn khóa và dấu vân tay khóa, cùng số phiên bản OpenSSL và kernel của máy chủ kết nối đã được thay bằng giá trị ví dụ. Máy chủ AlmaLinux kết nối đi dùng tài khoản root, còn máy chủ Debian nhận kết nối dùng tài khoản thường.

1️⃣ Cách dùng cơ bản của lệnh SSH

Khi đăng nhập vào máy chủ từ xa, hãy viết tên tài khoản và địa chỉ máy chủ sau ssh, nối với nhau bằng @. Sau khi đăng nhập, dấu nhắc đổi thành của máy chủ đã kết nối, và nhập exit sẽ ngắt kết nối rồi quay về máy chủ ban đầu.

ssh user@192.0.2.10
Linux server2 6.1.0-53-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.187-1 (2026-09-07) x86_64
Last login: Wed Oct 28 20:27:41 2026 from 198.51.100.7
[user]:~$ whoami
user
[user]:~$ exit
exit
Connection to 192.0.2.10 closed.

Máy chủ Debian mà chúng tôi kết nối còn hiện thêm vài dòng thông báo máy chủ (motd) và thông báo thư khi đăng nhập; trong đầu ra ở trên chỉ bỏ những dòng đó.

Khi kết nối tới một máy chủ lần đầu, ssh in dấu vân tay khóa máy chủ trước khi đăng nhập và hỏi có tiếp tục kết nối không. Khi nhập yes, khóa máy chủ được lưu vào ~/.ssh/known_hosts, sau đó kết quả whoami hiện ra.

ssh user@192.0.2.10 whoami
The authenticity of host '192.0.2.10 (192.0.2.10)' can't be established.
ED25519 key fingerprint is SHA256:9fT2kL0qX8vN4cR1yB6sW3mZ7aH5dE0uJ2pG8oK1iVc.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.0.2.10' (ED25519) to the list of known hosts.
user

Sau khi được lưu vào known_hosts, câu hỏi này không hiện lại khi kết nối tới cùng máy chủ. Nếu dấu vân tay khác với giá trị nhận từ quản trị viên máy chủ, hãy nhập no. Khi nhập no, ssh kết thúc mà không kết nối.

ssh user@192.0.2.10
The authenticity of host '192.0.2.10 (192.0.2.10)' can't be established.
ED25519 key fingerprint is SHA256:9fT2kL0qX8vN4cR1yB6sW3mZ7aH5dE0uJ2pG8oK1iVc.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? no
Host key verification failed.

Khi kết thúc bằng no, tệp known_hosts không được tạo. Vì vậy câu hỏi đó sẽ hiện lại ở lần kết nối sau.

2️⃣ Các tùy chọn của lệnh SSH

Tùy chọn của ssh được viết trước đích kết nối. Khi chỉ chạy ssh, danh sách tùy chọn có thể dùng hiện ra dưới dạng hướng dẫn sử dụng.

ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address]
           [-c cipher_spec] [-D [bind_address:]port] [-E log_file]
           [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file]
           [-J destination] [-L address] [-l login_name] [-m mac_spec]
           [-O ctl_cmd] [-o option] [-P tag] [-p port] [-R address]
           [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
           destination [command [argument ...]]
       ssh [-Q query_option]

Nếu đưa vào tùy chọn không có trong hướng dẫn sử dụng, lỗi [unknown option] sẽ hiện ra cùng hướng dẫn sử dụng đó.

-V in phiên bản trình khách OpenSSH đã cài. Bên dưới là kết quả của máy chủ AlmaLinux kết nối đi; trên máy chủ Debian 12 nhận kết nối thì hiện OpenSSH_9.2p1.

ssh -V
OpenSSH_9.9p1, OpenSSL 3.5.1 1 Jul 2025

-G không kết nối tới máy chủ mà gộp các tùy chọn đã ghi với tệp cấu hình rồi in ra giá trị sẽ thực sự được áp dụng. Toàn bộ đầu ra có 87 dòng nên chúng tôi dùng grep để chọn những dòng cần thiết.

ssh -G user@example.com | grep -E "^(user|hostname|port|identityfile|connecttimeout|stricthostkeychecking|serveraliveinterval) "
user user
hostname example.com
port 22
stricthostkeychecking ask
serveraliveinterval 0
identityfile ~/.ssh/id_rsa
identityfile ~/.ssh/id_ecdsa
identityfile ~/.ssh/id_ecdsa_sk
identityfile ~/.ssh/id_ed25519
identityfile ~/.ssh/id_ed25519_sk
identityfile ~/.ssh/id_xmss
identityfile ~/.ssh/id_dsa
connecttimeout none

Bảy dòng identityfile là các tệp khóa mặc định mà ssh lần lượt tìm khi không chỉ định -i. connecttimeout none nghĩa là chưa đặt riêng thời gian chờ kết nối.

Tùy chọnSao chépMô tả
-lTài khoảnChỉ định tên tài khoản để kết nối
-pCổngChỉ định cổng kết nối (mặc định 22)
-iTệp khóaChỉ định tệp khóa riêng tư
-vIn quá trình kết nối thành các dòng debug1
-CNén dữ liệu gửi và nhận
-XChuyển tiếp X11 (chương trình GUI từ xa)
-TKhông cấp phát terminal ảo
-tBuộc cấp phát terminal ảo
-nChuyển đầu vào chuẩn sang /dev/null
-qGiảm cảnh báo và thông báo
-omục=giá trịChỉ định mục trong tệp cấu hình chỉ cho lần kết nối này
-LChuyển tiếp cổng cục bộ
-FChỉ định tệp cấu hình
-GIn cấu hình sẽ áp dụng mà không kết nối
-VIn phiên bản trình khách OpenSSH
Tùy chọnSao chépMô tả
-NChỉ giữ kết nối, không có lệnh từ xa
-JKết nối qua một máy chủ khác

3️⃣ Tùy chọn ssh -l và chuyển tiếp cổng -L

-l là tùy chọn chỉ định tên tài khoản để kết nối. ssh -l user 192.0.2.10 kết nối bằng cùng tài khoản với ssh user@192.0.2.10.

ssh -l user 192.0.2.10 whoami
user

Kiểm tra bằng -G thì tài khoản đưa vào qua -l nằm ở mục user.

ssh -G -l admin example.com | grep -E "^(user|hostname|port) "
user admin
hostname example.com
port 22

Chúng tôi cũng dùng -G để kiểm tra bên nào được áp dụng khi ghi cả -l lẫn tài-khoản@địa-chỉ. Trên OpenSSH 9.9p1, admin đưa vào qua -l được áp dụng.

ssh -G -l admin user@example.com | grep -E "^(user|hostname) "
user admin
hostname example.com

-L viết hoa có tên giống nhưng là tùy chọn chuyển tiếp cổng cục bộ, không liên quan đến tài khoản. Nó chuyển các kết nối đi vào một cổng trên máy chủ của bạn qua bên trong kết nối SSH và nối tới địa chỉ và cổng phía máy chủ từ xa.

8080:localhost:80 nghĩa là nối cổng 8080 trên máy chủ của bạn tới cổng 80 của localhost nhìn từ máy chủ từ xa. Kiểm tra bằng -G thì cùng giá trị đó nằm ở mục localforward.

ssh -G -L 8080:localhost:80 user@example.com | grep -E "^(hostname|localforward) "
hostname example.com
localforward 8080 [localhost]:80

Khi chỉ muốn giữ đường hầm mở, hãy thêm -N, tùy chọn giữ kết nối mà không có lệnh từ xa.

4️⃣ Chỉ định cổng và tệp khóa SSH

Nếu máy chủ SSH nhận kết nối ở cổng khác 22, hãy chỉ định cổng bằng -p. -i chỉ định tệp khóa riêng tư không mang tên mặc định.

ssh -G -p 2222 -i ./mykey user@example.com | grep -E "^(user|hostname|port|identityfile) "
user user
hostname example.com
port 2222
identityfile ./mykey

Khi chỉ định -i, bảy dòng tệp khóa mặc định biến mất và chỉ còn lại một tệp đã chỉ định.

Tệp khóa được tạo bằng ssh-keygen. Nếu đã có khóa đang dùng, hãy chỉ định tên tệp mới bằng -f. Bên dưới là kết quả tạo khóa ed25519 với tên mới mykey.

ssh-keygen -t ed25519 -f ./mykey -N "" -C "user@example.com"
Generating public/private ed25519 key pair.
Your identification has been saved in ./mykey
Your public key has been saved in ./mykey.pub
The key fingerprint is:
SHA256:XLbhLZHSNdMvUqhSIbzRNJi/zKKkNnWmy0mTeBoUfaY user@example.com
The key's randomart image is:
+--[ED25519 256]--+
|       ..=+.+o   |
|     .  =oo+.oo  |
|    . . +=B. . . |
|     . =o=o=. . .|
|    . E S++... . |
|   . .o.+ +.     |
|    o+== .       |
|    +*oo         |
|   ...+.         |
+----[SHA256]-----+

mykey là khóa riêng tư, còn mykey.pub là khóa công khai. Tài liệu OpenSSH hướng dẫn đưa khóa công khai vào ~/.ssh/authorized_keys trên máy chủ sẽ kết nối tới. Việc này có thể làm bằng ssh-copy-id, như [ssh-copy-id -i ./mykey.pub user@192.0.2.10].

Nếu thường xuyên kết nối tới cùng một máy chủ, hãy ghi bí danh vào ~/.ssh/config rồi chỉ cần nhập ssh kèm bí danh. Dòng Host là bí danh, các dòng bên dưới là giá trị được áp dụng khi kết nối bằng bí danh đó.

Host myserver
    HostName 192.0.2.10
    User user
    Port 2222
    IdentityFile ~/.ssh/mykey

Khi ghi cấu hình này vào tệp ./config rồi đọc bằng -F, địa chỉ, tài khoản, cổng và tệp khóa đều được áp dụng chỉ với một bí danh.

ssh -F ./config -G myserver | grep -E "^(user|hostname|port|identityfile) "
user user
hostname 192.0.2.10
port 2222
identityfile ~/.ssh/mykey

Tùy chọn ghi trên dòng lệnh được ưu tiên hơn tệp cấu hình. Khi thêm -p 22 cho cùng bí danh, port đổi thành 22.

ssh -F ./config -G -p 22 myserver | grep -E "^(hostname|port) "
hostname 192.0.2.10
port 22

hostname vẫn là 192.0.2.10 như trong tệp cấu hình, chỉ port đổi thành giá trị ghi trên dòng lệnh.

5️⃣ Chạy lệnh từ xa bằng SSH

Nếu viết lệnh sau đích kết nối, ssh chỉ chạy lệnh đó mà không có màn hình đăng nhập rồi ngắt kết nối. Nếu có nhiều lệnh hoặc có ký hiệu shell như dấu chấm phẩy, hãy đặt trong dấu nháy đơn.

ssh user@192.0.2.10 'whoami; hostname'
user
server2

Mã thoát của lệnh từ xa được trả về nguyên vẹn thành mã thoát của ssh. Trong script, giá trị này cho biết lệnh từ xa có thành công hay không.

ssh user@192.0.2.10 'exit 3'; echo $?
3

Khi chạy kèm lệnh như vậy, terminal ảo không được cấp phát. tty chạy với -T in ra [not a tty].

ssh -T user@192.0.2.10 tty
not a tty

Tài liệu ssh mô tả -t là tùy chọn dùng khi chạy chương trình dạng màn hình trên máy chủ từ xa. Khi thêm -t, /dev/pts/0 hiện ra, và lúc kết thúc có thêm thông báo đã đóng kết nối.

ssh -t user@192.0.2.10 tty
/dev/pts/0
Connection to 192.0.2.10 closed.

Khi thêm -q, thông báo này không hiện ra.

ssh -t -q user@192.0.2.10 tty
/dev/pts/0

-n chuyển đầu vào chuẩn của ssh sang /dev/null. Khi chạy không có -n, lệnh cat từ xa in nguyên chữ hello được truyền qua đường ống.

echo hello | ssh user@192.0.2.10 cat
hello
echo hello | ssh -n user@192.0.2.10 cat

Khi thêm -n vào cùng lệnh, hello không tới được cat từ xa nên không có gì được in ra.

6️⃣ Lỗi kết nối SSH và gỡ lỗi bằng ssh -v

Khi không kết nối được, trước hết hãy xem thông báo lỗi để biết dừng ở bước nào. Khi không tìm thấy địa chỉ máy chủ, [Could not resolve hostname] hiện ra.

ssh user@nosuchhost.invalid
ssh: Could not resolve hostname nosuchhost.invalid: Name or service not known

Nếu địa chỉ đúng nhưng cổng đó không phản hồi, [Connection timed out] sẽ hiện ra. Khi thêm -o ConnectTimeout=5, kết nối kết thúc với lỗi này sau 5 giây.

ssh -o ConnectTimeout=5 -p 2222 user@192.0.2.10
ssh: connect to host 192.0.2.10 port 2222: Connection timed out

Khi kết nối bằng -o BatchMode=yes tới máy chủ chưa có trong known_hosts, ssh kết thúc với [Host key verification failed.] mà không hỏi về khóa máy chủ. Để lần kết nối đầu trong script không dừng ở câu hỏi, hãy dùng StrictHostKeyChecking=accept-new.

ssh -o BatchMode=yes user@192.0.2.10 true
Host key verification failed.

Theo tài liệu ssh_config, accept-new lưu mà không hỏi chỉ khóa máy chủ của những máy chủ chưa từng thấy. Nếu nhận được khóa khác với khóa đã lưu, kết nối sẽ bị từ chối.

ssh -o StrictHostKeyChecking=accept-new user@192.0.2.10 whoami
Warning: Permanently added '192.0.2.10' (ED25519) to the list of known hosts.
user

Nếu tài khoản chưa đăng ký khóa, [Permission denied (publickey)] sẽ hiện ra. Xác thực thất bại lặp lại có thể khiến máy chủ chặn IP đang kết nối.

-v in quá trình kết nối thành các dòng debug1. Toàn bộ đầu ra hơn 70 dòng nên bên dưới chỉ là các dòng của bước kết nối và xác thực, được chọn bằng grep.

ssh -v -i ~/.ssh/id_ed25519 user@192.0.2.10 true 2>&1 | grep -E 'Connecting to|Connection established|remote software version|Server host key|is known and matches|can continue|Offering public key|Authenticated to|Exit status'
debug1: Connecting to 192.0.2.10 [192.0.2.10] port 22.
debug1: Connection established.
debug1: Remote protocol version 2.0, remote software version OpenSSH_9.2p1 Debian-2+deb12u10
debug1: Server host key: ssh-ed25519 SHA256:9fT2kL0qX8vN4cR1yB6sW3mZ7aH5dE0uJ2pG8oK1iVc
debug1: Host '192.0.2.10' is known and matches the ED25519 host key.
debug1: Authentications that can continue: publickey,password
debug1: Offering public key: /root/.ssh/id_ed25519 ED25519 SHA256:4bN7qT1xW9cK3mR6yH0sD2fL8vZ5aJ1eP7uG3oX4iQs explicit
Authenticated to 192.0.2.10 ([192.0.2.10]:22) using "publickey".
debug1: Exit status 0

Dòng Connecting to là lần thử kết nối, còn các dòng Server host key và is known and matches là bước xác minh khóa máy chủ. Ở dòng Offering public key khóa được đưa ra, và ở dòng Authenticated to việc xác thực bằng khóa đã xong. Nếu dừng ở bước xác thực, trước hết hãy kiểm tra tệp khóa mong muốn có hiện ở dòng Offering public key không.

Khi thêm -C, giá trị compression ở dòng kex đổi từ none sang zlib@openssh.com.

ssh -v -C user@192.0.2.10 true 2>&1 | grep -E 'compression'
debug1: kex: server->client cipher: aes256-gcm@openssh.com MAC: <implicit> compression: zlib@openssh.com
debug1: kex: client->server cipher: aes256-gcm@openssh.com MAC: <implicit> compression: zlib@openssh.com
debug1: Enabling compression at level 6.

-X là tùy chọn đưa màn hình của chương trình GUI trên máy chủ từ xa về máy tính của bạn. Khi chạy trên máy chủ AlmaLinux không có màn hình, một dòng debug1 cho biết không có DISPLAY đã hiện ra.

ssh -v -X user@192.0.2.10 true 2>&1 | grep DISPLAY
debug1: X11 forwarding requested but DISPLAY not set

DISPLAY là biến môi trường xác định nơi hiển thị màn hình GUI. Vì vậy -X được dùng khi kết nối từ máy tính có màn hình desktop.

🔲 Trình mô phỏng lệnh SSH

Trong trình mô phỏng bên dưới, bạn có thể kết nối tới máy chủ ảo bằng ssh và tự nhập để thử các tùy chọn, lệnh từ xa và ssh -G.

Trình mô phỏng lệnh SSHAlmaLinux 9.8 → Debian 12
[root@server work]#
Chỉ chạy trong trình duyệt và không kết nối tới máy chủ thật. Dùng ↑↓ để gọi lại các lệnh đã nhập trước đó.

🔢 FAQ & nội dung đề xuất

Khi thêm -o ServerAliveInterval=60, cứ 60 giây sẽ gửi tín hiệu tới máy chủ để giữ kết nối. Kiểm tra bằng -G thì serveraliveinterval đổi từ giá trị mặc định 0 sang 60. Để khỏi ghi mỗi lần, hãy đặt cùng mục đó dưới Host trong ~/.ssh/config.

Hướng dẫn sử dụng của ssh không có tùy chọn nhận mật khẩu. Với xác thực bằng mật khẩu, hãy nhập khi được hỏi lúc kết nối; với các tác vụ cần kết nối tự động, hãy xác thực bằng khóa tạo bởi ssh-keygen.

Ghi máy chủ trung gian vào -J. Khi kiểm tra [ssh -J admin@bastion.example.com user@192.0.2.10] bằng -G, máy chủ trung gian nằm ở mục proxyjump.

ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Prove your humanity: 5   +   3   =