Saya tidak sengaja mengetik kata sandi ke baris perintah bash

189

Saya tidak sengaja mengetik kata sandi saya ke baris perintah bash, salah mengira Last login: ...baris Wrong password(saya sedang terburu-buru). Apa yang harus saya lakukan untuk menutupi jejak saya?

Apa yang saya lakukan adalah mengedit .bash_historydan menghapus baris yang menyinggung (harus login kembali satu kali untuk melihat kata sandi muncul di file sehingga saya bisa menghapusnya, dan login kembali untuk melihatnya menghilang dari sejarah yang tersedia di bawah tombol UPARROW).

Apakah ada tempat lain di mana histori perintah dapat disimpan? Sistem ini adalah CentOS 6.5.

MaDa
sumber
59
Ubah saja kata sandi :)
gronostaj
96
Mengubah kata sandi tidak sesederhana itu ... Saya perlu meminta admin untuk menginstal ulang kunci publik baru saya di 15 server yang berbeda - dan pria itu seperti /dev/null.
MaDa
71
Jika Anda tidak dapat mengubah kata sandi dengan mudah kapan saja, maka Anda mungkin memiliki celah keamanan yang serius. Apa yang akan Anda lakukan ketika seseorang benar-benar mendapatkan kata sandi Anda? Apakah Anda punya sarana untuk segera mencabut akses sistem?
gronostaj
42
Anda dapat mengubah kata sandi dari kunci ssh tanpa mengubah kunci: ssh-keygen -f id_rsa -p.
jwg
6
Hanya ingin menyebutkan bahwa, setidaknya di bawah login Windows jaringan, Anda disemprot. Admin (di beberapa menara server yang tinggi) default adalah untuk merekam semua upaya login, dan tentu saja nama pengguna adalah teks-bersih. Yang harus dilakukan beberapa orang giat adalah mencari string bukan-nama-pengguna dan menghubungkannya dengan nama pengguna berikutnya yang valid (atau upaya masuk berikutnya pada mesin yang sama). Dan tidak ada cara sederhana untuk menghapus file log admin itu. Jadi, Anda benar-benar harus mengubah kata sandi Anda.
Carl Witthoft

Jawaban:

184

Anda dapat menghapus hanya garis yang menyinggung dari bashriwayat, alih-alih menghapus seluruh riwayat. Cukup hapus baris dengan -dbendera, lalu simpan (tulis) riwayat baru dengan -wbendera:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352
$ history -w
dotancohen
sumber
1
Ketahuilah bahwa ini tidak berfungsi jika Anda menyetel "PROMPT_COMMAND = history -a". Dengan ini di tempat perintah dengan kata sandi Anda segera ditulis ke .bash_history Anda ketika prompt ditampilkan setelah perintah berakhir. Anda harus mengedit .bash_history Anda untuk menghapusnya.
benrifkah
1
Juga perhatikan bahwa jika baris ditulis dalam file hostory, dan kemudian beberapa shell (terminal windows) telah dibuka, SEMUA shell tersebut akan memilikinya dalam sejarah di sana! Anda harus menghapusnya dari semua kerang itu, ATAU setidaknya dari sejarah TERAKHIR yang Anda tutup! Lebih baik mendapatkannya sebelum shell yang menggunakannya ada. Sejarah ketika berhadapan dengan banyak kerang bisa menjadi mimpi buruk.
anthony
121

Ada dua bagian untuk ini:

  • bashmenyimpan riwayat dalam file ~/.bash_historyyang, secara default, ditulis di akhir sesi
  • yang historyyang disimpan dalam memori

Agar aman, Anda harus menghapusnya dari sesi:

history -c

dan pangkas file histori sesuai kebutuhan:

> ~/.bash_history

Jika sesi Anda mengetik kata sandi masih terbuka, maka cara lain untuk menutupi jejak Anda adalah dengan mengatur HISTFILEvariabel ke perangkat nol sehingga riwayat tidak akan ditulis ~/.bash_historyketika sesi keluar:

export HISTFILE=/dev/null
devnull
sumber
205
Hei, lihat, ini admin!
Raystafarian
5
Pun tidak bermaksud, maaf :) Saya tidak melihat nick Anda ketika saya menulis komentar saya.
MaDa
7
Menjadi paranoid (namun karena alasan tertentu masih belum mengubah kata sandi Anda) bukankah seharusnya Anda shredfile atau menimpanya berkali-kali?
kojiro
1
@ MaDa Tidak masalah. Saya bahkan menambahkan cara lain dalam jawaban untuk membawa nick saya ke dalam gambar.
devnull
5
Pengaturan HISTFILE=sudah cukup. Dari bash(1): Jika tidak disetel, riwayat perintah tidak disimpan ketika shell keluar.
Lekensteyn
23

