Có thể truy xuất nội dung của tập lệnh bash đang chạy từ RAM


18

Tôi đã vô tình ghi đè lên một kịch bản bash rất phức tạp, nơi tôi đã cố gắng thực hiện phạm vi và xâu chuỗi một cách gọn gàng.

Bây giờ cùng một tập lệnh vẫn đang chạy nhưng tập tin không còn nữa, câu hỏi là: Có thể quét qua ram và tìm đại diện sting của chính tập tin không?

Một vấn đề khác là: Tôi không thể tìm thấy tệp / dev / mem hoặc / dev / kmem, đã cố gắng grep nó cho nội dung.

Đối với môi trường: Đó là một máy chủ lưu trữ debian / sid machine (vps) trên vpsfx.com

root @ heisenberg: ~ # ls -a / dev
. kmsg ptyp2 ptyp9 ngẫu nhiên tty1 tty5 ttyp2 ttyp9 urandom
.. đăng nhập ptyp3 ptypa shm tty10 tty6 ttyp3 ttypa xconsole
.udev null ptyp4 ptypb stderr tty11 tty7 ttyp4 ttypb zero
char ptmx ptyp5 ptypc stdin tty12 tty8 ttyp5 ttypc
giao diện điều khiển pts ptyp6 ptypd stdout tty2 tty9 ttyp6 ttypd
fd ptyp0 ptyp7 ptype tty tty3 ttyp0 ttyp7 ttype
ptyp1 đầy đủ ptyp8 ptypf tty0 tty4 ttyp1 ttyp8 ttypf

Câu trả lời:


17

Hãy xem / Proc / $ PID / fd. Ở đó bạn nên có tất cả các mô tả tập tin được mở theo quy trình, bao gồm cả chính tập lệnh. Chỉ cat $FD > /tmp/yourscript.shcần là đủ để phục hồi nó.


1
Tôi đã đưa ra câu trả lời này mặc dù thực tế là nó không trả lời câu hỏi mà OP đã hỏi. OP đã hỏi cách khôi phục tập lệnh từ RAM , không phải từ hệ thống tập tin. Câu trả lời này sử dụng hệ thống tệp, dựa trên thực tế là tệp tập lệnh cuối cùng không được hủy liên kết cho đến khi số tham chiếu cuối cùng bằng không.
Jonathan Ben-Avraham

1
Hệ thống tập tin Proc chỉ nằm trong RAM và mọi người đã gắn kết nó.
Diego Woitasen

2
Các /procfs không nằm trong RAM. Trong thực tế, nó không cư trú ở bất cứ đâu . Xem unix.stackexchange.com/questions/74713/ . Mặc dù bạn có thể lấy fd từ /proc, catnhưng fd đọc tệp từ fs chứ không phải RAM. Đúng, bạn đã xóa tệp, giảm số lượng ref inode và không ai khác có thể nhìn thấy nó bây giờ, nhưng nó không thực sự bị xóa khỏi fs cho đến khi quá trình chạy tập lệnh đóng nó. Xem stackoverflow.com/questions/2028874/ cấp .
Jonathan Ben-Avraham

Vâng, bạn đúng. Các tập tin chính nó được đọc từ hệ thống tập tin đĩa. / Proc tồn tại trong RAM, nó không giống như một ramdisk, nhưng thông tin nằm trong RAM. Ngoại trừ / Proc / $ PID / fd và có thể khác. Dù sao, @Thomas Nordquist muốn khôi phục tệp và đây là cách dễ dàng.
Diego Woitasen

Làm việc cho tôi, sau một vài lần thử tôi đã tìm thấy mô tả tập tin chính xác cuối cùng tôi có thể đóng quy trình và tiếp tục
Thomas Nordquist

16

Giả sử rằng OP thực sự có nghĩa là từ RAM chứ không phải bất kỳ cách nào có thể , và giả sử rằng quá trình thực thi tập lệnh có giới hạn tệp không có lõi (thường là cài đặt mặc định cat /proc/PID/limits), thì bạn cần phải đính kèm vào quy trình và đặt giới hạn lõi thành một giá trị đủ lớn để bao gồm hình ảnh quá trình và sử dụng tín hiệu ABRT để tạo tệp lõi hoặc sử dụng một công cụ như gdbcó thể đính kèm vào một quy trình và tạo hình ảnh cốt lõi của quá trình từ RAM.

  1. Tải về gdb

Trong một số shell có quyền sở hữu tương tự như tập lệnh đang chạy hoặc quyền sở hữu gốc:

  1. Làm ps axđể tìm id quá trình (PID)
  2. gdb -p PID

Lưu ý rằng điều này sẽ ngăn quá trình thực thi quy trình tiếp tục nhưng không xóa nó khỏi bảng quy trình.

  1. Trong gdb, ban hành lệnh generate-core-file

gdb nên repond với một cái gì đó như Saved corefile core.15113, giả sử rằng PID là 15113.

  1. Trong gdb, ban hành lệnh detach

Kịch bản của bạn sẽ tiếp tục (tiếp tục) chạy.

  1. Trong gdb, ban hành lệnh quit
  2. Trong vỏ, chạy strings core.15113 > my_script.sh

Mở my_script.shtrong một số trình soạn thảo. Văn bản tập lệnh của bạn phải ở cuối tập tin trước phần môi trường. Sử dụng trình chỉnh sửa để loại bỏ các phần trước và sau tập lệnh.

Kiểm tra giải pháp này trên một tập lệnh khác trước khi bạn sử dụng nó trên tập lệnh giải thưởng của mình. YMMV.

Trình tự trông như thế này:

yba@tavas:~$ gdb -p 15113
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Attaching to process 15113
Reading symbols from /bin/bash...(no debugging symbols found)...done.
Reading symbols from /lib/x86_64-linux-gnu/libtinfo.so.5...(no debugging symbols found)...done.
Loaded symbols for /lib/x86_64-linux-gnu/libtinfo.so.5
Reading symbols from /lib/x86_64-linux-gnu/libdl.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/x86_64-linux-gnu/libdl.so.2
Reading symbols from /lib/x86_64-linux-gnu/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/x86_64-linux-gnu/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
0x00007feaf4b4c7be in waitpid () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) generate-core-file
Saved corefile core.15113
(gdb) detach
Detaching from program: /bin/bash, process 15113
(gdb) quit
yba@tavas:~$ 

Giải pháp này cũng hoạt động, nhưng đây là một số hoạt động đào, cảm ơn sự giúp đỡ của bạn
Thomas Nordquist

Đây là giải pháp hiệu quả với tôi! Tôi đã ghi đè lên tập tin gốc và hy vọng nó sẽ còn trong bộ nhớ. Các fd mở (câu trả lời khác) chỉ vào tập tin cập nhật. Điều đó đã cứu tôi!
saveman71

0

dd phân vùng ổ cứng trong các đoạn chồng chéo và nhị phân grep cho các phần của tập lệnh. nếu bạn may mắn, hãy viết ra những đoạn đó vào thư mục tạm thời trong ram để lưu lại trong đó để lưu các chu trình ghi đĩa cứng hoặc ssd của bạn. không, đó không phải là giải pháp "từ ram". lưu ý rằng khi đọc byte đĩa theo kịch bản byte có thể ở định dạng bộ ký tự utf-8 (hoặc tương tự), do đó, các tham số grep cũng có thể phải được điều chỉnh.

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.