Bin dan folder lain yang dipindahkan! Bagaimana cara mendapatkannya kembali?

13

Saya tidak sengaja memindahkan semua folder dari root ke subfolder. ( /bin, /etc, /home, /lib, /usr... semua pindah) Satu-satunya yang tidak dipindahkan, karena mereka digunakan, adalah /bak, /boot, /dev, /proc, /sys.

Sekarang, perintah apa pun yang saya coba jalankan tidak akan terjadi. Saya selalu mendapatkan "Tidak ada file atau direktori".

Saya terhubung melalui ssh dan melalui ftp, tetapi saya tidak dapat memindahkan file melalui ftp, karena login SU langsung dinonaktifkan. Saya juga memiliki akses ke server yang sebenarnya jika saya perlu melakukan sesuatu langsung dari sana.

Saya berasumsi saya perlu mengedit file konfigurasi untuk mengetahui di mana menemukan /binfolder itu dan itu akan membantu saya mendapatkan akses lagi, tapi saya tidak tahu file mana yang akan atau bagaimana melakukannya (karena saya bahkan tidak dapat berlari chmoduntuk mengubah izin).

Apakah ada jalan keluar selain menginstal ulang?

Saya sedang mengerjakan versi CentOS lama.

Saya sangat baru di dunia Linux, karenanya tindakan ini dan pertanyaannya ...

Menelaos
sumber
Meskipun bukan solusi untuk masalah Anda, saya sarankan membaca ini: lug.wsu.edu/node/414 Situasi serupa tetapi ia benar-benar menghapus / bin.
stribika

Jawaban:

33

Jika Anda masih memiliki shell root, Anda mungkin memiliki kesempatan untuk memperbaiki sistem Anda. Mari kita mengatakan bahwa Anda pindah semua direktori umum ( /bin, /etc, /lib, /sbin, /usr- ini adalah orang-orang yang bisa membuat pemulihan sulit) di bawah /oops.

