เป็นไปได้หรือไม่ที่จะดึงเนื้อหาของสคริปต์ bash ที่ทำงานอยู่จาก RAM


18

ฉันบังเอิญเขียนทับสคริปต์ทุบตีที่ซับซ้อนมากซึ่งฉันพยายามใช้การกำหนดขอบเขตและเธรดในวิธีที่เป็นระเบียบ

ตอนนี้สคริปต์ตัวเดิมยังคงทำงานอยู่ แต่ไฟล์ไม่อยู่อีกต่อไปคำถามคือ: มันเป็นไปได้ไหมที่จะทำการสแกนผ่านแรมและค้นหาการแทนค่าของไฟล์เอง?

ปัญหาอื่นคือ: ฉันหาไฟล์ / dev / mem หรือ / dev / kmem ไม่ได้แล้วพยายามที่จะ grep มันสำหรับเนื้อหา

สำหรับสภาพแวดล้อม: เป็นโฮสต์เดบิต / sid machine (vps) บน vpsfx.com

root @ heisenberg: ~ # ls -a / dev
. kmsg ptyp2 ptyp9 สุ่ม tty1 tty5 ttyp2 ttyp9 urandom
.. log ptyp3 ptypa shm tty10 tty6 ttyp3 ttypa xconsole
.udev null ptyp4 ptypb stderr tty11 tty7 ttyp4 ttypb ศูนย์
ถ่าน ptmx ptyp5 ptypc stdin tty12 tty8 ttyp5 ttypc
pts ของคอนโซล ptyp6 ptypd stdout tty2 tty9 ttyp6 ttypd
fd ptyp0 ptyp7 ptype tty tty3 ttyp0 ttyp7 ttype
เต็ม ptyp1 ptyp8 ptypf tty0 tty4 ttyp1 ttyp8 ttypf

คำตอบ:


17

ดูที่ / proc / $ PID / fd ที่นั่นคุณควรเปิดไฟล์ descriptors ทั้งหมดโดยกระบวนการรวมถึงสคริปต์ด้วย เพียงแค่cat $FD > /tmp/yourscript.shควรจะเพียงพอที่จะกู้คืนได้


1
ฉันยกระดับคำตอบนี้แม้ว่าที่จริงแล้วมันไม่ได้ตอบคำถามที่ OP ถาม OP ถามถึงวิธีกู้คืนสคริปต์จากRAMไม่ใช่จากระบบไฟล์ คำตอบนี้ใช้ระบบไฟล์โดยอาศัยความจริงที่ว่าไฟล์สคริปต์นั้นไม่ได้ถูกยกเลิกการเชื่อมโยงจนกว่าจำนวนการอ้างอิงขั้นสุดท้ายจะเป็นศูนย์
Jonathan Ben-Avraham

1
ระบบไฟล์ proc อยู่ใน RAM เท่านั้นและเกือบทุกคนจะติดตั้ง
Diego Woitasen

2
/procFS ไม่ได้อยู่ในแรม ในความเป็นจริงมันไม่ได้อยู่ที่ใดก็ได้ ดูunix.stackexchange.com/questions/74713/... แม้ว่าคุณจะสามารถรับ fd ได้/procแต่catการ fd อ่านไฟล์จาก fs ไม่ใช่ RAM จริงคุณลบไฟล์ลดจำนวนการอ้างถึง inode และไม่มีใครเห็นได้ในตอนนี้ แต่จะไม่ถูกลบออกจาก fs จริงจนกว่ากระบวนการที่เรียกใช้สคริปต์จะปิดลง ดูstackoverflow.com/questions/2028874/...
Jonathan Ben-Avraham

ใช่คุณถูก. ไฟล์ถูกอ่านจากระบบไฟล์ดิสก์ / proc มีอยู่ใน RAM มันไม่เหมือน ramdisk แต่ข้อมูลนั้นอยู่ใน RAM ด้วยข้อยกเว้นของ / proc / $ PID / fd และอาจเป็นอื่น ๆ อย่างไรก็ตาม @Thomas Nordquist ต้องการกู้คืนไฟล์และนี่เป็นวิธีที่ง่าย
Diego Woitasen

