Apa isi / bin / bash, dan apa yang harus saya lakukan jika saya tidak sengaja menimpa mereka

24

Saya tidak sengaja menimpa file / bin / bash dengan skrip bodoh yang ingin saya masukkan ke dalam folder / bin.

Bagaimana saya mendapatkan kembali isi file itu? Apakah ada cara saya dapat menemukan konten di web, dan cukup menyalinnya kembali? Apa pilihan saya di sini, mengingat terminal memberikan kesalahan ketika berbicara tentang "Terlalu Banyak Tautan Simbolik?"

Saya masih pendatang baru dalam hal semacam ini, dan saya menghargai semua bantuan yang bisa saya dapatkan.

Sunting: Saya lupa menyebutkan saya di Kali 2.2 Rolling, yang cukup banyak debian dengan beberapa fitur tambahan.

Sunting 2: Saya juga menghidupkan ulang mesin, karena saya tidak menyadari kesalahan saya sampai beberapa hari yang lalu. Itu membuat ini sedikit lebih sulit.

GarrukApex
sumber
9
Pesta dihapus? Cukup gunakan zsh :-) </troll>
Kevin
1
serverfault.com/questions/451528/… dan beberapa lainnya
skandigraun
fisik atau VM?
Ben Aveling
9
Untuk waktu berikutnya: jangan menaruh barang di direktori sistem . Jika Anda ingin skrip dan barang khusus, buat sendiri $HOME/.bindan tambahkan ke Anda PATHatau gunakan /usr/local/binjika Anda membutuhkannya untuk seluruh sistem. Atau, bahkan lebih baik lagi, membangun sebuah paket.
spektra

Jawaban:

33

bashadalah sebuah shell, mungkin shell sistem Anda, jadi sekarang hal-hal aneh terjadi, sementara bagian-bagian shell masih dalam memori. Setelah Anda logout atau reboot, Anda akan berada dalam masalah yang lebih dalam.

Jadi hal pertama yang harus Anda lakukan adalah mengganti cangkang Anda menjadi sesuatu yang aman. Lihat cangkang apa yang telah Anda instal

cat /etc/shells

Kemudian ganti shell Anda dengan salah satu shell lain yang terdaftar di sana, misalnya

chsh -s /bin/dash

Perbarui, karena Anda telah memulai ulang:

Anda beruntung bahwa saat ini proses booting tidak bergantung bash, jadi sistem Anda melakukan boot, Anda tidak bisa mendapatkan baris perintah. Tetapi Anda dapat memulai editor untuk mengedit /etc/passwddan mengubah shell di rootbaris dari /bin/bashke /bin/dash. Logout dan log in lagi. Hanya saja, jangan membuat perubahan lain dalam file itu, atau Anda dapat mengacaukan sistem Anda sepenuhnya.

Kemudian coba instal ulang bashdengan

apt-get --reinstall install bash

Jika semuanya berhasil, Anda dapat chshkembali ke bash.

Akhirnya: Saya pikir, Kali adalah distribusi yang sangat terspesialisasi, mungkin tidak cocok untuk orang yang secara tidak sengaja menimpa shell mereka. Karena kalimat ini disebut kasar dan kasar, saya harus menambahkan bahwa saya menulisnya berdasarkan pengalaman saya sendiri. Ketika saya masih muda, saya merusak sistem saya karena tidak ada yang mengatakan kepada saya untuk menghindari bermain-main sebagai root.

Filipos
sumber
3
@ dr01: Mengingat bagaimana bash melarikan diri bekerja, itu bisa jadi masalah kutipan yang salah tempat. Berpikir command > /bin/bash ...lawan command > (/bin/bash ...).
MSalters
7
Kalimat terakhir itu keras ... :)
James Reinstate Monica Polk
6
@MSalters Kutipan salah tempat dijalankan sebagai root . Itu dua kesalahan. Yang kedua, tentu saja, mencoba jaringan pipa rumit Anda sebagai root, bukan sebagai pengguna yang tidak memiliki hak istimewa.
derobert
12
@ JamesKPolk tidak, itu tidak keras sama sekali. Itu kebenaran sederhana. Kali adalah alat profesional yang dirancang untuk digunakan oleh para ahli . Mereka bahkan menyatakan sebanyak di halaman web mereka. Jika Anda bukan seorang ahli, Anda benar-benar tidak punya bisnis menjalankan Kali.
terdon
3
Kalimat terakhir tidak keras. Itu kebenaran yang sederhana.
Andrea Lazzarotto
65

Jangan matikan mesin Anda.

Apakah Anda masih memiliki shell yang berjalan? Apakah ini bash? Jika demikian, Anda baik-baik saja. (Tapi jangan lakukan ini lagi.)

Menjalankan:

sudo cp /proc/$$/exe /bin/bash

Voila, semuanya baik-baik saja.


Karena seseorang dalam komentar meragukan bahwa ini berfungsi:

[vagrant@localhost ~]$ cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
[vagrant@localhost ~]$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[vagrant@localhost ~]$ echo $0
-bash
[vagrant@localhost ~]$ sudo rm /bin/bash
[vagrant@localhost ~]$ bash
-bash: /bin/bash: No such file or directory
[vagrant@localhost ~]$ sudo su -
su: /bin/bash: No such file or directory
[vagrant@localhost ~]$ sudo cp /proc/$$/exe /bin/bash
[vagrant@localhost ~]$ bash
[vagrant@localhost ~]$ exit
[vagrant@localhost ~]$ sudo su -
[root@localhost ~]# logout
[vagrant@localhost ~]$ 
Wildcard
sumber
18
Bagaimanapun, setelah ini, disarankan untuk menginstal ulang bash dari distribusi Anda, misalnya untuk izin yang benar (beberapa pemburu rootkit dapat terkejut dengan perubahan di sana), juga untuk memulihkan tautan keras atau symlink (misalnya ke /bin/shatau rbash)
Giacomo Catenazzi
4
@ GiacomoCatenazzi, sebenarnya, metode ini mempertahankan izin — itu standar saat rootdijalankan cp. Namun, tautan keras adalah poin yang bagus.
Wildcard
1
Mesin dihidupkan ulang. Saya tidak dapat membuka shell normal, tetapi saya dapat mengedit konten melalui GUI. Seperti yang dikatakan sebelumnya, saya mendapatkan pesan kesalahan yang menyatakan "Gagal menjalankan proses anak / bin / bash. (Terlalu banyak level tautan simbolik)."
GarrukApex
5

Jika Anda bisa masuk, tetapi Anda tidak bisa membuka terminal atau mengakses shell, tetapi Anda dapat mengakses file melalui GUI, pergi ke /bin, cari file yang namanya diakhiri dengan sh(tetapi tidak .sh) dan jalankan satu (dengan mengklik dua kali) atau mengklik kanan). Secara khusus, cari yang berikut ini:

  • sh
  • dash
  • ash
  • ksh (atau kshdiikuti oleh angka; misalnya,  ksh93)
  • zsh
  • yash

atau, sebagai upaya terakhir,

  • tcsh atau
  • csh

Jika Anda dapat menjalankan shell, maka coba jawaban Philippos .

Pendekatan lain adalah mem-boot ke mode pengguna tunggal mengikuti instruksi ini tetapi tentukan init=/bin/sh(atau salah satu shell lainnya) sebagai gantinya init=/bin/bash.

Scott
sumber