Đã chuyển bin và các thư mục khác! Làm thế nào để lấy lại chúng?


13

Tôi vô tình chuyển tất cả các thư mục từ thư mục gốc sang thư mục con. ( /bin, /etc, /home, /lib, /usr... tất cả di chuyển) Những người duy nhất mà không được di chuyển, vì họ đã được sử dụng, là /bak, /boot, /dev, /proc, /sys.

Bây giờ, bất kỳ lệnh nào tôi cố gắng thực hiện sẽ không xảy ra. Tôi liên tục nhận được "Không có tập tin hoặc thư mục như vậy".

Tôi được kết nối qua ssh và qua ftp, nhưng tôi không thể di chuyển tệp qua ftp, vì đăng nhập SU trực tiếp bị vô hiệu hóa. Tôi cũng có quyền truy cập vào máy chủ thực tế nếu tôi cần làm gì đó trực tiếp từ đó.

Tôi giả sử tôi sẽ cần chỉnh sửa tệp cấu hình để cho biết nơi tìm /binthư mục và điều đó sẽ giúp tôi có quyền truy cập lại, nhưng tôi không biết tệp nào sẽ hoặc cách thực hiện (vì tôi thậm chí không thể chạy chmodđể thay đổi quyền).

Có cách nào khác ngoài việc cài đặt lại không?

Tôi đang làm việc trên một phiên bản cũ của CentOS.

Tôi cực kỳ mới đối với thế giới Linux, vì vậy hành động này và câu hỏi ...


Mặc dù không phải là giải pháp cho vấn đề của bạn, tôi khuyên bạn nên đọc bài này: lug.wsu.edu/node/414 Tình huống tương tự nhưng anh ấy thực sự đã xóa / bin.
stribika

Câu trả lời:


33

Nếu bạn vẫn còn một vỏ gốc, bạn có thể có cơ hội sửa chữa hệ thống của mình. Hãy nói rằng bạn đã chuyển tất cả các thư mục chung ( /bin, /etc, /lib, /sbin, /usr- đó là những cái mà có thể làm phục hồi khó khăn) dưới /oops.

Bạn sẽ không thể phát mvlệnh trực tiếp, ngay cả khi bạn chỉ định đường dẫn đầy đủ /oops/bin/mv. Đó là bởi vì mvđược liên kết động ; bởi vì bạn đã di chuyển /libthư mục, mvkhông thể chạy vì nó không thể tìm thấy các thư viện tạo thành một phần của mã. Trên thực tế, nó thậm chí còn tệ hơn thế: mvkhông thể tìm thấy trình tải động /lib/ld-linux.so.2 (tên có thể thay đổi tùy theo kiến ​​trúc và biến thể unix của bạn và thư mục có thể là một tên khác như /lib32hoặc /lib64). Do đó, cho đến khi bạn chuyển /libthư mục trở lại, bạn cần gọi trình liên kết một cách rõ ràng và bạn cần chỉ định đường dẫn đến các thư viện đã di chuyển. Đây là lệnh được thử nghiệm trên Debian bóp i386.

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

Bạn có thể cần điều chỉnh điều này một chút cho các bản phân phối hoặc kiến ​​trúc khác. Ví dụ: đối với CentOS trên x86_64:

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

Khi bạn đã làm hỏng một cái gì đó /lib, nó sẽ giúp có một hộp công cụ được liên kết tĩnh nằm xung quanh. Một số bản phân phối (tôi không biết về CentOS) cung cấp một bản sao Busybox được liên kết tĩnh . Ngoài ra còn có sash , một shell độc lập với nhiều lệnh được tích hợp. Nếu bạn có một trong những thứ này, bạn có thể phục hồi từ đó. Nếu bạn chưa cài đặt chúng trước khi thực tế thì đã quá muộn.

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

Nếu bạn không có shell root nữa, nhưng bạn vẫn có trình nghe SSH và bạn có thể đăng nhập trực tiếp dưới dạng root qua ssh và bạn có một trong các hộp công cụ được liên kết tĩnh này, bạn có thể có thể ssh in. có thể hoạt động nếu bạn đã di chuyển /lib/bin, nhưng không /etc.

