Lệnh smbclient trong Linux

Giới thiệu

Trong lab này, chúng ta sẽ khám phá lệnh smbclient của Linux và các ứng dụng thực tế của nó. Tiện ích smbclient là một công cụ mạnh mẽ cho phép các hệ thống Linux tương tác với các chia sẻ tệp của Windows (chia sẻ SMB/CIFS). SMB (Server Message Block) là một giao thức mạng mà Windows sử dụng để chia sẻ tệp và smbclient cho phép người dùng Linux truy cập các chia sẻ này.

Chúng ta sẽ bắt đầu bằng cách cài đặt smbclient trên hệ thống Ubuntu 22.04 của mình, tìm hiểu cú pháp cơ bản của lệnh và sau đó trình bày cách kết nối với các chia sẻ Windows, điều hướng thư mục và truyền tệp.

Khi kết thúc lab này, bạn sẽ có thể:

  • Cài đặt và cấu hình tiện ích smbclient
  • Kết nối với các chia sẻ Windows từ Linux
  • Điều hướng và liệt kê các tệp trên các chia sẻ Windows
  • Truyền tệp giữa các hệ thống Linux và Windows

Cài đặt smbclient trên Ubuntu 22.04

Gói smbclient là một công cụ dòng lệnh cho phép các hệ thống Linux tương tác với các chia sẻ tệp SMB/CIFS thường được sử dụng trong môi trường Windows. Trong bước này, chúng ta sẽ cài đặt gói này trên hệ thống Ubuntu của mình.

Trước tiên, hãy cập nhật chỉ mục gói để đảm bảo chúng ta nhận được phiên bản mới nhất:

sudo apt update

Bạn sẽ thấy đầu ra tương tự như sau:

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [114 kB]
Get:4 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [99.8 kB]
Fetched 324 kB in 1s (324 kB/s)
Reading package lists... Done

Bây giờ, hãy cài đặt gói smbclient:

sudo apt install -y smbclient

Đầu ra sẽ trông giống như sau:

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  libsmbclient
Suggested packages:
  samba-common
The following NEW packages will be installed:
  libsmbclient smbclient
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 479 kB of archives.
After this operation, 1,711 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu jammy/main amd64 libsmbclient amd64 2:4.15.5+dfsg-1ubuntu2 [222 kB]
Get:2 http://archive.ubuntu.com/ubuntu jammy/main amd64 smbclient amd64 2:4.15.5+dfsg-1ubuntu2 [257 kB]
Fetched 479 kB in 0s (1,030 kB/s)
Selecting previously unselected package libsmbclient.
(Reading database ... 26536 files and directories currently installed.)
Preparing to unpack .../libsmbclient_2%3a4.15.5+dfsg-1ubuntu2_amd64.deb ...
Unpacking libsmbclient (2:4.15.5+dfsg-1ubuntu2) ...
Selecting previously unselected package smbclient.
Preparing to unpack .../smbclient_2%3a4.15.5+dfsg-1ubuntu2_amd64.deb ...
Unpacking smbclient (2:4.15.5+dfsg-1ubuntu2) ...
Setting up libsmbclient (2:4.15.5+dfsg-1ubuntu2) ...
Setting up smbclient (2:4.15.5+dfsg-1ubuntu2) ...
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for libc-bin (2.35-0ubuntu3) ...

Để xác minh rằng smbclient đã được cài đặt chính xác, hãy chạy:

smbclient --version

Bạn sẽ thấy đầu ra hiển thị phiên bản của smbclient đã được cài đặt:

Version 4.15.5-Ubuntu

Bây giờ chúng ta đã cài đặt smbclient, chúng ta có thể bắt đầu sử dụng nó để tương tác với các chia sẻ SMB/CIFS.

Tìm hiểu các khái niệm cơ bản về smbclient

Bây giờ chúng ta đã cài đặt smbclient, hãy tìm hiểu cách sử dụng và cú pháp cơ bản của nó trước khi kết nối với các chia sẻ SMB thực tế.

Cú pháp lệnh

Cú pháp cơ bản cho lệnh smbclient là:

smbclient //server/share -U username%password [options]

Trong đó:

  • //server/share là đường dẫn UNC (Universal Naming Convention) đến chia sẻ SMB
  • -U username%password chỉ định tên người dùng và mật khẩu để xác thực
  • [options] là các tham số bổ sung mà bạn có thể cung cấp

Tạo thư mục cục bộ để thực hành

Hãy tạo một thư mục nơi chúng ta có thể lưu trữ các tệp mà chúng ta có thể muốn truyền đến hoặc từ các chia sẻ SMB:

