Thiết bị đầu cuối 'chế độ ẩn danh'?


230

Tôi sử dụng Terminal rất nhiều và đôi khi tôi đang chạy các lệnh, đó không phải là thứ tôi không muốn người khác nhìn thấy, nhưng nhiều lệnh hơn nếu tôi vô tình bấm vào và vô tình thực thi sẽ gây ra nhiều rắc rối.

Vì vậy, tôi tự hỏi liệu có, hoặc tôi có thể tạo ra một loại 'chế độ ẩn danh' nào đó cho phép tôi, khi thực hiện một lệnh nào đó, dừng ghi lại lịch sử của tôi và sau đó chỉ bắt đầu ghi sau khi tôi thực hiện bắt đầu ghi lại lịch sử lệnh và thoát 'chế độ ẩn danh', hoặc tôi chỉ cần khởi động lại Terminal?

Bởi vì sau này tôi thấy mình tiếp tục và gỡ bỏ mọi thứ khỏi mình .bash_history, khi mọi thứ sẽ dễ dàng hơn nếu tôi có thể dừng ghi âm ở đó ngay từ đầu, hoặc ít nhất là để nó cố gắng ghi lại nó ở một nơi nào đó mà nó sẽ không ở đó được phép, và cuối cùng sẽ không ghi lại nó.


6
Chà, có lẽ bạn đang hoang tưởng rằng lịch sử của bạn sẽ được người khác đọc?
Sparhawk

6
@Sparhawk: Chà, đó là một phần, và bên tôi không muốn vô tình thực hiện một lệnh bảo trì có thể gây chết người khi tôi sẽ chỉ trong tương lai! : D

19
Chỉ cần thêm vào, bạn không cần phải tự biện minh: "đó không phải là điều tôi không muốn người khác nhìn thấy" . Đó cũng là một lý do hoàn toàn hợp lệ với tôi. (Đặc biệt là trong thời đại và thời đại này, nơi mọi người cố gắng khiến bạn trông có lỗi vì có "những điều cần che giấu")
ereOn 19/05/2015

2
Nếu bạn mở hai tab, làm công cụ trong cái đầu tiên, làm công cụ trong cái thứ hai, sau đó đóng cái thứ hai TRƯỚC cái thứ nhất, chỉ có lịch sử của cái đầu tiên dường như được viết .bash_history. (Thiết bị đầu cuối bị hỏng Ubuntu 15.04, may mắn đây là USB trực tiếp.)
Hitechcomputergeek

1
Xem câu hỏi này trên serverfault
Luc M

Câu trả lời:


265

Chạy một lệnh mà không đưa nó vào lịch sử:

Đơn giản chỉ cần đặt một khoảng trắng trước lệnh. Bash sẽ bỏ qua các lệnh với một không gian được chuẩn bị trước:

Thí dụ: Spaceecho "Some secret text"

Lưu ý: Điều này chỉ hoạt động nếu HISTCONTROLbiến được đặt thành ignorespacehoặc ignoreboth.


Tạm thời tắt lịch sử:

  • Chạy Spaceset +o historyhoặc Spaceshopt -uo historyđể vô hiệu hóa lịch sử.
  • Chạy set -o historyhoặc shopt -so historyđể kích hoạt lại.

Vô hiệu hóa lịch sử cho phiên hiện tại (sẽ không nhớ bất kỳ lệnh nào từ phiên):

unset HISTFILE

Lưu ý: Bạn sẽ có thể thấy các lệnh nhấn Upcho đến khi bạn đóng thiết bị đầu cuối.


Xóa một lệnh khỏi lịch sử:

Chạy Spacehistory | grep "part of your secret command"

Nó sẽ hiển thị một danh sách các lệnh đã chạy trước đó, ở định dạng này:

casa@portátil:~$  history | grep pkill
  302  pkill $$
  467  pkill gone-cal
  468  pkill actionaz
  500  pkill chrome
  550  pkill super

Chọn số mục ở bên trái của lệnh. Bạn có thể sao chép nó với Ctrl+ Shift+C

Chạy Spacehistory -d <number>ở đâu <number>là số mục để loại bỏ mục.
Bạn có thể dán số đó với Ctrl+ Shift+V


Câu trả lời thú vị khác:


7
Nếu bạn sử dụng history -dđể xóa một dòng, điều này sẽ xóa nội dung của dòng, nhưng bạn không bao giờ có thể xóa thực tế bạn đã chạy history -d(trừ khi bạn sử dụng lần đầu set +o historytrước khi chạy history -d)
AJFaraday

1
Nó chỉ khiến tôi nhớ về logic siêu lệnh, đó là tất cả;)
AJFaraday

4
(OT) Injifts là một tài liệu pháp lý ngăn mọi người xuất bản một cái gì đó. Một siêu lệnh cũng ngăn họ xuất bản thực tế họ đã bị từ chối khả năng xuất bản. Một số lập luận logic hỏi liệu họ có thể xuất bản rằng họ đã bị từ chối khả năng xuất bản một số thông tin. Sau đó, nó trở thành một cuộc tranh luận theo chu kỳ.
AJFaraday

1
@Helio Tôi nghĩ rằng tốt hơn là người dùng nên biết cách sao chép "phù hợp" - đặc biệt nếu họ vô tình đi và chọn một số văn bản. Tôi không chắc làm thế nào để làm không gian, có thể làm rõ hơn rằng không gian ở đó? [Không gian] có vẻ hơi vụng về với tôi ...
Tim

2
Cách unset HISTFILEtiếp cận cũng hoạt động hồi tố cho tất cả các lệnh chưa được viết .bash_history.
kasperd

40

Bạn chỉ có thể xóa lịch sử của một phiên cuối cụ thể bằng cách thêm lệnh history -cwsau khi làm việc.

