Apakah mungkin untuk mengambil konten skrip bash yang berjalan dari RAM

18

Saya secara tidak sengaja menimpa skrip bash yang sangat kompleks, di mana saya mencoba menerapkan pelingkupan dan threading dengan cara yang rapi.

Sekarang skrip yang sama masih berjalan tetapi file tidak lebih, pertanyaannya adalah: Apakah mungkin untuk memindai ram dan menemukan representasi sengatan dari file itu sendiri?

Masalah lain adalah: Saya tidak dapat menemukan file / dev / mem atau / dev / kmem, sudah mencoba untuk menerimanya untuk isinya.

Untuk lingkungan: Ini adalah hostet debian / mesin samping (vps) di vpsfx.com

root @ heisenberg: ~ # ls -a / dev
. kmsg ptyp2 ptyp9 acak tty1 tty5 ttyp2 ttyp9 urandom
.. log ptyp3 ptypa shm tty10 tty6 ttyp3 ttypa xconsole
.udev null ptyp4 ptypb stderr tty11 tty7 ttyp4 ttypb nol
char ptmx ptyp5 ptypc stdin tty12 tty8 ttyp5 ttypc
konsol pts ptyp6 ptypd stdout tty2 tty9 ttyp6 ttypd
fd ptyp0 ptyp7 ptype tty tty3 ttyp0 ttyp7 ttype
ptyp1 ptyp8 ptypf tty0 penuh tty4 ttyp1 ttyp8 ttypf
Thomas Nordquist
sumber

Jawaban:

17

Lihatlah / proc / $ PID / fd. Di sana Anda harus membuka semua deskriptor file oleh proses, termasuk skrip itu sendiri. Hanya cat $FD > /tmp/yourscript.shharus cukup untuk memulihkannya.

Diego Woitasen
sumber
1
Saya membatalkan jawaban ini meskipun faktanya tidak menjawab pertanyaan yang diajukan OP. OP bertanya bagaimana memulihkan skrip dari RAM , bukan dari sistem file. Jawaban ini menggunakan sistem file, bergantung pada fakta bahwa file skrip tidak akhirnya dibatalkan tautannya hingga jumlah referensi akhir mencapai nol.
Jonathan Ben-Avraham
1
Sistem file proc hanya berada di RAM dan hampir semua orang telah menginstalnya.
Diego Woitasen
2
The /procfs tidak bertempat tinggal di RAM. Bahkan, ia tidak berada di mana pun . Lihat unix.stackexchange.com/questions/74713/… . Meskipun Anda bisa mendapatkan fd dari /proc, cating fd membaca file dari fs, bukan RAM. Benar, Anda menghapus file, mengurangi jumlah inode ref, dan tidak ada orang lain yang bisa melihatnya sekarang, tetapi sebenarnya tidak dihapus dari fs sampai proses menjalankan skrip menutupnya. Lihat stackoverflow.com/questions/2028874/… .
Jonathan Ben-Avraham
Ya kamu benar. File itu sendiri dibaca dari sistem file disk. / proc ada di RAM, ini tidak seperti ramdisk, tetapi informasinya ada di RAM. Dengan pengecualian dari / proc / $ PID / fd dan mungkin lainnya. Pokoknya, @Thomas Nordquist ingin memulihkan file, dan ini cara mudahnya.
Diego Woitasen
Bekerja untuk saya, setelah beberapa kali mencoba saya menemukan deskriptor file yang benar akhirnya saya dapat menutup proses dan melanjutkan
Thomas Nordquist
16

Dengan asumsi bahwa OP benar-benar berarti dari RAM dan bukan cara yang mungkin , dan dengan asumsi bahwa proses di mana skrip dieksekusi memiliki batas nol file inti (yang biasanya merupakan pengaturan default, cat /proc/PID/limits), maka Anda perlu melampirkan ke proses dan atur batas inti ke nilai yang cukup besar untuk menyertakan gambar proses dan gunakan sinyal ABRT untuk menghasilkan file inti, atau gunakan alat seperti gdbyang dapat melampirkan ke proses dan menghasilkan gambar inti dari proses dari RAM.

  1. Install gdb

Di beberapa shell dengan kepemilikan yang sama dengan script yang berjalan atau kepemilikan root:

  1. Lakukan ps axuntuk menemukan id proses (PID)
  2. gdb -p PID

Perhatikan bahwa ini akan menghentikan eksekusi proses dari melanjutkan tetapi tidak menghapusnya dari tabel proses.

  1. Di gdb, jalankan perintah generate-core-file

gdb harus merespons dengan sesuatu seperti Saved corefile core.15113, dengan asumsi bahwa PID adalah 15113.

  1. Di gdb, jalankan perintah detach

Script Anda akan terus berjalan (melanjutkan).

  1. Di gdb, jalankan perintah quit
  2. Dalam shell, jalankan strings core.15113 > my_script.sh

Buka my_script.shdi beberapa editor. Teks skrip Anda harus berada di akhir file sebelum bagian lingkungan. Gunakan editor untuk menghapus bagian sebelum dan sesudah skrip.

Uji solusi ini pada skrip lain sebelum Anda menggunakannya pada skrip hadiah Anda. YMMV.

Urutannya terlihat seperti ini:

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:~$ 
Jonathan Ben-Avraham
sumber
Solusi ini juga berfungsi, tetapi ada beberapa penggalian yang terlibat, terima kasih atas bantuan Anda
Thomas Nordquist
Ini adalah solusi yang berhasil untuk saya! Saya telah menimpa file asli, dan berharap itu masih ada dalam memori. Fd terbuka (jawaban lain) menunjuk ke file yang diperbarui. Itu menyelamatkan saya!
saveman71
0

dd partisi harddisk dalam potongan yang tumpang tindih dan ambil binary untuk bagian skrip. jika Anda beruntung, tuliskan potongan-potongan itu ke direktori sementara di ram untuk melakukan greeping di dalamnya untuk menyimpan harddisk atau siklus tulis ssd Anda. tidak, ini bukan solusi 'dari ram'. Waspadai fakta bahwa ketika membaca disk byte demi byte skrip mungkin dalam format charset utf-8 (atau serupa), sehingga parameter grep mungkin harus disesuaikan juga.

Michael Grieswald
sumber