ทำงานให้ฉันหลังจากลองสักครู่ฉันก็พบว่าตัวอธิบายไฟล์ที่ถูกต้องในที่สุดฉันก็สามารถปิดกระบวนการและดำเนินการต่อ
โทมัส Nordquist

16

สมมติว่า OP หมายถึงจาก RAMจริง ๆและไม่ใช่วิธีที่เป็นไปได้และสมมติว่ากระบวนการที่สคริปต์ถูกดำเนินการมีขีด จำกัด ไฟล์หลักเป็นศูนย์ (ซึ่งโดยปกติแล้วจะเป็นการตั้งค่าเริ่มต้นcat /proc/PID/limits) จากนั้นคุณต้องแนบกับกระบวนการและ ตั้งค่าขีด จำกัด หลักให้มีค่ามากพอที่จะรวมอิมเมจกระบวนการและใช้สัญญาณ ABRT เพื่อสร้างไฟล์แกนหรือใช้เครื่องมือเช่นgdbที่สามารถแนบกับกระบวนการและสร้างอิมเมจหลักของกระบวนการจาก RAM

  1. ติดตั้ง gdb

ในเชลล์บางตัวที่มีความเป็นเจ้าของเหมือนกับสคริปต์ที่รันอยู่หรือความเป็นเจ้าของรูท:

  1. ทำps axเพื่อค้นหา id กระบวนการ (PID)
  2. gdb -p PID

โปรดทราบว่าสิ่งนี้จะหยุดกระบวนการดำเนินการไม่ให้ดำเนินการต่อ แต่ไม่ลบออกจากตารางกระบวนการ

  1. ใน gdb ออกคำสั่ง generate-core-file

gdb ควรแก้ไขด้วยสิ่งที่คล้ายSaved corefile core.15113กันโดยสมมติว่า PID คือ 15113

  1. ใน gdb ออกคำสั่ง detach

สคริปต์ของคุณจะทำงานต่อ (ทำงานต่อ)

  1. ใน gdb ออกคำสั่ง quit
  2. ในเปลือกรัน strings core.15113 > my_script.sh

เปิดmy_script.shในตัวแก้ไขบางอย่าง ข้อความสคริปต์ของคุณควรตรงส่วนท้ายของไฟล์ก่อนส่วนของสภาพแวดล้อม ใช้โปรแกรมแก้ไขเพื่อขูดส่วนก่อนและหลังสคริปต์

ทดสอบโซลูชันนี้กับสคริปต์อื่นก่อนที่จะใช้กับสคริปต์รางวัลของคุณ YMMV

ลำดับดูเหมือนดังนี้:

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

วิธีนี้ใช้ได้เช่นกัน แต่ที่นี่มีการขุดบ้างขอขอบคุณสำหรับความช่วยเหลือของคุณ
Thomas Nordquist

นี่คือทางออกที่เหมาะกับฉัน! ฉันเขียนทับไฟล์ต้นฉบับและหวังว่ามันจะยังคงอยู่ในหน่วยความจำ fd เปิด (คำตอบอื่น ๆ ) ชี้ไปที่ไฟล์ที่อัปเดต นั่นช่วยฉันได้!
saveman71

0

dd พาร์ติชันฮาร์ดดิสก์ในส่วนที่ทับซ้อนกันและ grep binary สำหรับชิ้นส่วนของสคริปต์ หากคุณโชคดีให้เขียน chunks เหล่านั้นไปยังไดเร็กตอรี่ชั่วคราวในหน่วยความจำเพื่อทำการบันทึก harddisk หรือ ssd's cycles ไม่มันไม่ใช่ทางออกจากแรม ระวังความจริงที่ว่าเมื่ออ่านดิสก์ไบต์โดยสคริปต์ไบต์อาจอยู่ในรูปแบบชุดอักขระ utf-8 (หรือคล้ายกัน) ดังนั้นพารามิเตอร์ grep อาจต้องปรับเช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.