ssh root@broken.example.com /oops/bin/sash
root@broken.example.com's password:
Stand-alone shell (version 3.7)
> -mv /oops/* /

Một số quản trị viên thiết lập một tài khoản thay thế với một vỏ được liên kết tĩnh hoặc làm cho tài khoản gốc sử dụng một vỏ được liên kết tĩnh, chỉ cho loại rắc rối này.

Nếu bạn không có vỏ gốc và chưa có biện pháp phòng ngừa, bạn sẽ cần phải khởi động từ CD / USB trực tiếp của Linux (mọi thứ sẽ hoạt động miễn là gần đây đủ để có thể truy cập vào đĩa và hệ thống tệp của bạn) và di chuyển các tập tin trở lại.


1
Cảm ơn bạn Gilles. Bạn đã cung cấp một số thông tin rất hữu ích về những gì tôi nên cẩn thận trong tương lai.
Menelaos

Cảm ơn Gilles! Điều này đã cứu tôi. Tôi đã thêm một chỉnh sửa cho env 64-bit linux. Trong trường hợp của tôi, CentOS 7 64 bit
CompEng88

@ ComputerEngineer88 Cảm ơn, nhưng khi bạn chỉnh sửa, vui lòng không thêm các dấu EDIT EDIT hoặc thêm chúng vào cuối bài đăng mà chúng không thuộc về. Giữ dòng chảy của văn bản. Bài viết có lịch sử chỉnh sửa nếu mọi người muốn biết bài đăng có chứa gì trước đó. Khi mọi người đọc bài viết bình thường, họ không quan tâm rằng một số bit đã được thêm vào sau đó.
Gilles 'SO- ngừng trở nên xấu xa'

Có thật không? Tôi luôn tập trung vào các chỉnh sửa. Có nghĩa là một cái gì đó mới đã được học và với tôi đó là điều quan trọng nhất. Tất cả đều giống nhau - miễn là mọi người được hưởng lợi!
CompEng88

@ ComputerEngineer88 Tôi đã có phản xạ tương tự khi tôi bắt đầu sử dụng Stack Overflow. Nhưng trên thực tế, một bài đăng Stack Exchange theo nhiều cách gần với một bài viết Wikipedia hơn là một bài đăng trên một diễn đàn thảo luận. Bạn mong đợi mọi người sẽ đọc các bài đăng trên diễn đàn ngay sau khi chúng được đăng, vì vậy sẽ rất có ý nghĩa nếu chúng được chỉnh sửa. Nhưng hãy nói rằng ai đó nhìn thấy chủ đề này vào năm 2027: họ sẽ không quan tâm liệu một đoạn đã ở đó từ năm 2011 hay đã được thêm vào năm 2019.
Gilles 'SO- ngừng trở nên xấu xa'

11

Bạn có thể có thể khôi phục mà không cần khởi động lại, vì vậy đừng khởi động lại cho đến khi bạn đã thử một số thứ khác vì nó sẽ không khởi động được. Nếu bạn vẫn mở phiên SSH, hãy thử các cách sau:

  • Nơi các chương trình được chạy từ được đặt bằng biến $ PATH. Bạn có thể thêm vị trí bin mới của bạn vào đường dẫn bằng cách chạy export PATH="$PATH:/newpath/to/bin:/newpath/to/usr/bin". Bạn có thể cần phải thêm các thư mục sbin tương ứng là tốt. Bạn cũng có thể chạy các chương trình theo cách thủ công thông qua đường dẫn đầy đủ của chúng, /path/to/mv [from] [to]ví dụ như sẽ hoạt động ngay cả khi mv ở vị trí khác. Phần khó khăn là hầu hết các lệnh sẽ muốn truy cập vào các thư viện phổ biến và bạn nói /libđã di chuyển nên bạn cần đặt một biến cho nơi đó cũng vậy.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/newpath/to/lib/:/newpath/to/usr/lib

  • Một khi bạn có thể thực hiện một số lệnh cơ bản, di chuyển các công cụ trở lại! mv /path/to/subfolder/* /sẽ theo thứ tự! Một khi mọi thứ trở lại đúng vị trí, hệ thống sẽ hoạt động bình thường.

Nếu thất bại, khởi động BẤT K Live LiveCD và gắn ổ đĩa sẽ cho phép bạn di chuyển các thư mục trở lại nơi chúng thuộc về. Bạn không cần phải cài đặt lại hoặc thậm chí sử dụng bản phát hành của mình, bạn chỉ cần gắn ổ đĩa và di chuyển các thư mục trở lại đúng vị trí trên đĩa. Rất nhiều đĩa cứu hộ dựa trên linux chuyên cung cấp cho bạn một vài công cụ điều khiển cơ bản để thực hiện loại sửa chữa này.


Làm việc thông qua SSH không thành công, vì vậy tôi đã tải xuống một đĩa CD trực tiếp và tôi đang cố gắng để mọi thứ hoạt động. Tôi đang ở trong grub và cố gắng gắn ổ đĩa, nhưng nó sẽ không cho phép tôi vì kernel không được tải. và không thể nhìn thấy đường đi chính xác của những con đường hiện có rõ ràng đang gây khó khăn cho điều này ...
Menelaos

1
Khởi động để sống, gắn đĩa của bạn, di chuyển mọi thứ trở lại vị trí thích hợp của chúng, khởi động lại hệ thống của bạn ... và chúc may mắn.
Caleb

2
Nó không đủ để thiết lập LD_LIBRARY_PATH, bạn cũng cần phải gọi trình tải động một cách rõ ràng, vd LD_LIBRARY_PATH=/newpath/to/lib /newpath/to/lib/ld-linux.so.2 /newpath/to/bin/mv.
Gilles 'SO- ngừng trở nên xấu xa'

4

Bạn sẽ có thể khởi động lại máy tính bằng đĩa CD cài đặt ở chế độ người dùng, gắn hệ thống tập tin gốc và di chuyển các tập tin trở lại trên Linux. Tôi không biết nhiều centos, nhưng nó giống như RHEL, vì vậy điều này sẽ hoạt động.


Cảm ơn bạn. Tôi đang tải nó khi chúng tôi nói chuyện. Liệu nó có làm nên sự khác biệt nếu đó là đĩa CD trực tiếp hoặc toàn bộ đĩa DVD cài đặt?
Menelaos

@Menelaos: Bạn không muốn cài đặt, bạn muốn một cái gì đó bạn có thể chạy trực tiếp cho giải pháp này. Một số đĩa instalation có phiên bản trực tiếp, nhưng một số chỉ muốn không ngay lập tức. Một số có chế độ "giải cứu" thực sự là những gì bạn muốn, nhưng cũng có những đĩa cứu hộ dành riêng cho linux. Nó không phải là bản phân phối của bạn, nó chỉ phải là thứ có thể gắn kết hệ thống tệp linux và di chuyển các thư mục trở lại. Xem câu trả lời của tôi.
Caleb

Nhìn vào sysresccd.org để xem một trong những đĩa CD cứu hộ nếu bạn thích Nó có tài liệu mở rộng để xem cách sử dụng nó. Giúp sử dụng nó để giải quyết vấn đề này có thể khó khăn trong diễn đàn này và ngoài thời gian có sẵn của tôi. Khác, CD centos sẽ giúp. CD trực tiếp mới nhất có thể có hoặc không hoạt động ... Vì vậy, hãy lưu ý các loại sự cố này, bạn nên luôn luôn giữ phương tiện cài đặt / iso của phiên bản bạn đã cài đặt. Cũng tạo một bản sao lưu của toàn bộ hệ thống tập tin.
Jamess

2

Cảm ơn rất nhiều đến Gilles, 5 năm sau và bài viết của bạn vẫn lưu ngày của tôi, nếu không phải là tuần.

Tôi có nghĩa là để di chuyển nội dung của một thư mục con vào thư mục hiện tại nhưng thay vì mv sub/* ., tôi đã làm mv sub /* ., vì vậy tôi đã chuyển mọi thứ vào thư mục hiện tại. May mắn thay, tôi đã tìm thấy câu trả lời này và có thể sửa máy của tôi một cách dễ dàng. Tuy nhiên, tôi đã phải điều chỉnh các lệnh một chút vì tôi đang làm việc trên máy x86_64 chạy Ubuntu 16.04. Tôi muốn để lại hướng dẫn ở đây, trong trường hợp bất cứ ai đang vật lộn:

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/* /

0

Tôi muốn thêm một vài lệnh để thực hiện sau khi bạn áp dụng câu trả lời của Ktipr cho các hệ thống hiện đại (máy x86_64 chạy Unix), tôi không thể nhận được thư mục "vv" khi di chuyển với mv vì nó hiển thị lỗi

Error : Directory not empty

vì vậy tôi phải sử dụng

rsync -a source_file target_location

để đảm bảo rằng tôi có thể lấy lại mọi thứ theo thứ tự. Nếu bạn chưa cài đặt nó, bạn sẽ cần cài đặt nó trước.

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.