
원격 워크스테이션에서 여러 개의 Emacs(v21.2.1) 인스턴스가 실행되고 있는데 그 중 하나를 ssh
. 워크스테이션에 ssh를 연결하는 동안 각 인스턴스의 PID를 얻을 수 있지만( pgrep emacs
예: 을 사용하여) 해당 프로세스 중 어떤 프로세스에 특정 파일이 열려 있는지 확인하는 방법을 모르겠습니다.
lsof
명백하게 유용한 정보를 반환하지 않습니다. 아마도 Emacs는 파일이 버퍼에서 편집되는 동안 파일을 열어두지 않기 때문일 것입니다. 어쩌면 기존 Emacs 창을 현재 위치로 내보내는 것이 가능할 수도 있지만 어떻게 해야 할지 모르겠습니다.
이것이 가능하다고 생각하는 제가 어리석은 걸까요?
답변1
사용strace
어떤 파일이 열려 있는지 확인합니다(파일을 열어두거나 적어도 파일을 자주 확인합니다). 그러면 프로세스가 보고 있는 모든 항목의 목록이 제공됩니다. 분명히 이를 어느 정도 구문 분석하고 중복 항목을 필터링하고 적절한 pid로 대체해야 합니다.
strace -p1337 -e trace=file
다음과 같은 출력이 생성됩니다.
unlink("/tmp/emacsBYJwbf") = 0
stat("/home/tjackson/.jabber-avatars", {st_mode=S_IFDIR|0755, st_size=16384, ...}) = 0
stat("/home/tjackson/.jabber-avatars/e7e63a04ac20783855bc31ab8fcfb7bc23a39036.jpg", {st_mode=S_IFREG|0644, st_size=2556, ...}) = 0
stat("/lab_scratch/mymachine/work/path/to/some/file.cxx", {st_mode=S_IFREG|0644, st_size=45772, ...}) = 0
open("/lab_scratch/mymachine/work/path/to/some/file.cxx", O_RDONLY) = 10
stat("/lab_scratch/mymachine/work/path/to/some/file.cxx", {st_mode=S_IFREG|0644, st_size=45772, ...}) = 0
stat("/lab_scratch/mymachine/work/some/other/path/different/header_file.h", {st_mode=S_IFREG|0644, st_size=92260, ...}) = 0
open("/lab_scratch/mymachine/work/some/other/path/different/header_file.h", O_RDONLY) = 10
stat("/lab_scratch/mymachine/work/some/other/path/different/header_file.h", {st_mode=S_IFREG|0644, st_size=92260, ...}) = 0
stat("/home/tjackson/News/drafts/drafts/272", 0x7fbfffd400) = -1 ENOENT (No such file or directory)
stat("/scratch2/complex/tmp/output.log", {st_mode=S_IFREG|0644, st_size=378306, ...}) = 0
open("/scratch2/complex/tmp/output.log", O_RDONLY) = 10
stat("/scratch2/complex/tmp/output.log", {st_mode=S_IFREG|0644, st_size=378306, ...}) = 0
stat("/home/tjackson/.diary", {st_mode=S_IFREG|0644, st_size=72457, ...}) = 0
open("/home/tjackson/.diary", O_RDONLY) = 10
stat("/home/tjackson/.diary", {st_mode=S_IFREG|0644, st_size=72457, ...}) = 0
stat("/home/tjackson/News/drafts/drafts/271", 0x7fbfffd400) = -1 ENOENT (No such file or directory)
stat("/home/tjackson/News/drafts/drafts/273", 0x7fbfffd400) = -1 ENOENT (No such file or directory)
stat("/home/tjackson/personal/.newsrc-dribble", 0x7fbfffd400) = -1 ENOENT (No such file or directory)
stat("/lab_scratch/mymachine/work/sandbox/TAGS", {st_mode=S_IFREG|0644, st_size=2578671, ...}) = 0
open("/lab_scratch/mymachine/work/sandbox/TAGS", O_RDONLY) = 10
stat("/lab_scratch/mymachine/work/sandbox/TAGS", {st_mode=S_IFREG|0644, st_size=2578671, ...}) = 0
답변2
달리고 있다면그누서브(XEmacs 서버의 GNU Emacs 포트) 또는 GNU Emacs ≥23에서 포함된 emacsserver를 실행 중인 경우 실행 중인 Emacs 인스턴스에서 임의의 Lisp 명령을 실행할 수 있습니다.
gnuclient -r /tmp/gsrvdir1234/gsrv -batch -eval '(buffer-list)'
emacsclient -r /tmp/emacs1234/server -e '(buffer-list)' # Emacs ≥23 only
그렇지 않으면 나는 매우 해킹적인 두 가지 방법만을 생각할 수 있습니다.
- Emacs 인스턴스의 메모리를 통해 파일 이름을 검색합니다. Linux에서는 프로세스의 매핑된 메모리가
/proc/$pid/mem
을 통해 읽을 수 있는 것처럼 실제로 매핑된 페이지만 읽을 수 있습니다/proc/$pid/maps
. 나는 그것에 대한 기존 프로그램을 모른다. - 취약한 내용이 포함된 파일을 엽니다.지역 변수 선언, 즉 임의의 Lisp 코드 실행을 허용하는 코드입니다. Emacs 21은 별도로 명시하지 않는 한 여전히 지역 변수를 안전한 것으로 취급하므로 위험하다고 선언했어야 했지만 그렇지 않은 변수가 분명히 있었습니다. 하지만 나는 어떤 예도 모른다.