Quản lý lịch sử lệnh trong bash shell Image Quản lý lịch sử lệnh trong bash shell

Bài viết này giới thiệu cách quản lý lịch sử lệnh trong bash shell trên hệ điều hành Linux chúng ta cùng thực hiện các ví dụ bên dưới để giúp cho các bạn có thể tự tìm hiểu và học Linux cơ bản một cách dể dễ dàng.

1. Giới thiệu lệnh history

Lệnh history có sẵn trong Bash có thể được dùng để kiểm tra lịch sử lệnh hoặc để có được thông tin về lệnh được thực thi bởi người dùng. Lệnh history cho phép chúng ta nhanh chóng xem những gì đã được thực hiện trước đây trên một hệ thống, cho phép người dùng chịu trách nhiệm cho hành động của họ. Nó rất hữu ích khi bạn chạy một lệnh nào đó trước đó và quên lệnh.

Theo mặc định ngày và thời gian sẽ không được nhìn thấy trong khi thực hiện lệnh history. Tuy nhiên, bash shell cung cấp cho chúng ta tiện ích CLI để chỉnh sửa lệnh history của người dùng.

2. Ứng dụng lệnh history

2.1. In history

Chạy lệnh history và nó sẽ in ra lịch sử bash của người dùng hiện tại ra màn hình.

[root@test1 ~]# history
    1  openssl rand
    2  openssl rand  -hex 12
    3  passwd
    4  vi /etc/ssh/sshd_config
    5  cd ~/.ssh/authorized_keys
    6  cat ~/.ssh/authorized_keys
    7  systemctl restart sshd
    8  exit
    9  vi /etc/ssh//sshd_config
   10  systemctl restart sshd
   11  exit

Các lệnh được đánh số, với các lệnh cũ hơn ở phía trên và các lệnh mới hơn ở phía dưới.

Ngoài ra history được lưu trữ trong tệp ~/.bash_history theo mặc định. Bạn có thể chạy cat ~/ .bash_history giống như khi chạy lệnh history nhưng không có số dòng hoặc định dạng.

[root@test1 ~]# cat .bash_history
openssl rand
openssl rand  -hex 12
passwd
vi /etc/ssh/sshd_config
cd ~/.ssh/authorized_keys
cat ~/.ssh/authorized_keys
systemctl restart sshd
exit

2.2. In history với số dòng

Mặc định là lệnh history sẽ in tất cả các dòng lệnh mà chúng ta đã thực thi trước đó, nhưng bạn có thể chỉ định một số sau lệnh history để xuất số lượng dòng gần đây. Thực hiện như bên dưới:

[root@test1 ~]# history 5
  813  man unam
  814  uname -s
  815  uname -r
  816  history -3
  817  history 5

2.3. Lặp lại lệnh gần nhất được thực thi

Để chạy lại lệnh gần nhất được thực thi đơn giản bằng cách nhập !! như sau:

[root@test1 ~]# date
Mon Apr 29 23:39:26 +07 2019
[root@test1 ~]# !!
date
Mon Apr 29 23:39:29 +07 2019

Ngoài ra, bạn có thể nhấn phím mũi tên ⬆️ để hiển thị lệnh vừa thực thi và sau đó nhấn phím enter để thực hiện.

2.4. Lặp lại lệnh cụ thể

Lệnh history hiển thị số dòng. Có thể lặp lại một lệnh bằng cách chỉ định số dòng của nó.

[root@test1 ~]# history 2
  818  date
  819  history 2
[root@test1 ~]# !818
date
Mon Apr 29 23:39:41 +07 2019

2.5. Tìm kiếm lệnh được thực thi kết hợp lệnh grep

Tìm kiếm lệnh thông qua .bash_history bằng cách chuyển tệp lịch sử của bạn vào grep như bên dưới.

Ví dụ: Lệnh bên dưới sẽ tìm kiếm và tìm lệnh 'ls' trong danh sách history.

[root@test1 ~]# history | grep ls
   49  2019-04-29 23:38:03  ls
   54  2019-04-29 23:38:03  ls -l /var/log/wtmp
   58  2019-04-29 23:38:03  ls
   67  2019-04-29 23:38:03  ls -l /var/log/wtmp
   70  2019-04-29 23:38:03  ls -l /var/log/wtmp
   72  2019-04-29 23:38:03  ls -l /var/log/wtmp

2.6. Tinh chỉnh định dạng lưu của history

👉 Ví dụ 1: Liệt kê tất cả các lệnh có ngày và thời gian

Để tìm ngày và thời gian của các lệnh đã được thực thi chúng ta sử dụng lệnh export cùng với biến HISTTIMEFORMAT thì lệnh history sẽ hiển thị ngày với thời gian khi lệnh được thực thi. Thực hiện như bên dưới:

[root@test1 ~]# export HISTTIMEFORMAT='%F %T '
[root@test1 ~]# history | more
    1  2019-04-29 23:45:13 history
    2  2019-04-29 23:45:43 vi .bash_history
    3  2019-04-29 23:45:59 cat .bash_history
    4  2019-04-29 23:47:38 export HISTTIMEFORMAT='%F %T  '
    5  2019-04-30 00:05:57 HISTTIMEFORMAT="%F %T: "
    6  2019-04-30 00:07:06 history | more

