17 Ví dụ về lịch sử lệnh Bash trong Linux

Tác giả sysadmin, T.M.Hai 29, 2022, 10:14:58 SÁNG

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

17 Ví dụ về lịch sử lệnh Bash trong Linux


Lệnh 'history' có sẵn trong Bash có thể được sử dụng để hiển thị lịch sử trình bao của bạn một cách đơn giản, tuy nhiên, bạn cũng có thể làm được nhiều điều hơn nữa với nó, mà chúng tôi sẽ trình bày ở đây.

Lịch sử Bash cho phép chúng tôi nhanh chóng xem những gì đã được thực hiện trước đó trên một hệ thống, cho phép bạn giữ người dùng ít nhất phải chịu trách nhiệm về hành động của họ (thêm về điều này sau). Nó cũng hữu ích nếu bạn đã chạy thứ gì đó trước đây và quên lệnh, tôi không thể bắt đầu cho bạn biết số lần tôi đã làm việc này!

1. In lịch sử

Ở dạng đơn giản nhất, bạn có thể tự chạy lệnh 'history' và nó sẽ in lịch sử bash của người dùng hiện tại ra màn hình. Các lệnh được đánh số, với các lệnh cũ hơn ở trên cùng và các lệnh mới hơn ở dưới cùng.

Mã nguồn [Chọn]
[user@centos7 ~]$ history
    1  ip a
    2  exit
    3  ls -la
    4  pwd
[user@centos7 ~]#

Theo mặc định, lịch sử được lưu trữ trong tệp ~/.bash_history. Bạn cũng có thể chạy 'cat ~/.bash_history' tương tự nhưng không bao gồm số dòng hoặc định dạng.

2. In dòng 'n'

Mặc dù mặc định là in tất cả các dòng lịch sử, nhưng bạn có thể chỉ định một số sau lệnh lịch sử để xuất số lượng dòng gần đây nhất này.

Mã nguồn [Chọn]
[user@centos7 ~]$ history 3
   16  passwd
   17  getenforce
   18  history 3

3. Lặp lại lệnh gần đây nhất

Lệnh gần đây nhất có thể được thực thi đơn giản bằng cách nhập '!!'.

Mã nguồn [Chọn]
[root@centos7 ~]# date
Sun Aug 28 03:14:55 PDT 2016
[root@centos7 ~]# !!
date
Sun Aug 28 03:14:57 PDT 2016

Ngoài ra, bạn có thể chỉ cần nhấn phím mũi tên 'lên' để hiển thị lệnh cuối cùng rồi nhấn enter để thực hiện lệnh đó.

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

Như hình trên, lệnh bash 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ó.

Mã nguồn [Chọn]
[root@centos7 ~]# history 2
  101  date
  102  history 2
[root@centos7 ~]# !101
date
Sun Aug 28 03:18:55 PDT 2016

Trong ví dụ này, lệnh 'date' là dòng thứ 101 trong tệp lịch sử và chúng tôi có thể chạy lại lệnh này với '!101'. Lưu ý rằng số dòng có thể thay đổi, đặc biệt nếu tệp lịch sử của bạn đầy, vì vậy đừng dựa vào cùng một số luôn trỏ đến cùng một lệnh.

5. Lặp lại lệnh bắt đầu bằng một chuỗi

Chúng ta có thể lặp lại lệnh cuối cùng bắt đầu bằng một chuỗi đã chỉ định. Điều này được thực hiện với !string, nơi string bắt đầu một lệnh đã thực hiện trước đó.

Mã nguồn [Chọn]
[root@centos7 ~]# systemctl start httpd
[root@centos7 ~]# systemctl stop chronyd
[root@centos7 ~]# systemctl restart chronyd
[root@centos7 ~]# !systemctl
systemctl restart chronyd

Như được hiển thị, lệnh gần đây nhất bắt đầu bằng 'systemctl' đã được chạy lại.

Trong khi hữu ích, điều này rõ ràng có thể nguy hiểm nếu lệnh cuối cùng thực sự khác với những gì bạn mong đợi. Bạn có thể chạy cái này với ':p' ở cuối để in lệnh thay vì thực thi nó ngay lập tức.

