क्या रैम से चलने वाली बैश स्क्रिप्ट की सामग्री को पुनः प्राप्त करना संभव है


18

मैं दुर्घटना से एक बहुत ही जटिल बैश पटकथा लिख ​​चुका हूं, जहां मैंने एक चुस्त तरीके से स्कूपिंग और थ्रेडिंग को लागू करने की कोशिश की।

अब वही स्क्रिप्ट अभी भी चल रही है, लेकिन फ़ाइल नहीं है, सवाल यह है: क्या यह संभव है कि रैम के माध्यम से स्कैन किया जाए और फ़ाइल का स्टिंग प्रतिनिधित्व खुद ही खोजा जाए?

एक अन्य समस्या यह है: मैं / dev / mem / / dev / kmem फ़ाइल नहीं ढूँढ सकता, पहले से ही इसे सामग्री के लिए तैयार करने की कोशिश की।

पर्यावरण के लिए: यह vpsfx.com पर एक डेबियन / साइड मशीन (वीपीएस) होस्ट है

root @ heisenberg: ~ # ls -a / dev
। kmsg ptyp2 ptyp9 यादृच्छिक tty1 tty5 ttyp2 ttyp9 urandom
.. लॉग इन ptyp3 ptypa shm tty10 tty6 ttyp3 ttypa xconsole
.udev null ptyp4 ptypb stderr tty11 tty7 ttyp4 ttypb शून्य
char 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

/ खरीद / $ PID / fd पर एक नज़र है। वहां आपके पास स्क्रिप्ट सहित, प्रक्रिया द्वारा खोले गए सभी फ़ाइल डिस्क्रिप्टर होने चाहिए। बस cat $FD > /tmp/yourscript.shइसे ठीक करने के लिए पर्याप्त होना चाहिए।


1
मैंने इस जवाब को इस तथ्य के बावजूद उकसाया कि यह वास्तव में उस सवाल का जवाब नहीं है जो ओपी ने पूछा था। ओपी ने पूछा कि रैम को स्क्रिप्ट से कैसे पुनर्प्राप्त किया जाए , फाइलसिस्टम से नहीं। यह उत्तर फाइल सिस्टम का उपयोग करता है, इस तथ्य पर भरोसा करते हुए कि अंतिम संदर्भ गणना शून्य तक पहुंचने तक स्क्रिप्ट फ़ाइल को अनलिंक नहीं किया जाता है।
जोनाथन बेन-अवराम

1
रैम में ही प्रोकस फाइलसिस्टम रहता है और हर कोई इसे माउंट करता है।
डिएगो Woitasen

2
/procFS रैम में रहते हैं नहीं करता है। वास्तव में, यह कहीं भी नहीं रहता हैUnix.stackexchange.com/questions/74713/… देखें । हालाँकि आप fd से प्राप्त कर सकते हैं /proc, catलेकिन fd फ़ाइल को fs से पढ़ता है, RAM से नहीं। सही है, आपने फ़ाइल को हटा दिया है, इनोड रेफ की गिनती को कम कर रहा है, और अब कोई भी इसे नहीं देख सकता है, लेकिन यह वास्तव में fs से हटाया नहीं जाता है जब तक कि स्क्रिप्ट चलाने की प्रक्रिया बंद नहीं हो जाती। Stackoverflow.com/questions/2028874/… देखें ।
जोनाथन बेन-अब्राहम

हाँ आप सही है। फ़ाइल को डिस्क फाइल सिस्टम से ही पढ़ा जाता है। / proc रैम में मौजूद है, यह रैमडिस्क की तरह नहीं है, लेकिन जानकारी रैम में है। / Proc / $ PID / fd के अपवाद के साथ और अन्य हो सकता है। वैसे भी, @ थोमस नॉर्डक्विस्ट फ़ाइल को पुनर्प्राप्त करना चाहता है, और यह आसान तरीका है।
डिएगो वोइत्सेन

मेरे लिए काम किया, कुछ कोशिशों के बाद मुझे सही फाइल डिस्क्रिप्टर मिला आखिरकार मैं इस प्रक्रिया को बंद कर सकता हूं और जारी रख सकता हूं
थॉमस नॉर्डक्विस

16

यह मानते हुए कि ओपी वास्तव में रैम से तात्पर्य है और किसी भी तरह से संभव नहीं है , और यह मानते हुए कि जिस प्रक्रिया में स्क्रिप्ट निष्पादित की गई थी, उसमें शून्य कोर फ़ाइल सीमा है (जो आमतौर पर डिफ़ॉल्ट सेटिंग है cat /proc/PID/limits), तो आपको प्रक्रिया को संलग्न करने की आवश्यकता है और या तो मुख्य छवि को प्रोसेस छवि में शामिल करने और ABRT सिग्नल का उपयोग कोर फाइल बनाने के लिए एक बड़े पर्याप्त मान पर सेट करें, या एक टूल का उपयोग करें जैसे gdbकि एक प्रक्रिया से जुड़ सकते हैं और रैम से प्रक्रिया की एक कोर छवि उत्पन्न कर सकते हैं।

  1. इंस्टॉल gdb

चल रहे स्क्रिप्ट या रूट स्वामित्व के समान स्वामित्व वाले कुछ शेल में:

  1. ps axप्रक्रिया आईडी (पीआईडी) खोजने के लिए करें
  2. gdb -p PID

ध्यान दें कि यह प्रक्रिया के निष्पादन को जारी रखने से रोक देगा लेकिन इसे प्रक्रिया तालिका से नहीं हटाएगा।

  1. जीडीबी में, कमांड जारी करें generate-core-file

gdb को कुछ इस तरह Saved corefile core.15113से रिपीट करना चाहिए , यह मानते हुए कि PID 15113 है।

  1. जीडीबी में, कमांड जारी करें detach

आपकी स्क्रिप्ट जारी रहेगी (फिर से शुरू)।

  1. जीडीबी में, कमांड जारी करें 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:~$ 

यह समाधान भी काम करता है, लेकिन यहां कुछ खुदाई शामिल है, आपकी मदद के लिए धन्यवाद
थॉमस नॉर्डक्विस

यह वह उपाय है जो मेरे लिए काम करता है! मैंने मूल फ़ाइल को अधिलेखित कर दिया था, और आशा है कि यह अभी भी स्मृति में होगी। खुली हुई fd (अन्य उत्तर) अद्यतन की गई फ़ाइल की ओर इशारा करती है। जिसने मुझे बचा लिया!
saveman71 18

0

dd हार्डडिस्क विभाजन को स्क्रिप्ट के कुछ हिस्सों के लिए अतिव्यापी विखंडू और grep बाइनरी में। यदि आप भाग्यशाली हैं, तो अपनी हार्डडिस्क या एसएसडी के राइट साइकल को बचाने के लिए उन चनों को अस्थायी निर्देशिका में राम में लिखें। नहीं, यह 'राम से' समाधान नहीं है। इस तथ्य से अवगत रहें कि जब बाइट लिपियों द्वारा डिस्क बाइट पढ़ना utf-8 (या समान) चारसेट प्रारूप में हो सकता है, तो grep मापदंडों को भी अनुकूलित करना पड़ सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.