Trong đó ý nghĩa của các biến HISTTIMEFORMAT là:

  • %F: Tương đương với %Y%m%d
  • %T: Tương đương theo thời gian %H:%M:%S

👉 Ví dụ 2: Bỏ qua các lệnh trùng trong lịch sử

Lệnh dưới đây sẽ giúp chúng ta bỏ qua các lệnh trùng lặp được thực hiện bởi người dùng. Chỉ có một mục duy nhất sẽ được hiển thị trong lịch sử, nếu người dùng thực thi cùng một lệnh nhiều lần:

[root@test1 ~]# export HISTCONTROL=ignoredups

👉 Ví dụ 3: Xóa bỏ các tinh chỉnh chưa lưu

Bỏ đặt lệnh export khi đang chạy bằng việc thực thi lệnh unset export cùng với tên biến. Như bên dưới:

[root@test1 ~]# unset export HISTCONTROL
[root@test1 ~]# unset export HISTTIMEFORMAT

👉 Ví dụ 4: Lưu lại các tinh chỉnh

Thêm một dòng như sau trong .bash_profile để lưu lệnh export vĩnh viễn.

[root@test1 ~]# vi .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

export HISTTIMEFORMAT='%F %T '

PAT=H$PATH:$HOME/bin
export PATH

2.7. Vô hiệu hóa lưu trữ lịch sử các lệnh thực thi

Để vô hiệu hóa lưu trữ lịch sử các lệnh thực thi. Trong trường hợp này, chúng tôi có thể chỉnh sửa tệp .bash_profile của người dùng và thêm vào dòng HISTSIZE=0 như dưới đây.

[root@test1 ~]# vi .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs

export HISTTIMEFORMAT='%F %T '

PAT=H$PATH:$HOME/bin
HISTSIZE=0
export PATH

Sau đó lưu tập tin và tải thay đổi với lệnh dưới đây.

[root@test1 ~]# source .bash_profile

Lưu ý: Nếu bạn không muốn hệ thống ghi nhớ các lệnh mà bạn đã nhập, chỉ cần thực hiện lệnh bên dưới sẽ vô hiệu hóa hoặc dừng ghi lịch sử.

[root@test1 ~]# export HISTSIZE=0

2.8. Xóa lịch sử các lệnh đã thực thi

Chúng ta có thể xóa lịch sử các lệnh đã thực thi bằng tùy chọn -c.

[root@test1 ~]# history -c

2.9. Tìm kiếm một lệnh

Tìm kiếm lệnh đã thực hiện trước đó bằng cách nhấn tổ hợp phím Ctrl + r. Khi bạn đã tìm thấy lệnh bạn đang tìm kiếm, nhấn Enter để thực hiện tương tự, nhấn Esc để hủy lệnh đó. Khi bấm tổ hợp phím Ctrl + r sẽ hiển thị như bên dưới:

(reverse-i-search)`':

2.10. Thoát shell không lưu history

Khi chúng ta muốn thoát shell và không muốn lưu bất kì thông tin history nào đã thao tác. Chúng ta các thể thực hiện như sau:

Chỉ xóa history của phiên làm việc hiện tại và giữ lại history cũ hơn:

👉 Ví dụ 1: Thoát khỏi shell không lưu history bằng cách bỏ đặt HISTFILE. Chúng ta chạy lệnh bên dưới:

[root@test1 ~]# unset HISTFILE && exit

Lưu ý: HISTFILE chỉ lưu lại thông tin các lệnh đang được lưu trên RAM sau khi chúng ta thoát khỏi terminal bằng lệnh exit hoặc logout.

👉 Ví dụ 2: Thoát khỏi shell không lưu history bằng cách kill console. Thực hiện như sau:

[root@test1 ~]# kill -9 $$

👉 Ví dụ 3: Thoát khỏi shell mà không lưu history và xoá lịch sử. Bạn có thể chạy lệnh sau:

[root@test1 ~]# history -c && exit

👉 Ví dụ 4: Thoát khỏi shell mà không lưu history bằng cách đặt HISTSIZE=0:

[root@test1 ~]# HISTSIZE=0 && exit

👉 Ví dụ 5: Thoát khỏi shell và xóo toàn bộ history bằng cách xóa HISTFILE và hủy đặt HISTFILE. Thực hiện như bên dưới:

[root@test1 ~]# rm -f $HISTFILE && unset HISTFILE && exit

Nếu chúng ta muốn các lệnh trên được thực thi vĩnh viễn khi chúng ta thoát shell chúng ta hãy thêm các lệnh trên vào file ~/.bash_logout để chúng luôn được thực thi khi chúng ta exit hoặc logout shell.

3. Lời kết

Qua bài trên, giúp cho chúng ta biết cách sử dụng lệnh history cùng với sự mạnh mẽ của nó cho phép chúng ta xem lịch sử các lệnh đã được thực thi trong bash với một số tùy chỉnh có sẵn của nó trên hệ điều hành Linux. Qua đây gíúp cho chúng ta có thể ưự học Linux dể hơn.