Mã nguồn [Chọn]
[root@centos7 ~]# !systemctl:p
systemctl stop chronyd

Điều này chưa thực sự thực hiện khởi động lại, nó chỉ hiển thị lệnh.

6. Lịch sử đường ống Piping

Tất nhiên, chúng ta có thể chuyển đầu ra của lệnh history thành nhiều lệnh hữu ích khác, chẳng hạn như less hoặc grep. Khi chuyển sang ít hơn, chúng ta có thể cuộn qua đầu ra của tệp lịch sử thay vì để tất cả xuất ra thiết bị đầu cuối. Bằng cách xuất ra grep, chúng ta có thể tìm kiếm các lệnh đã được chạy trước đó.

Mã nguồn [Chọn]
[root@centos7 ~]# history | grep httpd
   65  yum install httpd -y
  106  systemctl stop httpd
  107  systemctl start httpd
  117  history | grep httpd

7. Ghi vào tập tin lịch sử

Thông thường, tệp lịch sử được ghi vào khi đăng xuất, do đó, nếu bạn có một phiên SSH đã hết thời gian, bạn sẽ không có lịch sử từ phiên đó khi đăng nhập lại. Chúng tôi có thể buộc lịch sử hiện tại ghi vào người dùng ~/. bash_history với tùy chọn -w.

Mã nguồn [Chọn]
[root@centos7 ~]# history -w
8. Xóa tệp lịch sử

Chúng ta có thể xóa tất cả nội dung của tệp lịch sử bằng lệnh -c.

Mã nguồn [Chọn]
[root@centos7 ~]# history -c
Lưu ý rằng điều này sẽ chỉ xóa lịch sử trong bộ nhớ, các thay đổi sẽ được ghi khi người dùng đăng xuất, tuy nhiên chúng ta có thể lưu các thay đổi vào tệp.bash_history ngay lập tức bằng cách chạy 'history -w' sau đó.

Chúng tôi cũng có thể xóa hoặc xóa nội dung của tệp ~/.bash_history, tuy nhiên, hãy nhớ rằng lịch sử hiện tại được ghi vào tệp khi đăng xuất, vì vậy nếu bạn xóa tệp thì đăng xuất lịch sử phiên hiện tại của bạn sẽ vẫn được cứu.

9. Xóa dòng cụ thể

Xóa toàn bộ tệp lịch sử có thể là quá mức cần thiết, thay vào đó chúng ta có thể xóa một số dòng cụ thể khỏi tệp lịch sử bằng tùy chọn -d.

Mã nguồn [Chọn]
[root@centos7 ~]# history | grep password
  121  Sun 28 Aug 2016 03:33:11 AM PDT mysql -u root -p oops_this_is_my_password
  122  Sun 28 Aug 2016 03:33:19 AM PDT history | grep password
[root@centos7 ~]# history -d 121
[root@centos7 ~]# history | grep password
  121  Sun 28 Aug 2016 03:33:19 AM PDT history | grep password
  123  Sun 28 Aug 2016 03:33:29 AM PDT history | grep password

Trong ví dụ này, người dùng đã vô tình để lại mật khẩu MySQL của họ trong lịch sử bash ở dòng 121, sau đó chúng tôi xóa mật khẩu này bằng tùy chọn -d và chỉ định số dòng cần xóa. Chúng ta có thể thấy rằng dòng 121 hiện là lệnh lịch sử của chúng ta, như đã đề cập trước đây, hãy lưu ý rằng số dòng có thể thay đổi nên không nên dựa vào chúng để duy trì trạng thái tĩnh.

10. Chạy một lệnh mà không cần đăng nhập

Chúng ta có thể chạy một lệnh duy nhất mà không cần ghi vào lịch sử bash.

Mã nguồn [Chọn]
[root@centos7 ~]# echo "secret command";history -d $(history 1)
secret command

Thao tác này sẽ xóa lệnh chạy gần đây nhất ngay sau khi thực hiện.

