Xóa lịch sử khỏi ~ / .bash_history


8

Tôi có một vài câu hỏi về thiết bị đầu cuối hoặc lịch sử dòng lệnh được lưu trữ trong ~/.bash_history.

  1. Tôi có thể thấy tệp trong thiết bị đầu cuối bằng historylệnh nhưng nếu tôi cố mở nó với gedit bash_historytệp thì hoàn toàn trống rỗng. Tại sao?

  2. Tôi đã tìm thấy cách xóa một số dòng nhất định trong tệp khỏi thiết bị đầu cuối với dòng mã này:

    for i in {1..N}; do history -d N; done

    Trong đó N là số dòng (hoặc lệnh) bạn muốn xóa, nhưng bây giờ tệp lịch sử hiển thị lệnh cuối cùng này và điều đó không thông minh lắm nếu bạn đang cố gắng che đậy nội dung của mình. Vì vậy, câu hỏi là: Làm thế nào tôi có thể đưa ra dòng mã cuối cùng và đảm bảo điều này không được ghi lại?



Đối với lưu ý trong tương lai, nếu bạn bắt đầu bất kỳ lệnh nào có khoảng trắng, lệnh đó sẽ không được lưu trong lịch sử của bạn.
Paddy Landau

Câu trả lời:


18
  1. Bạn chỉ cần quên dấu chấm trước, lệnh để mở tệp lịch sử thiết bị đầu cuối (bash) của bạn là

    gedit ~/.bash_history

    Tập tin này chỉ được cập nhật khi bạn đóng một thiết bị đầu cuối.

  2. Để xóa 10 dòng cuối cùng khỏi tệp này và không tự ghi lệnh này, hãy mở một thiết bị đầu cuối mới và thực hiện chuỗi lệnh sau:

    sed -n -e :a -e '1,10!{P;N;D;};N;ba' ~/.bash_history && history -c && exit

    hoặc là

    for i in {1..10}; do sed -i '$d' ~/.bash_history; done && history -c && exit

    hoặc là

    head -n -10 ~/.bash_history > ~/.b_h_2 && mv ~/.b_h_2 ~/.bash_history && history -c && exit

    sedhoặc headtương ứng xóa các dòng đã chọn khỏi ~/.bash_history, history -cxóa lịch sử của thiết bị đầu cuối và exitđóng nó.


Một thay thế ngắn hơn và hy vọng nhanh hơn cho for+ sed: head -n -Ntrong đó chữ hoa Nlà số dòng cần xóa. stackoverflow.com/a/13380679/711006
Melebius

2
@Melebius Có vẻ đầy hứa hẹn, nhưng làm thế nào để bạn chuyển hướng đầu ra sang tập tin đầu vào ghi đè lên nó? head -n -N testfile > testfilechỉ cần xóa các tập tin! Tôi đã thêm một cách giải quyết, tuy nhiên nó chắc chắn không ngắn hơn.
tráng miệng

Bạn nói đúng, tôi quên rằng headkhông thể làm việc tại chỗ như thế nào sed. Tôi chủ yếu tìm kiếm một sedlệnh duy nhất thay thế forvòng lặp của bạn . Có một số tùy chọn trên trang tôi đã liên kết nhưng chúng không dễ hiểu như mã của bạn.
Melebius

@Melebius Xem sed1line.txt cho điều đó - Tôi đã thêm nó ở trên, nó không thực sự ngắn hơn nhưng nên nhanh hơn.
tráng miệng

4

Tệp bash_history là một tệp ẩn, bắt đầu bằng dấu chấm. Bạn cần phải làm

gedit ~/.bash_history

Điều này sẽ mở ra các tập tin trong gedit.


1

Nếu bạn muốn xóa chỉ một số phần nhất định trong nhật ký lệnh của bạn thì các phương pháp trên chỉ là tốt. Nếu bạn muốn dừng ghi nhật ký lệnh cho một phiên bash cụ thể, sau đó ban hành lệnh