Karena bash (setidaknya semua versi historis dan saat ini yang saya ketahui) tidak secara otomatis menyimpan histori sampai Anda keluar, strategi yang secara umum berlaku ketika Anda mengetikkan perintah yang ingin Anda pastikan tidak pernah disimpan adalah dengan segera mengetik:

kill -9 $$

Ini membunuh shell dengan SIGKILL, yang tidak dapat ditangkap, sehingga shell tidak memiliki cara untuk menyimpan apa pun saat keluar.

Sebagian besar pendekatan lain melibatkan scrubbing setelah fakta (yaitu setelah data telah mencapai disk), yang memiliki lebih banyak kesempatan untuk kesalahan (hilang salinan), terutama jika sistem mungkin menggunakan btrfs atau serupa.

R ..
sumber
2
1, bukan hanya lebih banyak kesempatan untuk kesalahan, itu mungkin bahkan dapat dipulihkan tergantung pada apakah / berapa banyak perintah dieksekusi setelah
Cruncher
Kehilangan kata "otomatis"? Karena dotancohen telah menunjukkan cara untuk menyelamatkan sejarah tanpa keluar dari shell.
Ben Voigt
3
Shell dapat dikonfigurasi untuk menyimpan histori setelah setiap perintah dieksekusi, bukan pada saat keluar.
Nick Matteo
1
+1 Inilah yang ingin saya rekomendasikan! Selain rm ~/.bash_history~untuk menghapus file cadangan dalam kasus OP ketika sudah disimpan
Tomas
Ketahuilah bahwa ini tidak berfungsi jika Anda menyetel "PROMPT_COMMAND = history -a". Dengan ini di tempat perintah dengan kata sandi Anda segera ditulis ke .bash_history Anda ketika prompt ditampilkan setelah perintah berakhir. Anda harus mengedit .bash_history Anda untuk menghapusnya.
benrifkah
11

Setelah Anda mengetik sesuatu yang tidak ingin disimpan dalam riwayat secara tidak sengaja, Anda dapat mengetik: unset HISTFILE

Bash tidak akan tahu di mana menyimpan histori ketika Anda logout, jadi secara efektif ini akan menonaktifkan histori logging untuk seluruh sesi.

mtak
sumber
Ketahuilah bahwa ini tidak berfungsi jika Anda menyetel "PROMPT_COMMAND = history -a". Dengan ini di tempat perintah dengan kata sandi Anda segera ditulis ke .bash_history Anda ketika prompt ditampilkan setelah perintah berakhir. Anda harus mengedit .bash_history Anda untuk menghapusnya.
benrifkah
11

Trik favorit saya untuk ini adalah dengan menekan panah atas, backspace atas perintah, ketik sesuatu (mungkin tidak perlu), tekan panah bawah, ketik "ls", dan tekan enter. Rasanya benar-benar tipu, tetapi itu benar-benar berfungsi. Menemukan ini ketika saya merasa terganggu setelah mengedit perintah yang salah dalam sejarah saya dan kemudian merusaknya dengan tidak menekan ctrl-c untuk membatalkan pengeditan. Saya kira bash mendukung sejarah revisionis. ;-)

$ passw0rd
$ <up arrow><backspace x8>cd<down arrow>echo hi
$ history|tail -3

Seperti:

$ passw0rd
passw0rd: command not found
$ echo hi
hi
$ history|tail -3
 2445* cd
 2446  echo hi
 2447  history|tail -3
$ 
Mark Jerde
sumber
Itu aneh . Salah satu kelemahannya adalah sepertinya Anda tahu sejarah yang diedit, jadi mungkin ada beberapa cara untuk mengembalikan versi yang lama?
MadTux
@ MadTux - Benar-benar, tetapi .bash_history hanyalah file teks biasa. Jadi Anda bisa melakukan contoh di atas, keluar, dan terhubung kembali. Saat Anda melihat konten lengkap file .bash_history, tidak ada yang membedakannya dari jika Anda baru saja menjalankan "cd", jadi jejaknya bersih.
Mark Jerde
Ketahuilah bahwa ini tidak berfungsi jika Anda menyetel "PROMPT_COMMAND = history -a". Dengan ini di tempat perintah dengan kata sandi Anda segera ditulis ke .bash_history Anda ketika prompt ditampilkan setelah perintah berakhir. Anda harus mengedit .bash_history Anda untuk menghapusnya.
benrifkah
10

