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.