vi에서 사용자가 어떤 파일을 편집하고 있는지 확인하는 방법

vi에서 사용자가 어떤 파일을 편집하고 있는지 확인하는 방법

을 실행하면 w사용자가 vi에서 특정 파일을 편집하고 있는 것을 볼 수 있습니다.

그러나 다른 디렉토리에 같은 이름을 가진 여러 파일이 있습니다.

이 파일 중 사용자가 편집 중인 파일이 무엇인지 어떻게 알 수 있나요?

답변1

다음과 같이 lsof사용자를 선택하고 프로세스를 검색 할 수 있습니다 .vim

sudo lsof -u user -a -c vim | grep swp

@Fox가 지적했듯이 고전적인 접근 방식은 vi임시 파일을 생성하므로 /var/tmp이를 보려면 선택(테스트하지 않음)해야 합니다.

sudo lsof -u user -a -c vi | grep '/var/tmp/'

그러나 @Fox가 지적했듯이 클래식 파일과 실제 파일을 연관시킬 수 없으며 vi답변에서 다음에 논의할 도구가 필요합니다(클래식의 vi경우 vim그것으로 충분합니다 lsof).대개vim오늘날 Linux에서는 vi.

바라보다15 Linux lsof 명령 예(열린 파일 식별)

vim예제 로 돌아가면 사용 중인 스왑 파일이 file아래와 같이 열리는 것을 볼 수 있습니다..file.swp

사용자가 user1다음을 수행하는 경우 vi file:

$ sudo lsof -c vi -a -u user1 | grep swp
vi      3615  user1  3u   REG    8,1    12288 265061 /home/user1/.file.swp

~에서man lsof

-a는 목록 선택 옵션을 AND로 연결합니다.

-cc 이 옵션은 c 문자로 시작하는 명령을 실행하는 프로세스에 대한 파일 목록을 선택합니다. 여러 -c 옵션을 사용하여 여러 명령을 지정할 수 있습니다. AND 옵션 선택에 참여하기 전에 단일 OR 세트에 추가됩니다.

-us 이 옵션은 로그인 또는 사용자 ID 번호가 쉼표로 구분된 그룹에 있는 사용자의 파일 목록을 선택합니다.

lsof루트로 사용할 수 있는 이 외에도 sysdig강력한 디버깅 프레임워크가 있습니다.

그러면 시스템에 열려 있는 모든 파일이 실시간으로 표시되며, 파일이 열리자마자 사용자, PID 및 프로세스가 나열됩니다.

sudo sysdig -p "%12user.name %6proc.pid %12proc.name %3fd.num %fd.typechar %fd.name" evt.type=open"

sysdig: 시스템 수준 탐색 및 문제 해결 도구

Sysdig는 Linux 커널에 설치하고 시스템 호출 및 기타 운영 체제 이벤트를 캡처하여 운영 체제 수준에서 실제 및 가상 머신을 감지합니다. 그런 다음 sysdig의 명령줄 인터페이스를 사용하여 이러한 이벤트를 필터링하고 디코딩하여 유용한 정보와 통계를 추출할 수 있습니다.

Sysdig를 사용하면 실시간 시스템을 실시간으로 검사하거나 나중에 분석할 수 있는 추적 파일을 생성할 수 있습니다.

snoopy시스템 관리자를 위한 또 다른 유용한 도구로 프로세스에서 수행된 모든 호출을 syslog에 기록하는 이 도구를 설치할 수도 있습니다 . 사용자가 명령줄에서 호출하면 vi file시스템 로그에 표시됩니다.

일단 설치되면 snoopy제거할 때까지 execve()를 통해 모든 프로세스 호출을 기록한다는 점에 유의하십시오(이 작업이 항상 발생하기를 원할 수도 있고 원하지 않을 수도 있습니다).

snoopy: execve() 래퍼 및 로거

snoopy는 syslog(authpriv)에 대한 모든 호출을 기록하기 위해 libc에서 제공하는 execve() 함수 주변의 래퍼 역할을 하는 공유 라이브러리입니다. 시스템 관리자는 스누피가 경량/무거운 시스템 모니터링, 다른 관리자의 작업 추적, 시스템에서 무슨 일이 일어나고 있는지에 대한 좋은 "감각" 얻기(예: Apache 실행 cgi 스크립트)와 같은 작업에 유용할 수 있습니다.

설치하려면 다음을 수행 snoopy하십시오 sysdig.

$sudo apt-get install snoopy sysdig

관련 질문도 참조하세요:Linux 바이너리가 수행하는 작업 이해

답변2

이는 어떤 경우에는 효과가 있을 수 있습니다. ps파일을 편집한 인스턴스의 프로세스 ID를 찾을 수 있습니다 .vi

$ w
...
username  pts/2    :0.0             11:42    2:34m  0.28s  0.27s vim foo

$ ps aux | grep 'vim foo'
...
username  55899 .... vim foo

그런 다음 루트로서 해당 pid와 연관된 열린 파일 설명자를 확인합니다.

# ls -l /proc/55899/fd
...
lrwx------ 1 username group 64 Feb  8 14:23 6 -> /path/to/.foo.swp

이를 고려하면 해당 파일이 /path/to/foo.

답변3

다음을 사용해야 합니다 lsof.

$ lsof  |grep -i vim

답변4

사용자가 실행한 명령을 알고 있다고 가정하지만, 사용자가 해당 명령을 실행한 디렉터리가 무엇인지 알고 싶습니다. 따라서 실행한 경우 해당 명령이 , 또는 또는 다른 것인지 vi myfile.txt알 수 있습니다 ./home/user/myfile.txt/tmp/myfile.txt

이 경우 루트로 실행한다고 가정하면 다음을 수행할 수 있습니다.

readlink /proc/<pid>/cwd

여기서 / <pid>는 관심 있는 프로세스의 프로세스 ID입니다. 이는 해당 프로세스의 현재 디렉터리를 알려줍니다. 이는 원하는 디렉터리일 가능성이 가장 높습니다.vivim

하지만 참고하세요:

  • 사용자는 편집기를 시작한 후 프로세스의 현재 디렉터리를 변경할 수 있습니다(예: 명령 사용 :cd). 100% 신뢰할 수는 없지만 편집기를 생성한 쉘 프로세스의 현재 디렉토리를 확인할 수도 있습니다.
  • 사용자는 다른 파일을 열 수 있으며 이러한 파일은 명령줄에 표시되지 않으므로 완전히 다른 파일을 편집하고 있을 수 있습니다.

관련 정보