mkdir -p ~/project/smb-files

Hãy tạo một tệp mẫu trong thư mục này mà chúng ta có thể sử dụng sau này:

echo "This is a test file for SMB transfer" > ~/project/smb-files/test.txt

Khám phá Trợ giúp về smbclient

Để xem tất cả các tùy chọn có sẵn cho smbclient, hãy sử dụng lệnh help:

smbclient --help

Điều này sẽ hiển thị một văn bản trợ giúp dài với tất cả các tùy chọn có sẵn. Dưới đây là một đoạn mã về những gì bạn có thể thấy:

Usage: smbclient [OPTION...] service <password>
  -M, --message=HOST                           Send message
  -I, --ip-address=IP                          Use this IP to connect to
  -E, --stderr                                 Write messages to stderr instead of stdout
  -L, --list=HOST                              Get a list of shares available on a host
  -T, --tar=<c|x>IXFvgbNan                     Command line tar
  -D, --directory=DIR                          Start from directory
...

Các lệnh smbclient phổ biến

Khi bạn được kết nối với một chia sẻ SMB bằng smbclient, bạn có thể sử dụng nhiều lệnh khác nhau để điều hướng và thao tác trên các tệp. Dưới đây là một số lệnh phổ biến:

  • ls hoặc dir: Liệt kê các tệp và thư mục
  • cd directory: Thay đổi sang một thư mục khác
  • get file [localfile]: Tải xuống một tệp từ chia sẻ
  • put file [remotefile]: Tải lên một tệp lên chia sẻ
  • mget files...: Tải xuống nhiều tệp
  • mput files...: Tải lên nhiều tệp
  • mkdir directory: Tạo một thư mục
  • rmdir directory: Xóa một thư mục
  • rm file: Xóa một tệp
  • help hoặc ?: Hiển thị trợ giúp
  • quit hoặc exit: Thoát smbclient

Bây giờ chúng ta đã hiểu các khái niệm cơ bản về smbclient, trong bước tiếp theo, chúng ta sẽ xem cách kết nối với một chia sẻ SMB thực tế.

Thiết lập môi trường SMB thử nghiệm

Trong một kịch bản thực tế, bạn sẽ kết nối với một máy chủ Windows hoặc Samba thực tế. Tuy nhiên, đối với lab này, chúng ta sẽ mô phỏng một môi trường SMB bằng cách sử dụng một máy chủ Samba cục bộ. Cách tiếp cận này cho phép chúng ta thực hành các lệnh smbclient mà không cần truy cập vào một máy chủ bên ngoài.

Cài đặt Máy chủ Samba

Đầu tiên, hãy cài đặt gói máy chủ Samba:

sudo apt install -y samba

Bạn sẽ thấy đầu ra cho biết quá trình cài đặt:

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  attr python3-dnspython python3-gpg python3-ldb python3-markdown python3-pygments python3-samba samba-common samba-common-bin samba-dsdb-modules samba-libs samba-vfs-modules tdb-tools
Suggested packages:
  bind9 bind9utils ctdb ldb-tools ntp | chrony python-markdown-doc python-pygments-doc
The following NEW packages will be installed:
  attr python3-dnspython python3-gpg python3-ldb python3-markdown python3-pygments python3-samba samba samba-common samba-common-bin samba-dsdb-modules samba-libs samba-vfs-modules tdb-tools
0 upgraded, 14 newly installed, 0 to remove and 0 not upgraded.
Need to get 10.1 MB of archives.
After this operation, 51.3 MB of additional disk space will be used.
...

Tạo một chia sẻ Samba

Bây giờ, hãy tạo một cấu hình chia sẻ Samba đơn giản. Đầu tiên, hãy sao lưu tệp cấu hình gốc:

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup

Tạo một thư mục để chia sẻ:

mkdir -p ~/project/samba-share

Hãy tạo một tệp thử nghiệm trong thư mục chia sẻ này:

echo "This is a test file in our Samba share" > ~/project/samba-share/shared-test.txt

Bây giờ, hãy tạo một cấu hình Samba đơn giản:

sudo bash -c 'cat > /etc/samba/smb.conf << EOF
[global]
   workgroup = WORKGROUP
   server string = Samba Server
   log file = /var/log/samba/log.%m
   max log size = 50
   security = user
   map to guest = bad user

[testshare]
   path = /home/labex/project/samba-share
   browseable = yes
   read only = no
   guest ok = yes
   force user = labex
EOF'