unset HISTFILE

Để quyết liệt hơn, nếu bạn không muốn bất kỳ lệnh nào được ghi lại , thì bạn có thể làm

rm ~/.bash_history
ln -s /dev/null ~/.bash_history

Lưu ý rằng phương thức đầu tiên sẽ chỉ có hiệu lực trong một phiên duy nhất, trong khi phương thức thứ hai sẽ dừng ghi nhật ký lệnh cho tất cả các phiên trong tương lai.


1

Tôi nhận ra điều này đã có một câu trả lời được chấp nhận, nhưng đây là cách tôi đã thực hiện nó từ những năm 80. Đó là một cách tuyệt vời để ẩn dấu vết của bạn và đó là một cách tiếp cận nhiều giai đoạn. Đối với hầu hết các phần của nó không được chú ý trừ khi một người thực sự chú ý. Đây là cách nó được thực hiện.

Mở terminal / shell / session và làm:

 chmod 444 ~/.bash_history

thoát khỏi shell mở terminal / shell / session và làm: Dưới đây là một số cách sáng tạo để xóa lịch sử vĩnh viễn

1:

 vi ~/.bash_history
 9999999 dd
 <esc>wq!

2 (tạo lịch sử giả)

 sudo echo "which ls" > ~/.bash_history
 sudo echo "cd ~/;ls" >> ~/.bash_history

sau đó cho các biện pháp tốt:

 chmod 444 ~/.bash_history

thoát khỏi vỏ

mở một vỏ mới và gõ

 history

Điều làm cho nó ít được chú ý hơn là nếu một người thực hiện một ls -ratl, ~ / .bash_history cuối cùng sẽ biến mất trong danh sách danh sách thư mục. Nó sẽ không hiển thị như một liên kết sẽ thu hút sự chú ý không cần thiết. Hầu hết mọi người không làm một -a trên thư mục gốc của họ, điều này rất hữu ích khi muốn thi đua.

Nhược điểm của phương pháp này là bạn mất khả năng quay lại và lấy lại lịch sử của mình. tệp ~ / .bash_history thực tế cũng có thể kết thúc ở đầu danh sách thư mục, vì nó có thể kết thúc bằng một ngày sửa đổi thực sự cũ theo thời gian, điều này có thể dẫn đến việc phát hiện ra rằng có gì đó không ổn.


nếu bạn sử dụng 9999999 ddđể xóa tất cả các dòng trong tập tin sau đó :%d, :1,$dhoặc dGcông việc tốt hơn nhiều
phuclv

0

1) Chạy sh; điều này sinh ra một lớp vỏ tro, không ghi lại lịch sử. Chỉnh sửa từ đó

2) Thêm dòng HISTCONTROL=ignorebothvào .bashrcvà thực hiện exec bashđể thay thế vĩnh viễn lớp vỏ hiện tại bằng lớp vỏ được khởi tạo lại, sau đó thực hiện tất cả các lệnh bạn không muốn đăng nhập với khoảng trắng ở đầu.


0

vì tôi không thể bình luận nào, sẽ thêm ý kiến ​​của tôi dưới dạng câu trả lời:

man history sẽ trả lời tất cả

Câu trả lời cho # 1 là lịch sử là trên bộ nhớ. history -ađể lưu vào tập tin ngay lập tức. history -wcũng sẽ tiết kiệm nhưng có thể gây rối cho các phiên khác.

câu trả lời # 2 : history -a, gedit, xóa các dòng bạn muốn,history -r


0

Lịch sử không được lưu cho đến khi bạn đăng xuất khỏi vỏ. Hãy thử đăng xuất khỏi shell và sau đó xem lại .bash_history. Lịch sử chỉ huy nên ở đó.


Chỉnh sửa như đề xuất Đủ tốt bây giờ?
Kẻ đánh cắp sét
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.