Tambahan untuk jawaban lain, mungkin relevan bahwa kata sandi juga ditemukan dalam buffer gulir terminal - riwayat teks yang ditampilkan - sekarang, dan, lebih banyak masalah, mungkin pada hard disk, jika terminal emulator tidak menyimpan sejarah ke disk. Ini terjadi di konsole KDE jika ukuran riwayat diatur ke "scrollback tidak terbatas", untuk tidak pernah membuang output apa pun.

Volker Siegel
sumber
6

Dengan $<space> command, sebuah perintah tidak ditambahkan ke histori, terkadang berguna

$  history | grep mywierdgrep
$ history | grep mywierdgrep
 2005  history | grep mywierdgrep
jris198944
sumber
2
Meskipun menarik, tidak jelas bagaimana ini berguna dalam skenario yang dijelaskan. Apakah Anda menyarankan agar setiap kata sandi harus dimulai dengan spasi?
Ben Voigt
1
Tidak, apa yang dia sarankan adalah bahwa dengan ini, setiap baris yang Anda ketikkan yang tidak ingin Anda komit dengan sejarah, harus diketik dengan spasi terdepan. misalnya: "ls" menjadi "ls" dan baris itu tidak pernah ditampilkan dalam riwayat atau dalam daftar panah atas sesi Anda.
Bryan C.
4
Perhatikan bahwa trik ruang terdepan ini hanya berfungsi jika $ HISTCONTROL berisi ignorespace.
Bernd Jendrissek
2
@ jris198944 Menyediakan kata sandi melalui argumen baris perintah berpotensi mengeksposnya kepada siapa pun di sistem yang menjalankan ps.
jamesdlin
2
Lagi pula, walaupun trik ini berguna jika Anda berencana ke depan, ini tidak membantu skenario asli di mana seseorang secara tidak sengaja memasukkan kata sandi pada baris perintah.
jamesdlin
4

Alternatif lain untuk menghindari penyimpanan ke file histori (sebelum Anda logout) adalah dengan

chmod 400 ~/.bash_history 

dan kemudian keluar. Hentikan riwayat yang dituliskan ke file (karena file tersebut hanya baca) sehingga seluruh sesi bash dibuang dan riwayat sebelumnya dipertahankan.

Login lagi dan setel ulang izin ke 600(atau tidak, tergantung seberapa paranoid Anda!).

Adam
sumber
1

Saya melihat berulang kali disebutkan

Ketahuilah bahwa ini tidak berfungsi jika Anda telah menyetel "PROMPT_COMMAND = history -a" [[]] Anda harus mengedit .bash_history Anda untuk menghapusnya.

Bagian pertama sudah pasti benar, tetapi Anda tidak perlu menggunakan mengedit .bash_history secara manual untuk memperbaikinya. Jika Anda menggabungkan dua perintah pada satu baris, itu berfungsi dengan baik:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352 ; history -w
Floris Kruisselbrink
sumber
Bisakah Anda menjelaskan apa yang membuat metode ini berfungsi?
Kamil Maciorowski
PROMPT_COMMAND hanya dijalankan sebelum menampilkan command-prompt berikutnya. Masalah dengan memasukkan perintah -d dan -w pada baris terpisah adalah bahwa PROMPT_COMMAND akan mengeksekusi histori -a perintah di antaranya. Jika Anda mengeksekusi kedua -d dan -w pada satu commandline, itu hanya akan dieksekusi sesudahnya
Floris Kruisselbrink
0

Banyak jawaban di sini mencoba untuk menghapus perintah yang dimaksud dari riwayat sesi curren't bash sebelum ditulis ke $HISTFILE(~ / .bash_history secara default). Namun, jika Anda telah mengatur PROMPT_COMMAND=history -a perintah dengan kata sandi Anda segera dituliskan ke Anda $HISTFILEketika prompt ditampilkan setelah perintah berakhir. Anda harus mengedit Anda $HISTFILEuntuk menghapusnya.

Pengaturan ini biasanya digunakan untuk menyisipkan perintah dari beberapa sesi bash terbuka .

benrifkah
sumber
-3

Anda juga ingin memeriksa log syslog. Login yang tidak valid umumnya akan login ke syslog.

/ var / log / messages atau yang setara untuk OS Anda.

bcarroll
sumber
1
Masalahnya bukan dia salah memasukkan kata sandi, dia sudah masuk dan memasukkan kata sandinya ke prompt dan tekan enter. Ini tidak akan muncul di file pesan.
MaQleod