11. Chạy tất cả các lệnh mà không cần đăng nhập

Ngoài ra, chúng tôi có thể bỏ đặt biến tệp lịch sử cho phiên bash hiện tại, điều này sẽ ngăn tất cả lịch sử cho phiên hiện tại được lưu trữ.

Mã nguồn [Chọn]
[root@centos7 ~]# echo $HISTFILE
/root/.bash_history
[root@centos7 ~]# unset HISTFILE
[root@centos7 ~]# echo $HISTFILE

Lưu ý rằng đây không phải là vĩnh viễn, khi bạn đăng xuất và đăng nhập lại HISTFILE sẽ được đặt lại về mặc định. Ví dụ này sẽ cho phép bạn có phiên không ghi nhật ký, mặc dù bạn có thể chỉ định tùy chọn không đặt trong ~/.bashrc để không bao giờ ghi nhật ký lịch sử.

12. Bỏ qua các lệnh cụ thể

Chúng ta có thể chỉ định một danh sách các lệnh không bao giờ được ghi vào tệp lịch sử bằng biến $HISTIGNORE, không được đặt theo mặc định.

Mã nguồn [Chọn]
[root@centos7 ~]# echo 'export HISTIGNORE="ls:cd"' >> ~/.bashrc
Như trước đây khi tệp này được ghi vào, bạn cần phải đăng xuất và đăng nhập lại để nó thực thi.

Mã nguồn [Chọn]
[root@centos7 ~]# ls
anaconda-ks.cfg  new_history
[root@centos7 ~]# pwd
/root
[root@centos7 ~]# cd
[root@centos7 ~]# echo hi
hi
[root@centos7 ~]# history 5
  123  history
  124  du
  125  pwd
  126  echo hi
  127  history 5

Như được hiển thị, các lệnh 'ls' và 'cd' mà chúng tôi đã chạy không được lưu trong nhật ký.

13. Tăng kích thước lịch sử

Theo mặc định, 1000 dòng lịch sử sẽ được lưu trữ, theo các giá trị được lưu trữ trong các biến $HISTSIZE và $HISTFILESIZE.

Mã nguồn [Chọn]
[root@centos7 ~]# echo $HISTFILESIZE
1000
[root@centos7 ~]# echo $HISTSIZE
1000

Mặc định cho tất cả người dùng được lưu trữ trong tệp /etc/profile, điều này có thể được sửa đổi hoặc bạn có thể nối thêm các dòng sau vào cuối ~/.bashrc sẽ áp dụng cho người dùng đó trong lần đăng nhập tiếp theo.

Mã nguồn [Chọn]
HISTSIZE=2000
HISTFILESIZE=2000

Lưu ý rằng nếu tệp lịch sử của bạn đầy, các lệnh cũ nhất sẽ được xoay ra trước và bị xóa khi các dòng mới được thêm vào.

14. Thêm dấu thời gian vào lịch sử

Như bạn có thể nhận thấy theo mặc định, chúng tôi không thể xem ngày và giờ mà các lệnh được thực thi, chỉ đơn thuần là thứ tự của chúng. Chúng ta có thể đặt biến $HISTTIMEFORMAT với định dạng ngày giờ cụ thể, tùy chọn đơn giản nhất là sử dụng %c như hình bên dưới.

Mã nguồn [Chọn]
echo 'export HISTTIMEFORMAT="%c "' >> ~/.bashrc
Sau khi người dùng này đăng xuất và đăng nhập lại để thực thi xuất, tệp lịch sử hiện tại sẽ hiển thị tất cả nội dung đang thực thi cùng lúc với thông tin thời gian không được ghi lại trước đó. Tuy nhiên, từ đây trở đi, ngày và giờ sẽ được lưu trữ với mỗi lệnh trong tệp lịch sử bash.