Không đóng thiết bị đầu cuối trước khi đưa ra lệnh này.


Điều này sẽ không loại bỏ tất cả lịch sử?
Helio

6
Điều này sẽ chỉ xóa lịch sử của phiên thiết bị đầu cuối cụ thể đó.
Moithil Biswas

28

shopt -uo history nên làm điều đó tốt nhất

Việc loại bỏ các biến HISTFILE(et al) sẽ không dừng Uplịch sử của bạn được ghi lại, nó sẽ không đẩy nó vào đĩa. Điều này có thể hoặc không thể là một điều tích cực cho bạn, nhưng khi bạn đề cập đến nó, tôi đoán bạn muốn một cái gì đó tốt hơn. Thay đổi shoptcài đặt lịch sử sẽ ngăn toàn bộ cơ chế lịch sử kích hoạt.

Bạn có thể bật đăng nhập trở lại với shopt -so history( -s-uđược đặt và bỏ đặt tương ứng).

Lưu ý rằng chính lệnh có thể sẽ được ghi lại, vì vậy hãy thêm nó vào một khoảng trắng để dừng nó được thêm vào lịch sử trước khi bạn xóa biến.


17

Một cách khác để hủy shell hiện tại mà không cần đăng nhập vào tệp lịch sử là làm:

kill -9 $$

Điều này khiến bash (và có lẽ các shell khác cũng vậy) gửi tín hiệu SIGKILL đến chính nó, giết chết tại chỗ và ngăn không cho nó ghi bất cứ thứ gì vào đĩa.


7
aka 'Tự bắn vào đầu mình' :). Điều này có lợi thế là bạn không cần phải nhớ làm bất cứ điều gì trước khi viết lệnh.
Guido

3
Tôi sử dụng zsh với ghi lịch sử gia tăng, vì vậy tôi nghi ngờ điều này sẽ hoạt động trong trường hợp của tôi
Wayne Werner

13

Để tạm thời vô hiệu hóa lịch sử lệnh cho phiên hiện tại, bạn có thể tạm thời bỏ đặt biến môi trường HISTFILE.

unset HISTFILE

trong khi phiên hoạt động, bạn có thể truy cập vào lịch sử như bình thường, nhưng nó sẽ không được lưu vào đĩa.

Để đảo ngược trong cùng một phiên (tất cả các thay đổi sẽ được ghi lại)

HISTFILE=$HOME/.bash_history

1
Và có một cách dễ dàng trong phiên hiện tại để đảo ngược điều này, và làm cho nó tiếp tục?

@ParanoidPanda Tôi đã thêm một lệnh để hoàn nguyên trong phiên hiện tại.
Bruni

1
@ParanoidPanda: Tại sao bạn cần một lệnh để thiết lập HISTFILElại trong phiên hiện tại? Nếu bạn hoàn tác thay đổi (ngay cả sau khi chạy các lệnh bí mật), chúng sẽ được lưu vào lịch sử khi bạn thoát.
Helio

@Helio: Ồ, không, ý tôi là một lệnh sau đó sẽ bắt đầu ghi lại, nhưng không lưu các lệnh mà tôi không muốn nó lưu.

1
@ParanoidPanda, Helio dường như đã đúng về điều này khi lịch sử được lưu lại khi thoát. Tôi đã không xem xét điều đó.
Bruni

10

Bạn có thể sửa đổi các dòng lịch sử trong phiên shell hiện tại. Nếu bạn quay lại lịch sử (ví dụ với Uphoặc Ctrl+ P) và thay đổi một dòng mà không thực hiện nó , chỉ phiên bản sửa đổi của dòng sẽ được lưu. Bạn có thể sửa đổi nó theo bất kỳ cách nào bạn muốn; lựa chọn tốt sẽ bao gồm sử dụng Ctrl+ Uđể xóa hoàn toàn dòng hoặc sử dụng Esc#để đặt #ký tự nhận xét ở đầu.

Để bỏ lại phía sau một dòng mà không thực hiện nó, hãy nhớ không nhấn Return( Enter). Những gì tôi làm là trở về dòng mới nhất trong lịch sử thông qua Esc>.

(Thay vì Esctheo sau >, trong hầu hết các thiết bị đầu cuối, bạn có thể giữ Altvà nhấn >; tương tự với Esc#đề xuất ở trên.)

Lưu ý: Bạn không thể sửa đổi vĩnh viễn các mục từ các phiên trước theo cách này. Những thay đổi đó sẽ không được áp dụng HISTFILEvào cuối phiên.


6

Bạn cũng có thể làm cho .bash_history chỉ đọc. Tôi sẽ làm trống các tập tin đầu tiên và sau đó làm:

 chattr +i .bash_history

5

Bạn có thể thực thi các lệnh nhạy cảm trong một phiên màn hình, sau đó hủy phiên khi bạn hoàn thành.

Thay phiên, bạn có thể giữ phiên màn hình đó sống nhưng tách ra và chỉ truy cập vào khi bạn thực sự muốn có thể lên mũi tên theo các lệnh nguy hiểm khác.


1

Cá nhân tôi sử dụng mkshvà shell này theo mặc định không có tệp lịch sử. Điều đó có nghĩa bạn có thể khởi động vỏ thay thế chẳng hạn như mkshhay dash(mà đi kèm theo mặc định bằng cách này) để chạy các lệnh mà bạn không muốn người dùng để xem, và thoát một lần thực hiện. bashlịch sử sẽ chỉ ghi lại rằng bạn đã đưa ra vỏ thay thế và đó là nó.


1

Bạn cũng có thể sử dụng bộ ghép kênh đầu cuối như tmux, screen. Vì vậy, dưới tmuxhoặc screenlịch sử sẽ không được lưu.

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.