Çalışan bir bash betiğinin içeriğini RAM'den almak mümkün mü


18

Yanlışlıkla, kapsam belirleme ve iplik geçirmeyi düzenli bir şekilde uygulamaya çalıştığım çok karmaşık bir bash betiğinin üzerine yazdım.

Şimdi aynı komut dosyası hala çalışıyor ama dosya artık yok, soru şudur: Koç aracılığıyla taramak ve dosyanın kendisinin sokma temsilini bulmak mümkün mü?

Başka bir sorun: / dev / mem veya / dev / kmem dosyasını bulamıyorum, zaten içerik için grep çalıştı.

Çevreye: vpsfx.com'da debian / sid makinesi (vps) barındırıcısı

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

Yanıtlar:


17

/ Proc / $ PID / fd'ye bir göz atın. Burada, komut dosyasının kendisi de dahil olmak üzere, süreç tarafından seçilen tüm dosya tanımlayıcılarına sahip olmalısınız. Sadece cat $FD > /tmp/yourscript.shkurtarmak için yeterli olmalı.


1
OP'nin sorduğu soruyu cevaplamamasına rağmen bu cevabı iptal ettim. OP betiğin dosya sisteminden değil RAM'den nasıl kurtarılacağını sordu . Bu yanıt, son referans sayısı sıfıra ulaşana kadar komut dosyasının son halinin kaldırılmamasına bağlı olarak dosya sistemini kullanır.
Jonathan Ben-Avraham

1
Proc dosya sistemi sadece RAM'de bulunur ve herkesin takılı olduğunu almose.
Diego Woitasen

2
/procFS RAM'da değildir. Aslında, hiçbir yerde kalmaz . Bkz. Unix.stackexchange.com/questions/74713/… . Sizi fd alabilirsiniz rağmen /proc, catfd ing fs dosyayı okur, RAM değil. Doğru, dosyayı sildiğinizde inode ref sayısını azaltır ve başka hiç kimse dosyayı şimdi göremez, ancak komut dosyasını çalıştıran işlem kapatılıncaya kadar aslında fs'den silinmez. Bkz. Stackoverflow.com/questions/2028874/… .
Jonathan Ben-Avraham

Evet haklısın. Dosyanın kendisi disk dosya sisteminden okunur. / proc RAM'de var, ramdisk gibi değil, ancak bilgi RAM'de. / Proc / $ PID / fd ve diğer durumlar hariç. Her neyse, @Thomas Nordquist dosyayı kurtarmak istiyor ve bu kolay bir yol.
Diego Woitasen

Benim için çalıştı, birkaç trys sonra doğru dosya tanımlayıcı buldum sonunda süreci kapatabilir ve devam edebilirsiniz
Thomas Nordquist

16

OP'nin gerçekten RAM'den kastedildiğini ve olası bir yol olmadığını varsayarsak ve komut dosyasının yürütüldüğü işlemin sıfır çekirdek dosya sınırına sahip olduğunu varsayarsak (genellikle varsayılan ayardır cat /proc/PID/limits), sonra işleme eklemeniz gerekir ve çekirdek sınırını işlem görüntüsünü içerecek kadar büyük bir değere ayarlayın ve çekirdek dosyayı oluşturmak için ABRT sinyalini kullanın ya da bir işleme ekleyip RAM'den gdbişlemin çekirdek görüntüsünü oluşturabilecek bir araç kullanın .

  1. Yüklemek gdb

Çalışan komut dosyasıyla veya kök sahipliğiyle aynı sahipliğe sahip bazı kabuklarda:

  1. ps axİşlem kimliğini (PID) bulmak için yapın
  2. gdb -p PID

Bunun işlem yürütmesinin devam etmesini engelleyeceğini, ancak işlem tablosundan kaldırmayacağını unutmayın.

  1. GDB'de komutu verin generate-core-file

gdb, PID'nin Saved corefile core.1511315113 olduğu varsayılarak, böyle bir şeyle yanıt vermelidir .

  1. GDB'de komutu verin detach

Komut dosyanız çalışmaya devam edecek (devam edecek).

  1. GDB'de komutu verin quit
  2. Kabukta koş strings core.15113 > my_script.sh

my_script.shBazı düzenleyicide açın . Komut dosyası metniniz, ortam bölümünden önce dosyanın sonuna doğru olmalıdır. Koddan önce ve sonra bölümleri kazımak için düzenleyiciyi kullanın.

Ödül komut dosyanızda kullanmadan önce bu çözümü başka bir komut dosyasında test edin. YMMV.

Dizi şöyle görünür:

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:~$ 

Bu çözüm de işe yarıyor, ancak işte biraz kazma var, yardımınız için teşekkürler
Thomas Nordquist

Benim için işe yarayan çözüm bu! Orijinal dosyanın üzerine yazmıştım ve hala bellekte olmasını umuyordum. Open fd (diğer cevap) güncellenen dosyayı gösterdi. Bu beni kurtardı!
saveman71

0

dd üst üste gelen parçalar ve sabit disk bölümünün betiğin bölümleri için grep ikili dosyası. Eğer şanslıysanız, sabit diskinizi veya SSD'nizin yazma döngülerini kaydetmek için bu parçaları parçalamak için ram içindeki geçici dizine yazın. hayır, bu bir 'koç' çözümü değil. disk bayt bayt komut dosyalarını okurken utf-8 (veya benzeri) karakter biçiminde olabileceğinin farkında olun, bu nedenle grep parametrelerinin de uyarlanması gerekebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.