Anda tidak akan dapat mengeluarkan mvperintah secara langsung, bahkan jika Anda menentukan path lengkap /oops/bin/mv. Itu karena mvadalah terkait secara dinamis ; karena Anda telah memindahkan /libdirektori, mvtidak dapat berjalan karena tidak dapat menemukan perpustakaan yang merupakan bagian dari kodenya. Bahkan, ini lebih buruk dari itu: mvtidak dapat menemukan loader dinamis /lib/ld-linux.so.2 (nama dapat bervariasi tergantung pada arsitektur Anda dan varian unix, dan direktori bisa nama yang berbeda seperti /lib32atau /lib64). Oleh karena itu, sampai Anda telah memindahkan /libdirektori kembali, Anda perlu memanggil linker secara eksplisit, dan Anda perlu menentukan path ke perpustakaan yang dipindahkan. Inilah perintah yang diuji pada Debian squeeze i386.

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/i386-linux-gnu
/oops/lib/ld-linux.so.2 /oops/bin/mv /oops/* /

Anda mungkin perlu menyesuaikan ini sedikit untuk distribusi atau arsitektur lain. Misalnya, untuk CentOS pada x86_64:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib64
/oops/lib64/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /

Ketika Anda telah mengacaukan sesuatu /lib, ada baiknya memiliki kotak alat yang terhubung secara statis di sekitar Anda. Beberapa distribusi (saya tidak tahu tentang CentOS) menyediakan salinan Busybox yang terhubung secara statis . Ada juga selempang , shell mandiri dengan banyak perintah bawaan. Jika Anda memiliki salah satunya, Anda dapat melakukan pemulihan dari sana. Jika Anda belum menginstalnya sebelum fakta, sudah terlambat.

# mkdir /oops
# mv /lib /bin /oops
# sash
Stand-alone shell (version 3.7)
> -mv /oops/* /
> exit

Jika Anda tidak memiliki shell root lagi, tetapi Anda masih memiliki daemon SSH yang mendengarkan dan Anda dapat masuk secara langsung sebagai root over ssh, dan Anda memiliki salah satu dari kotak alat yang terhubung secara statis ini, Anda mungkin dapat melakukan ssh. Ini dapat bekerja jika Anda telah pindah /libdan /bin, tetapi tidak /etc.

ssh [email protected] /oops/bin/sash
[email protected]'s password:
Stand-alone shell (version 3.7)
> -mv /oops/* /

Beberapa administrator membuat akun alternatif dengan shell yang terhubung secara statis, atau membuat akun root menggunakan shell yang terhubung secara statis, hanya untuk masalah seperti ini.

Jika Anda tidak memiliki shell root dan belum melakukan tindakan pencegahan, Anda harus mem-boot dari Linux live CD / USB (semua itu akan dilakukan selama masih cukup baru untuk dapat mengakses disk dan sistem file Anda) dan pindahkan file kembali.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Gilles terima kasih. Anda telah memberikan beberapa informasi yang sangat berguna tentang apa yang harus saya perhatikan di masa depan.
Menelaos
Gilles terima kasih! Ini menyelamatkan saya. Saya telah menambahkan edit untuk env 64-bit linux. Dalam kasus saya, 64-bit CentOS 7
CompEng88
@ ComputerEngineer88 Terima kasih, tetapi ketika Anda melakukan pengeditan, harap jangan menambahkan spidol "EDIT" atau menambahkannya di akhir postingan yang bukan miliknya. Pertahankan alur teks. Posting memiliki riwayat edit jika orang ingin tahu apa yang ada di postingan sebelumnya. Ketika orang membaca posting secara normal, mereka tidak peduli kalau ada sedikit yang ditambahkan kemudian.
Gilles 'SANGAT berhenti menjadi jahat'
Betulkah? Saya selalu fokus pada suntingan. Berarti sesuatu yang baru dipelajari dan bagi saya itu yang paling penting. Semua sama - selama orang mendapat manfaat!
CompEng88
@ ComputerEngineer88 Saya memiliki refleks yang sama ketika saya mulai menggunakan Stack Overflow. Tetapi pada kenyataannya posting Stack Exchange dalam banyak hal lebih dekat ke artikel Wikipedia daripada posting di forum diskusi. Anda mengharapkan orang membaca posting forum segera setelah diposting, jadi masuk akal jika memiliki indikasi yang terlihat jika sudah diedit. Tetapi katakanlah seseorang melihat utas ini pada tahun 2027: mereka tidak akan peduli apakah paragraf telah ada sejak 2011 atau telah ditambahkan pada tahun 2019.
Gilles 'SEGERA berhenti menjadi jahat'
11

Anda mungkin dapat memulihkan tanpa me-reboot, jadi jangan reboot sampai Anda sudah mencoba beberapa hal lain karena itu tidak akan boot. Jika sesi SSH Anda masih terbuka cobalah ini:

  • Dari mana program dijalankan diatur menggunakan variabel $ PATH. Anda dapat menambahkan lokasi nampan baru Anda ke jalur dengan menjalankan export PATH="$PATH:/newpath/to/bin:/newpath/to/usr/bin". Anda mungkin perlu menambahkan direktori sbin yang sesuai juga. Anda juga dapat menjalankan program secara manual melalui jalur lengkapnya, /path/to/mv [from] [to]misalnya harus berfungsi bahkan jika mv berada di lokasi yang berbeda. Bagian yang sulit adalah bahwa sebagian besar perintah akan ingin mengakses perpustakaan umum dan Anda mengatakan telah /libdipindahkan sehingga Anda perlu mengatur variabel untuk tempat itu juga.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/newpath/to/lib/:/newpath/to/usr/lib

  • Setelah Anda dapat menjalankan beberapa perintah dasar, pindahkan barang-barang itu kembali! mv /path/to/subfolder/* /akan beres! Setelah semuanya kembali pada tempatnya, sistem seharusnya berperilaku normal.

Jika gagal, mem-boot APAPUN LiveCD dan memasang drive harus memungkinkan Anda untuk memindahkan folder kembali ke tempatnya. Anda tidak perlu menginstal ulang atau bahkan menggunakan distec livecd Anda, Anda hanya perlu memasang drive dan memindahkan folder kembali ke lokasi yang tepat pada disk. Banyak disk penyelamat berbasis linux yang khusus memberi Anda hanya beberapa alat konsol dasar untuk melakukan perbaikan semacam ini.

Caleb
sumber
Bekerja melalui SSH gagal, jadi saya mengunduh liveCD dan saya mencoba menyelesaikannya. Saya di grub dan mencoba me-mount drive, tetapi tidak membiarkan saya karena kernel tidak dimuat. dan tidak dapat melihat jalan yang tepat dari jalan yang ada jelas membuat ini sulit ...
Menelaos
1
Boot untuk hidup, pasang disk Anda, pindahkan kembali ke tempat semestinya, reboot ke sistem Anda ... dan semoga sukses.
Caleb
2
Tidak cukup untuk mengatur LD_LIBRARY_PATH, Anda juga perlu mengaktifkan loader dinamis secara eksplisit, misalnya LD_LIBRARY_PATH=/newpath/to/lib /newpath/to/lib/ld-linux.so.2 /newpath/to/bin/mv.
Gilles 'SANGAT berhenti menjadi jahat'
4

Anda harus dapat me-reboot komputer dengan CD instalasi dalam mode pengguna tunggal, me-mount sistem file root dan memindahkan file kembali ke Linux. Saya tidak tahu banyak centos, tapi itu seperti RHEL, jadi ini harus bekerja.

Jamess
sumber
Terima kasih. Saya mengunduhnya saat kita bicara. Apakah ada bedanya jika itu live cd atau seluruh DVD instalasi?
Menelaos
@Menelaos: Anda tidak ingin menginstal, Anda menginginkan sesuatu yang dapat Anda jalankan secara langsung untuk solusi ini. Beberapa disk instalation memiliki versi live, tetapi beberapa hanya ingin langsung tidak bisa. Beberapa memang memiliki mode "penyelamatan" yang sebenarnya Anda inginkan, tetapi ada juga disk penyelamat linux khusus. Itu tidak harus menjadi distro Anda, itu hanya harus menjadi sesuatu yang dapat me-mount sistem file linux dan memindahkan folder kembali. Lihat jawaban saya.
Caleb
Lihatlah sysresccd.org untuk melihat salah satu CD cadangan jika Anda suka. Ia memiliki dokumentasi yang luas untuk mengetahui cara menggunakannya. Membantu menggunakannya untuk menyelesaikan masalah ini mungkin sulit di forum ini dan di luar waktu saya yang tersedia. Jika tidak, CD centos akan membantu. Live CD terbaru mungkin atau mungkin tidak berfungsi ... Jadi dengan mengingat masalah-masalah ini, Anda harus selalu menyimpan media instalasi / iso versi yang Anda instal. Juga buat cadangan seluruh sistem file.
Jamess
2

Terima kasih banyak untuk Gilles, 5 tahun kemudian dan posting Anda masih menyelamatkan hari saya, jika tidak seminggu.

Saya bermaksud untuk memindahkan konten dari subfolder ke folder saat ini tetapi alih-alih mv sub/* ., saya melakukannya mv sub /* ., jadi saya memindahkan semuanya ke folder saat ini. Untungnya saya menemukan jawaban ini, dan dapat memperbaiki mesin saya dengan relatif mudah. Namun, saya harus menyesuaikan sedikit perintah karena saya bekerja pada mesin x86_64 yang menjalankan Ubuntu 16.04. Saya ingin meninggalkan instruksi di sini, kalau-kalau ada yang berjuang:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/x86_64-linux-gnu
/oops/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /
Ktipr
sumber
0

Saya ingin menambahkan beberapa perintah untuk dilakukan setelah Anda menerapkan jawaban Ktipr untuk sistem modern (mesin x86_64 menjalankan Unix), saya tidak bisa mendapatkan direktori "dll" yang dipindahkan dengan mv karena ia menunjukkan kesalahan

Error : Directory not empty

jadi saya harus menggunakan

rsync -a source_file target_location

untuk memastikan bahwa saya bisa mendapatkan kembali semuanya. Jika Anda belum menginstalnya, Anda harus menginstalnya terlebih dahulu.

Rishabh Gupta
sumber