Mã nguồn [Chọn]
[root@centos7 ~]# history 5
   39  Sun 28 Aug 2016 02:37:54 AM PDT firewall-cmd --add-service=http --permanent
   40  Sun 28 Aug 2016 02:37:54 AM PDT firewall-cmd --reload
   41  Sun 28 Aug 2016 02:37:54 AM PDT tailf /var/log/messages
   42  Sun 28 Aug 2016 02:37:54 AM PDT restorecon -v /var/www/html/index.html
   43  Sun 28 Aug 2016 02:49:27 AM PDT history 5

15. Thay đổi vị trí tệp lịch sử

Theo mặc định, lịch sử bash được ghi vào ~/.bash_history, lịch sử này được đặt trong biến $HISTFILE như hình bên dưới.

Mã nguồn [Chọn]
[root@centos7 ~]# echo $HISTFILE
/root/.bash_history
[root@centos7 ~]# su - user
[user@centos7 ~]$ echo $HISTFILE
/home/user/.bash_history

Chúng tôi có thể đặt tệp tùy chỉnh trong ~/.bashrc như hình bên dưới.

Mã nguồn [Chọn]
[root@centos7 ~]# echo 'export HISTFILE="/root/new_history"' >> ~/.bashrc
Sau khi đăng xuất và quay lại, tất cả lịch sử sẽ được lưu trữ trong /root/new_history.

16. Không lưu trữ các lệnh trùng lặp

Theo mặc định, /etc/profile đặt biến $HISTCONTROL thành 'ignoredups', biến này sẽ bỏ qua các lệnh trùng lặp được chạy lần lượt.

Ví dụ: nếu chúng tôi thực hiện lệnh 'pwd' nhiều lần, nó sẽ chỉ hiển thị một lần trong lịch sử.

Mã nguồn [Chọn]
[root@centos7 ~]# pwd
/root
[root@centos7 ~]# pwd
/root
[root@centos7 ~]# pwd
/root
[root@centos7 ~]# pwd
/root
[root@centos7 ~]# history | grep pwd
    1  Sun 28 Aug 2016 04:01:07 AM PDT pwd
    2  Sun 28 Aug 2016 04:01:15 AM PDT history | grep pwd

Vì đây là trong tệp /etc/profile nên nó được đặt cho tất cả người dùng trên hệ thống theo mặc định.

17. Tìm kiếm đảo ngược

Mặc dù chúng tôi có thể duyệt qua các lệnh trước đó bằng các kỹ thuật được liệt kê trước đó, nhưng yêu thích của tôi là tìm kiếm đảo ngược được thực hiện bằng 'ctrl+r'.

Sau khi nhấn 'ctrl+r', bạn sẽ thấy dấu nhắc (reverse-i-search)`':, tại thời điểm này, bạn có thể bắt đầu nhập một lệnh đã được thực hiện trước đó và nó sẽ hiển thị lệnh gần đây nhất. Bạn có thể quay lại xa hơn thông qua các lệnh trước đó cũng chứa chuỗi này bằng cách nhấn 'ctrl+r' nhiều lần cho đến khi bạn tìm thấy thứ mình đang theo đuổi.

Mã nguồn [Chọn]
(reverse-i-search)`httpd': systemctl start httpd
Trong ví dụ này, tôi bắt đầu gõ httpd và nó cho thấy rằng lệnh gần đây nhất của tôi đang khởi động Apache. Khi bạn đã tìm thấy những gì bạn đang theo đuổi, hãy nhấn enter để thực hiện nó.

Tất cả lịch sử cũng nên được thực hiện với một hạt muối, vì nó rất dễ sửa đổi vì theo mặc định, người dùng có quyền ghi trên tệp ~/.bash_history của riêng họ để họ có thể sửa đổi nó theo cách họ muốn, bao gồm cả việc xóa nội dung cần che dấu vết của họ.

Thay vào đó, bạn có thể xem xét việc gửi lịch sử bash đến một máy chủ nhật ký hệ thống bên ngoài để không thể sửa đổi nó, nhưng đó là câu chuyện của một thời điểm khác.

Như đã trình bày lịch sử lệnh khá mạnh mẽ, nó cho phép chúng ta xem lịch sử lệnh trên hệ thống Linux sử dụng Bash với một số tùy chỉnh có sẵn.