Vô tình đổi tên / bin Trợ giúp!


39

Tôi có một trường hợp khẩn cấp, Linux và Bash mới bắt đầu ở đây và đã cố gắng viết một tập lệnh để đổi tên một số tệp. Vòng lặp vô tình đã đi lên con đường (chạy kịch bản trong một thư mục trong máy tính để bàn) và đổi tên /binđể /D_bin( D_là tiền tố tôi đã thêm) vì vậy bây giờ hệ thống không thể sử dụng /binnội dung, vì vậy không bash, không mvđổi tên, không có sudo... Các tập tin trong /D_binlà ok, không được đổi tên và có thể sao chép-dán chúng nhưng không thể tạo /binlại thư mục mà không cần bash. Hệ thống có vẻ ổn định nhưng rất ít thứ hoạt động và không có quyền truy cập vào các tệp trong Desktop.

Các thư mục /tương tự khác /lib /sbin /etcdường như cũng ổn, và màn hình đồ họa vẫn còn đó. Tôi sợ khởi động lại vì tôi không biết liệu nó có thể khởi động được không.

Có một shell trong root hoặc một cách để đổi tên /D_bintrở lại /bin? Cần giúp đỡ, làm việc rất quan trọng

Kịch bản tự tử của tôi: $:

#!/bin/bash
files=~/Desktop/folder_1/*

for j in $files
do
    cd $j
    for i in 10n*  #file names starting by 10n
    do
       find * -maxdepth 0 ! -path . -exec mv {} D_{} \;
    done
    cd ..
done

:( Cảm ơn!!!!


7
Bạn có thể thử sử dụng VM để thử và tìm hiểu những thứ này, vì vậy bạn sẽ không bao giờ gặp rủi ro nhiều.
M. Becerra

7
Bây giờ để khắc phục sự cố, bạn có thể tạo USB có thể khởi động bằng Ubuntu như thể bạn muốn cài đặt HĐH và nhấn Dùng thử Ubuntu , từ đó bạn có thể mở một thiết bị đầu cuối và đổi tên thư mục.
M. Becerra


32
/D_bin/mv -T /D_bin /binvà không chạy tập lệnh của bạn như root lần sau.
Jason C

5
Btw khi tạo các kịch bản như thế này tôi thường thực hiện chạy khô trước bằng cách tạo kịch bản lệnh lặp lại các lệnh có khả năng phá hủy thay vì chạy chúng và xác minh rằng các hành động của nó sẽ lành mạnh. Ngoài ra: sao lưu thường xuyên.
Jason C

Câu trả lời:


89

Có một số cách để khắc phục vấn đề này.

Nếu bạn có quyền truy cập vào trình bao (bất kỳ thiết bị đầu cuối mở nào), hãy chạy:

sudo /D_bin/mv -T /D_bin /bin

sudolà trong /usr/binnên không cần phải chạy nó với đường dẫn tuyệt đối.

Một điều khác bạn có thể làm là, thêm biến /D_binvào PATHmôi trường của bạn , như thế này:

export PATH=$PATH:/D_bin

Nếu bạn không có quyền truy cập vào bất kỳ shell nào:

  1. khởi động lại hệ thống
  2. Khi grub xuất hiện, nhấn eđể chỉnh sửa grub
  3. ở cuối dòng bắt đầu với linux, hãy thêm:

    init=/D_bin/bash
  4. nhấn CTRL+x

Bây giờ bạn sẽ được thả vào một bash shell, bạn nên xem lại hệ thống tệp là đã đọc và có thể ghi.

/D_bin/mount -o remount,rw /

Và di chuyển thư mục D_bin sang bin:

/D_bin/mv -T /D_bin /bin

Sau đó khởi động lại hệ thống.

Nó sẽ hoạt động, nhưng nếu không có gì hiệu quả với bạn, bạn vẫn có thể khởi động hệ thống với đĩa / usb ubfox trực tiếp và khắc phục sự cố.


2
Người đầu tiên đã giải quyết nó. Cảm ơn rất nhiều, thực sự đã cứu ngày của tôi. Vì tò mò, bằng cách xem kịch bản tại sao việc đổi tên đạt / bin? Tất cả các thư mục trong Desktop đều có '_D' nhưng không có bất kỳ thư mục nào khác ở nhà hoặc tại root ngoại trừ bin.
Carlos D. Zapata

9
@ CarlosD.Zapata: nếu bạn cần thay đổi thư mục trong một vòng lặp trong một tập lệnh, thì việc chạy mã trong một phụ sẽ là một ý tưởng tốt. Thêm dấu ngoặc đơn mở trước cd "$j"(tên phải nằm trong dấu ngoặc kép) và thay thế cd ..dấu ngoặc đơn bằng dấu ngoặc đơn gần khớp. Ngoài ra, tại sao bạn chạy như root. Bạn không thể gây ra nhiều thiệt hại như vậy.
Jonathan Leffler

3
@ CarlosD.Zapata: sau khi bạn cd ..đặt a pwd, hãy xóa findlệnh của bạn khỏi tập lệnh, sau đó chạy nó như một người dùng bình thường. bạn sẽ thấy tập lệnh đi vào /, bởi vì bạn thực hiện một cd $ j mà tôi đoán là các tệp không phải là thư mục. Vì vậy, trong mỗi vòng lặp, bạn lùi lại một bước và cuối cùng bạn cũng vào được /.
Ravexina

1
@ CarlosD.Zapata Hãy nhớ rằng nó có thể đã "dừng" /binvì nó đang hoạt động trên các thư mục bên trong /bin. Tôi sẽ kiểm tra những cái đó (mặc dù không phải là root!)
wizzwizz4

17
Có lẽ nó đã dừng trên / bin vì / bin là thư mục đầu tiên trong / nó đã đổi tên (đầu tiên theo thứ tự bảng chữ cái) và sau đó, nó không thể chạy mvnữa.
dùng253751

8

Để khắc phục sự cố này nếu bạn không có thiết bị đầu cuối đang chạy đang mở, trước tiên tôi sẽ thử tìm một bộ thay thế vỏ shell mà bạn có thể sử dụng thay vì bash. Python đang ở /usr/bin, vì vậy mà vẫn hoạt động.

Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.call(["sudo", "/D_bin/mv", "-T", "/D_bin", "/bin"])

Nếu điều đó không hiệu quả, tôi chỉ cần khởi động thẳng từ CD / USB trực tiếp và sửa mọi thứ từ môi trường chạy lành mạnh.

Như một lời khuyên chung, tôi muốn Jonathan Leffler thứ hai trong các ý kiến: không bao giờ sử dụng cd ..trong các kịch bản, nó có thể dễ dàng dẫn đến các vấn đề như vậy. Tốt hơn là chỉ cd vào $jthư mục trong một subshell , theo cách này bạn không phải lo lắng về việc lấy lại.

#!/bin/bash
files=~/Desktop/folder_1/*

for j in $files
do
  (
    cd "$j"
    for i in 10n*  #file names starting by 10n
    do
       find * -maxdepth 0 ! -path . -exec mv {} D_{} \;
    done
  )
done

Ngoài ra, tất nhiên, không chạy công cụ như root trừ khi thực sự cần thiết.


Có thể chạy shell tương tác như python mà không cần truy cập vào bất kỳ shell / terminal nào khác không? Tôi nghĩ cách giải quyết là tạo một tập lệnh chứa lệnh cùng với mật khẩu để chạy nó dưới quyền root. GUI sẽ làm phần còn lại tôi đoán.
Ravexina

@Ravexina: không phải cái gì cũng có thể cần vỏ . Khá chắc chắn để chạy pythonquá trình bạn chỉ cần một ứng dụng đầu cuối và để chạy os.system("sudo ...")bạn chỉ cần một hạt nhân * nix. Có lẽ tôi sẽ dùng thử trong VM sau ...
leftaroundabout

Ngoài ra, khi nhập cdvào các tập lệnh, tốt hơn là cd -quay trở lại vị trí của bạn, thay vì giả sử bạn bỏ một thư mục xuống. Nếu bạn thay đổi ban đầu cd, thì cd ..bạn sẽ không trở lại nơi bạn ở, nhưng cd -sẽ.
Frambot

@JoeFrambach như cd ..tôi sẽ không sử dụng cd -trong các tập lệnh, chỉ ở dòng lệnh. cd -có lẽ ít đảm bảo rắc rối hơn cd .., nhưng tôi vẫn không cho rằng nó an toàn - nếu ai đó thêm các thay đổi thư mục ở giữa, nó sẽ đưa bạn đến một nơi nào đó ngoài ý muốn. Trong khi các lớp con cung cấp cho bạn một phạm vi được phân tách rõ ràng về nơi thư mục thay đổi và điểm mà bạn quay lại.
leftaroundabout

@Ravexina Tôi vừa thử nó: Python thực sự có thể được khởi chạy. Nó os.systemkhông không làm việc mà không shcó mặt, nhưng subprocess.callcông trình.
leftaroundabout
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.