SFTP, viết tắt của Secure File Transfer Protocol, là một giao thức riêng biệt được tích hợp sẵn trong SSH, có khả năng thực hiện các lệnh FTP qua kết nối an toàn. Thông thường, SFTP có thể thay thế trực tiếp cho FTP trong bất kỳ ngữ cảnh nào vẫn cần máy chủ FTP.
FTP, hay Giao Thức Truyền File, là một phương pháp phổ biến nhưng không mã hóa để chuyển file giữa hai hệ thống từ xa. Tính đến năm 2024, do thiếu tính bảo mật, hầu hết các phần mềm hiện đại đã không còn ưa chuộng FTP nữa và chỉ sử dụng trong một số ứng dụng cũ.
Trong hầu hết các trường hợp, SFTP được ưu tiên hơn FTP nhờ vào các tính năng bảo mật bên trong và khả năng “mượn” kết nối SSH. FTP là một giao thức không an toàn và chỉ nên được sử dụng trong những trường hợp hạn chế hoặc trong các mạng mà bạn tin tưởng.
Mặc dù SFTP được tích hợp vào nhiều công cụ đồ họa, hướng dẫn này sẽ trình bày cách sử dụng nó qua giao diện dòng lệnh tương tác.
Cách Kết Nối với SFTP
Mặc định, SFTP sử dụng giao thức SSH để xác thực và thiết lập kết nối an toàn. Vì vậy, các phương pháp xác thực có sẵn với SSH cũng có thể áp dụng cho SFTP.
Mặc dù bạn có thể sử dụng mật khẩu để xác thực theo mặc định, chúng tôi khuyến nghị tạo SSH keys và chuyển Public Key của bạn tới bất kỳ hệ thống nào cần truy cập. Điều này an toàn hơn rất nhiều và có thể tiết kiệm thời gian về lâu dài.
Vui lòng tham khảo hướng dẫn cài đặt SSH keys để truy cập máy chủ nếu bạn chưa thực hiện điều đó.
Nếu bạn có thể kết nối với máy chủ bằng SSH, nghĩa là bạn đã đáp ứng đầy đủ các yêu cầu cần thiết để sử dụng SFTP quản lý file. Hãy kiểm tra kết nối SSH với lệnh sau:
ssh sammy@your_server_ip_or_remote_hostname
Nếu lệnh trên hoạt động, thoát khỏi phiên bằng cách gõ:
exit
Bây giờ, chúng ta có thể thiết lập phiên SFTP bằng cách nhập lệnh sau:
sftp sammy@your_server_ip_or_remote_hostname
Bạn sẽ được kết nối tới hệ thống từ xa và dấu nhắc lệnh sẽ chuyển thành dấu nhắc của SFTP.
Nếu bạn đang sử dụng một cổng SSH tùy chỉnh (không phải cổng mặc định 22), bạn có thể mở phiên SFTP như sau:
sftp -oPort=custom_port sammy@your_server_ip_or_remote_hostname
Lệnh này sẽ kết nối bạn tới hệ thống từ xa qua cổng đã chỉ định.
Nhận Trợ Giúp Trong SFTP
Lệnh trợ giúp (help) là lệnh hữu ích nhất để bạn học đầu tiên. Nó cung cấp cho bạn bản tóm tắt các lệnh SFTP khác. Bạn có thể gọi lệnh trợ giúp bằng cách gõ một trong các lệnh sau tại dấu nhắc:
help
hoặc
?
Lệnh này sẽ hiển thị danh sách các lệnh có sẵn:
Output
Available commands: bye Quit sftp cd path Change remote directory to 'path' chgrp grp path Change group of file 'path' to 'grp' chmod mode path Change permissions of file 'path' to 'mode' chown own path Change owner of file 'path' to 'own' df [-hi] [path] Display statistics for current directory or filesystem containing 'path' exit Quit sftp get [-Ppr] remote [local] Download file help Display this help text lcd path Change local directory to 'path'
Chúng ta sẽ khám phá một số lệnh trong các phần sau.
Điều Hướng với SFTP
Chúng ta có thể điều hướng qua hệ thống tập tin của máy chủ từ xa bằng một số lệnh hoạt động tương tự như trong shell.
Đầu tiên, hãy xác định xem hiện tại bạn đang ở thư mục nào trên hệ thống từ xa. Giống như trong phiên shell thông thường, bạn có thể gõ lệnh sau để lấy thư mục hiện tại:
pwd
Output
Remote working directory: /home/demouser
Chúng ta có thể xem nội dung của thư mục hiện tại trên hệ thống từ xa bằng một lệnh quen thuộc khác:
ls
Output
Summary.txt info.html temp.txt testDirectory
Lưu ý rằng các lệnh có trong giao diện SFTP không hoàn toàn giống với cú pháp shell và không đầy đủ tính năng như trong shell. Tuy nhiên, chúng vẫn hỗ trợ một số tham số quan trọng, ví dụ như thêm -la
vào lệnh ls để xem thêm thông tin metadata và quyền truy cập file:
ls -la
Output
drwxr-xr-x 5 demouser demouser 4096 Aug 13 15:11 . drwxr-xr-x 3 root root 4096 Aug 13 15:02 .. -rw------- 1 demouser demouser 5 Aug 13 15:04 .bash_history -rw-r--r-- 1 demouser demouser 220 Aug 13 15:02 .bash_logout -rw-r--r-- 1 demouser demouser 3486 Aug 13 15:02 .bashrc drwx------ 2 demouser demouser 4096 Aug 13 15:04 .cache -rw-r--r-- 1 demouser demouser 675 Aug 13 15:02 .profile . . .
Để chuyển sang thư mục khác, chúng ta có thể dùng lệnh:
cd testDirectory
Bây giờ, chúng ta có thể duyệt qua hệ thống tập tin của máy chủ từ xa, nhưng nếu bạn cần truy cập hệ thống tập tin cục bộ thì sao? Bạn có thể chuyển hướng các lệnh sang hệ thống cục bộ bằng cách thêm chữ l
ở đầu lệnh.
Tất cả các lệnh được thảo luận cho đến nay đều có phiên bản tương ứng cho hệ thống cục bộ. Chúng ta có thể in ra thư mục làm việc cục bộ bằng lệnh:
lpwd
Output
Local working directory: /Users/demouser
Chúng ta cũng có thể liệt kê nội dung của thư mục hiện tại trên máy cục bộ:
lls
Output
Desktop local.txt test.html Documents analysis.rtf zebra.html
Và bạn cũng có thể thay đổi thư mục làm việc cục bộ bằng lệnh:
lcd Desktop
Chuyển File với SFTP
Tải File từ Máy Chủ Từ Xa
Nếu bạn muốn tải file từ máy chủ từ xa, hãy sử dụng lệnh get
:
get remoteFile
Output
Fetching /home/demouser/remoteFile to remoteFile /home/demouser/remoteFile 100% 37KB 36.8KB/s 00:01
Như bạn thấy, theo mặc định lệnh get sẽ tải file từ xa về với cùng tên file trên hệ thống cục bộ.
Bạn có thể sao chép file từ xa về với tên file khác bằng cách chỉ định tên file sau lệnh:
get remoteFile localFile
Lệnh get cũng chấp nhận một số tham số. Ví dụ, để sao chép một thư mục và toàn bộ nội dung bên trong, bạn có thể sử dụng tham số đệ quy:
get -r someDirectory
Để yêu cầu SFTP bảo toàn các quyền và thời gian truy cập của file, sử dụng tham số -P
hoặc -p
:
get -Pr someDirectory
Tải File từ Máy Cục Bộ Lên Máy Chủ Từ Xa
Chuyển file lên máy chủ từ xa hoạt động tương tự nhưng sử dụng lệnh put
:
put localFile
Output
Uploading localFile to /home/demouser/localFile localFile 100% 7607 7.4KB/s 00:00
Các tham số tương tự như với lệnh get cũng áp dụng cho lệnh put. Vậy nên, để sao chép toàn bộ thư mục cục bộ, bạn có thể dùng lệnh:
put -r localDirectory
Một công cụ hữu ích khi tải xuống và tải lên file là lệnh df
, hoạt động tương tự như phiên bản dòng lệnh. Bằng lệnh này, bạn có thể kiểm tra xem có đủ dung lượng để hoàn thành việc chuyển file hay không:
df -h
Output
Size Used Avail (root) %Capacity 19.9GB 1016MB 17.9GB 18.9GB 4%
Lưu ý, lệnh này không có phiên bản cục bộ, nhưng chúng ta có thể khắc phục điều đó bằng cách sử dụng lệnh !
.
Lệnh !
cho phép bạn thoát ra một shell cục bộ, nơi bạn có thể chạy bất kỳ lệnh nào có sẵn trên máy cục bộ của mình. Ví dụ, để kiểm tra dung lượng ổ đĩa, gõ:
!
sau đó:
df -h
Output
Filesystem Size Used Avail Capacity Mounted on /dev/disk0s2 595Gi 52Gi 544Gi 9% / devfs 181Ki 181Ki 0Bi 100% /dev map -hosts 0Bi 0Bi 0Bi 100% /net map auto_home 0Bi 0Bi 0Bi 100% /home
Bất kỳ lệnh cục bộ nào khác cũng hoạt động như mong đợi. Để quay trở lại phiên SFTP, gõ:
exit
Bạn sẽ thấy dấu nhắc SFTP trở lại.
Các Tác Vụ Quản Lý File Đơn Giản với SFTP
SFTP cho phép bạn thực hiện một số thao tác quản lý hệ thống tập tin. Ví dụ, bạn có thể thay đổi chủ sở hữu của một file trên hệ thống từ xa bằng lệnh:
chown userID file
Lưu ý rằng, khác với lệnh chmod
của hệ thống, lệnh SFTP này không chấp nhận tên người dùng mà thay vào đó dùng UID. Rất tiếc, không có cách tích hợp sẵn để biết UID phù hợp ngay trong giao diện SFTP.
Như một cách khắc phục, bạn có thể đọc file /etc/passwd
– file này liên kết tên người dùng với UID trong hầu hết các hệ thống Linux:
Sau đó, chạy lệnh sau trong shell cục bộ:
get /etc/passwd !less passwd
Output
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh
Lưu ý rằng, thay vì chỉ gõ lệnh !
một mình, chúng ta đã dùng nó làm tiền tố cho lệnh shell cục bộ. Lệnh này cho phép chạy bất kỳ lệnh nào có trên máy cục bộ và cũng có thể được sử dụng với lệnh df
cục bộ như đã nêu ở trên.
UID sẽ nằm ở cột thứ ba của file, được phân tách bởi dấu hai chấm.
Tương tự, chúng ta có thể thay đổi nhóm sở hữu của file với lệnh:
chgrp groupID file
Lại một lần nữa, không có cách tích hợp sẵn để liệt kê các nhóm của hệ thống từ xa, chúng ta có thể khắc phục điều đó bằng lệnh sau:
get /etc/group !less group
Sau đó, dùng lệnh:
Output
root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: lp:x:7: . . .
Cột thứ ba chứa ID của nhóm tương ứng với tên ở cột đầu tiên, đó chính là thông tin chúng ta cần.
Lệnh chmod
trong SFTP hoạt động như bình thường trên hệ thống tập tin từ xa:
chmod 777 publicFile
Output
Changing mode on /home/demouser/publicFile
Không có lệnh tương đương để thao tác quyền của file cục bộ, nhưng bạn có thể đặt umask cục bộ để các file được sao chép về có quyền phù hợp.
Điều này có thể được thực hiện bằng lệnh lumask
:
lumask 022
Output
Local umask: 022
Giờ đây, tất cả các file thông thường được tải về (miễn là không sử dụng tham số -p
) sẽ có quyền 644.
SFTP cũng cho phép bạn tạo thư mục trên cả hệ thống cục bộ và từ xa bằng lệnh lmkdir
và mkdir
tương ứng.
Các lệnh file còn lại chỉ nhắm vào hệ thống tập tin từ xa:
ln rm rmdir
Những lệnh này tái hiện hành vi cơ bản của các lệnh shell tương đương. Nếu bạn cần thực hiện những thao tác này trên hệ thống cục bộ, hãy nhớ rằng bạn có thể thoát ra shell bằng cách gõ:
!
Hoặc chạy một lệnh cục bộ đơn lẻ bằng cách thêm dấu !
trước lệnh, ví dụ:
!chmod 644 somefile
Khi bạn hoàn tất phiên SFTP, hãy sử dụng lệnh exit
hoặc bye
để đóng kết nối.
bye
Kết Luận
Mặc dù cú pháp của SFTP không phong phú như các công cụ shell hiện đại, nhưng nó hữu ích trong việc duy trì sự tương thích với cú pháp FTP cũ hoặc trong việc hạn chế chặt chẽ các chức năng dành cho người dùng từ xa trong một số môi trường nhất định.
Ví dụ, bạn có thể sử dụng SFTP để cho phép những người dùng nhất định chuyển file mà không cần truy cập SSH. Để biết thêm thông tin về quy trình này, hãy xem hướng dẫn “Cách bật sftp không cần truy cập shell trên ubuntu 20.04.”
Nếu bạn đã quen sử dụng FTP hoặc SCP để chuyển file, SFTP là một cách tốt để kết hợp ưu điểm của cả hai giao thức. Dù không phù hợp cho mọi tình huống, SFTP là một công cụ linh hoạt mà bạn nên có trong kho công cụ của mình.