RAM에서 실행중인 bash 스크립트의 내용을 검색 할 수 있습니까


18

실수로 매우 복잡한 bash 스크립트를 덮어 썼습니다. 여기서 범위 지정 및 스레딩을 깔끔하게 구현하려고했습니다.

이제 동일한 스크립트가 여전히 실행 중이지만 파일이 더 이상 없습니다. 질문은 다음과 같습니다. 램을 스캔하고 파일 자체의 찌르는 표현을 찾을 수 있습니까?

또 다른 문제는 : / dev / mem 또는 / dev / kmem 파일을 찾을 수 없으며 이미 내용을 grep하려고 시도했습니다.

환경 : vpsfx.com의 데비안 / sid 머신 (vps) 호스트입니다

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 0
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

/ proc / $ PID / fd를보십시오. 스크립트 자체를 포함하여 프로세스에 의해 열린 모든 파일 디스크립터가 있어야합니다. 그냥 cat $FD > /tmp/yourscript.sh그것을 복구하기에 충분합니다.


1
나는 OP가 묻는 질문에 실제로 대답하지 않는다는 사실에도 불구 하고이 대답을 찬성했습니다. OP 는 파일 시스템이 아닌 RAM 에서 스크립트를 복구하는 방법을 묻습니다 . 이 답변은 파일 시스템을 사용하며 최종 참조 카운트가 0에 도달 할 때까지 스크립트 파일이 최종적으로 연결 해제되지 않는다는 사실에 의존합니다.
Jonathan Ben-Avraham

1
proc 파일 시스템은 RAM에만 상주하며 모두가 마운트했습니다.
Diego Woitasen

2
/procFS는 RAM에 상주하지 않습니다. 실제로, 그것은 어디에도 상주하지 않습니다 . unix.stackexchange.com/questions/74713/…을 참조하십시오 . 에서 당신이 FD를 얻을 수 있지만 /proc, cat디스크립터를 보내고하는 것은 FS에서 파일을 읽고, RAM 없습니다. 사실, 파일을 삭제하여 inode 참조 횟수를 줄였으며 이제는 아무도 볼 수 없지만 스크립트를 실행하는 프로세스가 파일을 닫을 때까지 실제로 fs에서 삭제되지는 않습니다. stackoverflow.com/questions/2028874/…를 참조하십시오 .
Jonathan Ben-Avraham

그래 당신 말이 맞아요. 파일 자체는 디스크 파일 시스템에서 읽습니다. / proc는 RAM에 존재하지만 램 디스크와는 다르지만 정보는 RAM에 있습니다. / proc / $ PID / fd를 제외하고 다른 것일 수 있습니다. 어쨌든 @Thomas Nordquist는 파일을 복구하려고하는데 이것은 쉬운 방법입니다.
Diego Woitasen

몇 번의
시도

16

OP가 실제로 가능한 방법이 아닌 RAM을 의미 한다고 가정하고 스크립트가 실행되는 프로세스에 코어 파일 제한이 0이라고 가정하면 (보통 기본 설정 ) 프로세스에 첨부해야합니다. 프로세스 이미지를 포함하고 코어 파일을 생성하기 위해 ABRT 신호를 사용하기 위해 코어 한계를 충분히 큰 값으로 설정하거나 , 프로세스에 접속하여 RAM에서 프로세스의 코어 이미지를 생성 할 수 있는 도구를 사용 하십시오.cat /proc/PID/limitsgdb

  1. 설치 gdb

실행중인 스크립트 또는 루트 소유권과 동일한 소유권을 가진 일부 쉘에서 :

  1. 수행 ps ax프로세스 ID를 찾아 (PID)
  2. gdb -p PID

이렇게하면 프로세스 실행이 계속되지 않지만 프로세스 테이블에서 제거되지는 않습니다.

  1. gdb에서 다음 명령을 실행하십시오 generate-core-file

Saved corefile core.15113PID가 15113이라고 가정하면 gdb는 다음과 같이 응답해야합니다 .

  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

스크립트의 일부를 위해 하드 디스크 파티션을 겹치는 청크와 grep 이진으로 dd. 운이 좋으면 하드 디스크 나 ssd의 쓰기주기를 저장하기 위해 램의 임시 디렉토리에 해당 청크를 작성하십시오. 아니요, '램에서'솔루션이 아닙니다. 바이트 단위로 디스크를 읽을 때 스크립트가 utf-8 (또는 유사한) 문자 세트 형식 일 수 있으므로 grep 매개 변수도 조정해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.