Thêm người dùng hiện tại vào người dùng Samba và đặt mật khẩu để thử nghiệm:

sudo smbpasswd -a labex

Khi được nhắc, hãy nhập một mật khẩu đơn giản như password (bạn sẽ cần nhập hai lần):

New SMB password:
Retype new SMB password:
Added user labex.

Khởi động lại dịch vụ Samba để áp dụng các thay đổi:

sudo service smbd restart

Bây giờ chúng ta đã có một chia sẻ Samba cục bộ có tên là testshare được thiết lập trên hệ thống của chúng ta. Chúng ta có thể sử dụng smbclient để kết nối với nó như thể nó là một chia sẻ Windows từ xa.

Kết nối với Chia sẻ SMB bằng smbclient

Bây giờ chúng ta đã thiết lập môi trường SMB thử nghiệm, hãy kết nối với chia sẻ bằng smbclient.

Liệt kê các Chia sẻ Có sẵn

Đầu tiên, hãy liệt kê tất cả các chia sẻ có sẵn trên máy cục bộ của chúng ta:

smbclient -L localhost -U labex

Khi được nhắc, hãy nhập mật khẩu bạn đã đặt cho người dùng Samba (ví dụ: password):

Enter WORKGROUP\labex's password:

Bạn sẽ thấy đầu ra tương tự như sau:

        Sharename       Type      Comment
        ---------       ----      -------
        testshare       Disk
        IPC$            IPC       IPC Service (Samba Server)
Reconnecting with SMB1 for workgroup listing.

        Server               Comment
        ---------            -------
        UBUNTU               Samba Server

        Workgroup            Master
        ---------            -------
        WORKGROUP            UBUNTU

Điều này cho thấy chia sẻ testshare mới được tạo của chúng ta hiện đã khả dụng.

Kết nối với Chia sẻ

Bây giờ, hãy kết nối với chia sẻ testshare:

smbclient //localhost/testshare -U labex

Nhập mật khẩu khi được nhắc:

Enter WORKGROUP\labex's password:

Khi kết nối thành công, bạn sẽ thấy dấu nhắc smbclient:

Try "help" to get a list of possible commands.
smb: \>

Điều hướng và Liệt kê Tệp

Bây giờ chúng ta đã kết nối với chia sẻ, hãy khám phá một số lệnh cơ bản:

Để liệt kê các tệp trong thư mục hiện tại:

smb: \> ls

Bạn sẽ thấy tệp thử nghiệm chúng ta đã tạo trước đó:

  .                                   D        0  Tue Nov 30 12:00:00 2022
  ..                                  D        0  Tue Nov 30 12:00:00 2022
  shared-test.txt                     N       37  Tue Nov 30 12:00:00 2022

                8467839 blocks of size 4096. 3524491 blocks available

Tạo Thư mục Từ xa

Hãy tạo một thư mục mới trên chia sẻ SMB:

smb: \> mkdir test-directory

Liệt kê lại nội dung để xác minh thư mục đã được tạo:

smb: \> ls

Bạn sẽ thấy thư mục mới:

  .                                   D        0  Tue Nov 30 12:01:00 2022
  ..                                  D        0  Tue Nov 30 12:00:00 2022
  shared-test.txt                     N       37  Tue Nov 30 12:00:00 2022
  test-directory                      D        0  Tue Nov 30 12:01:00 2022

                8467839 blocks of size 4096. 3524491 blocks available

Thay đổi Thư mục

Hãy thay đổi sang thư mục chúng ta vừa tạo:

smb: \> cd test-directory

Xác minh chúng ta đang ở trong thư mục mới:

smb: \test-directory\> ls

Đầu ra sẽ hiển thị một thư mục trống:

  .                                   D        0  Tue Nov 30 12:01:00 2022
  ..                                  D        0  Tue Nov 30 12:01:00 2022

                8467839 blocks of size 4096. 3524491 blocks available

Để quay lại thư mục gốc:

smb: \test-directory\> cd ..

Nhận Trợ giúp Trong smbclient

Để xem các lệnh có sẵn trong smbclient:

smb: \> help

Bạn sẽ thấy một danh sách tất cả các lệnh có sẵn:

?              allinfo        altname        archive        backup
blocksize      cancel         case_sensitive cd             chmod
chown          close          del            dir            du
echo           exit           get            getfacl        geteas
hardlink       help           history        iosize         lcd
link           lock           lowercase      ls             l
mask           md             mget           mkdir          more
mput           newer          notify         open           posix
posix_encrypt  posix_open     posix_mkdir    posix_rmdir    posix_unlink
print          prompt         put            pwd            q
queue          quit           readlink       rd             recurse
reget          rename         reput          rm             rmdir
showacls       setea          setmode        stat           symlink
tar            tarmode        timeout        translate      unlock
volume         vuid           wdel           logon          listconnect
showconnect    tcon           tdis           tid            utimes
logoff         ..             !

Khi bạn đã khám phá xong, bạn có thể thoát khỏi phiên smbclient:

smb: \> quit

Trong bước tiếp theo, chúng ta sẽ tìm hiểu cách truyền tệp giữa hệ thống Linux và chia sẻ SMB.

Truyền Tệp với smbclient

Trong bước cuối cùng này, chúng ta sẽ tìm hiểu cách truyền tệp giữa hệ thống Linux của chúng ta và chia sẻ SMB.

Kết nối lại với Chia sẻ

Hãy kết nối lại với chia sẻ SMB của chúng ta:

smbclient //localhost/testshare -U labex

Nhập mật khẩu khi được nhắc:

Enter WORKGROUP\labex's password:

Bạn sẽ thấy dấu nhắc smbclient:

Try "help" to get a list of possible commands.
smb: \>

Tải tệp lên Chia sẻ

Hãy tải tệp thử nghiệm mà chúng ta đã tạo trước đó lên chia sẻ SMB. Đầu tiên, chúng ta cần kiểm tra thư mục cục bộ hiện tại của mình:

smb: \> !pwd

Lệnh này chạy lệnh pwd trên hệ thống cục bộ của bạn và sẽ hiển thị:

/home/labex/project

Chúng ta cần thay đổi sang thư mục nơi tệp thử nghiệm của chúng ta được đặt:

smb: \> lcd ~/project/smb-files

Xác minh chúng ta đang ở trong thư mục chính xác:

smb: \> !ls

Bạn sẽ thấy:

test.txt

Bây giờ, hãy tải tệp lên chia sẻ SMB:

smb: \> put test.txt

Bạn sẽ thấy một thông báo cho biết tệp đã được truyền:

putting file test.txt as \test.txt (38.5 kb/s) (average 38.5 kb/s)

Xác minh tệp đã được tải lên:

smb: \> ls

Bạn sẽ thấy:

  .                                   D        0  Tue Nov 30 12:02:00 2022
  ..                                  D        0  Tue Nov 30 12:00:00 2022
  shared-test.txt                     N       37  Tue Nov 30 12:00:00 2022
  test-directory                      D        0  Tue Nov 30 12:01:00 2022
  test.txt                            N       33  Tue Nov 30 12:02:00 2022

                8467839 blocks of size 4096. 3524491 blocks available

Tải xuống tệp từ Chia sẻ

Bây giờ, hãy tải xuống một tệp từ chia sẻ SMB vào hệ thống cục bộ của chúng ta. Đầu tiên, hãy tạo một thư mục mới để lưu trữ các tệp đã tải xuống:

smb: \> !mkdir -p ~/project/smb-downloads

Thay đổi sang thư mục đó:

smb: \> lcd ~/project/smb-downloads

Bây giờ, hãy tải xuống tệp:

smb: \> get shared-test.txt

Bạn sẽ thấy một thông báo cho biết tệp đã được truyền:

getting file \shared-test.txt of size 37 as shared-test.txt (37.0 KiloBytes/sec) (average 37.0 KiloBytes/sec)

Xác minh tệp đã được tải xuống:

smb: \> !ls

Bạn sẽ thấy:

shared-test.txt

Sử dụng mget và mput cho nhiều tệp

Các lệnh mgetmput cho phép bạn truyền nhiều tệp cùng một lúc. Hãy thử tạo thêm một vài tệp trên hệ thống cục bộ của chúng ta:

smb: \> !cd ~/project/smb-files && touch file1.txt file2.txt file3.txt

Bây giờ, hãy tải lên tất cả các tệp .txt cùng một lúc:

smb: \> lcd ~/project/smb-files
smb: \> mput *.txt

Đối với mỗi tệp, bạn sẽ được yêu cầu xác nhận. Nhập Y để xác nhận mỗi lần truyền:

mput test.txt? Y
putting file test.txt as \test.txt (38.5 kb/s) (average 38.5 kb/s)
mput file1.txt? Y
putting file file1.txt as \file1.txt (0.0 kb/s) (average 19.2 kb/s)
mput file2.txt? Y
putting file file2.txt as \file2.txt (0.0 kb/s) (average 12.8 kb/s)
mput file3.txt? Y
putting file file3.txt as \file3.txt (0.0 kb/s) (average 9.6 kb/s)

Nếu bạn muốn truyền tất cả các tệp mà không cần xác nhận, bạn có thể tắt lời nhắc:

smb: \> prompt
smb: \> mput *.txt

Tương tự, để tải xuống nhiều tệp:

smb: \> lcd ~/project/smb-downloads
smb: \> mget *.txt

Khi bạn đã hoàn tất, hãy thoát khỏi phiên smbclient:

smb: \> quit

Các lệnh không tương tác

Bạn cũng có thể sử dụng smbclient để thực thi các lệnh mà không cần vào shell tương tác. Ví dụ: để liệt kê nội dung của một chia sẻ:

smbclient //localhost/testshare -U labex -c 'ls'

Nhập mật khẩu khi được nhắc và bạn sẽ thấy danh sách thư mục:

Enter WORKGROUP\labex's password:
  .                                   D        0  Tue Nov 30 12:03:00 2022
  ..                                  D        0  Tue Nov 30 12:00:00 2022
  file1.txt                           N        0  Tue Nov 30 12:03:00 2022
  file2.txt                           N        0  Tue Nov 30 12:03:00 2022
  file3.txt                           N        0  Tue Nov 30 12:03:00 2022
  shared-test.txt                     N       37  Tue Nov 30 12:00:00 2022
  test-directory                      D        0  Tue Nov 30 12:01:00 2022
  test.txt                            N       33  Tue Nov 30 12:03:00 2022

                8467839 blocks of size 4096. 3524491 blocks available

Để tải xuống một tệp trong một lệnh duy nhất:

smbclient //localhost/testshare -U labex -c 'get test.txt /home/labex/project/test-download.txt'

Lệnh này tải xuống tệp test.txt từ chia sẻ và lưu nó dưới dạng test-download.txt trong thư mục project của bạn.

Bây giờ bạn đã hiểu rõ về cách sử dụng smbclient để kết nối với các chia sẻ SMB, điều hướng thư mục và truyền tệp. Các kỹ năng này rất cần thiết khi làm việc trong môi trường Windows/Linux hỗn hợp.

Tóm tắt

Trong lab này, chúng ta đã khám phá lệnh smbclient trong Linux, cung cấp một công cụ thiết yếu để kết nối các hệ thống Linux với các chia sẻ tệp Windows (SMB/CIFS). Chúng ta đã đề cập đến một số khía cạnh chính của việc làm việc với smbclient:

  1. Cài đặt: Chúng ta đã cài đặt gói smbclient trên Ubuntu 22.04, bao gồm các phần phụ thuộc của nó.

  2. Các khái niệm cơ bản về lệnh: Chúng ta đã tìm hiểu về cú pháp và lệnh cơ bản có sẵn trong smbclient, bao gồm cách kết nối với các chia sẻ và điều hướng bên trong chúng.

  3. Thiết lập Môi trường Thử nghiệm: Chúng ta đã tạo một môi trường SMB thử nghiệm bằng cách sử dụng một máy chủ Samba cục bộ để thực hành các lệnh của chúng ta mà không cần truy cập vào một máy chủ Windows bên ngoài.

  4. Kết nối với các Chia sẻ: Chúng ta đã kết nối với chia sẻ SMB thử nghiệm của chúng ta và khám phá các lệnh điều hướng như ls, cdmkdir.

  5. Truyền Tệp: Chúng ta đã học cách tải tệp lên một chia sẻ SMB bằng put và tải xuống tệp bằng get. Chúng ta cũng đã khám phá việc truyền nhiều tệp với mputmget.

Các kỹ năng bạn đã có được từ lab này có thể áp dụng trực tiếp vào các kịch bản thực tế, nơi bạn cần tương tác với các hệ thống hoặc máy chủ Windows từ môi trường Linux. Cho dù bạn đang truyền tệp giữa các hệ thống, tự động hóa sao lưu hay tích hợp các hệ thống Linux vào mạng Windows, smbclient cung cấp một giao diện dòng lệnh mạnh mẽ cho các tác vụ này.

Đối với các thao tác tệp phức tạp hoặc thường xuyên hơn, bạn có thể muốn khám phá việc gắn các chia sẻ SMB trực tiếp vào hệ thống tệp Linux của mình bằng lệnh mount với loại hệ thống tệp cifs, được xây dựng dựa trên các khái niệm mà chúng ta đã học ở đây.

400+ câu lệnh phổ biến trong Linux