서버의 모든 사용자에서 bash 기록을 검색 할 수 있습니까?


20

여러 사용자 계정의 Linux 서버에서 실행 된 모든 bash 명령을보고 싶습니다. 내가 사용하는 특정 배포는 CentOS 5.7입니다. 서버에서 .bash_history 파일을 전역 적으로 검색하는 방법이 locate | cat | grep있습니까? 아니면 집에서 자란 프로세스 입니까? (나는 단지 그것을 타이핑하는 것을 외쳤다.)

답변:


25

getent홈 디렉토리를 열거하는 데 사용하십시오 .

getent passwd |
cut -d : -f 6 |
sed 's:$:/.bash_history:' |
xargs -d '\n' grep -s -H -e "$pattern" 

홈 디렉토리가 잘 알려진 위치에 있으면 다음과 같이 간단 할 수 있습니다.

grep -e "$pattern" /home/*/.bash_history

물론 사용자가 다른 쉘이나 다른 값을 사용하는 경우 HISTFILE많은 것을 알려주지 않습니다. 또한 쉘을 통해 실행되지 않은 명령이나 별칭 및 함수 및 사용자의 초기 일부 사용자 디렉토리에 있던 제거 된 외부 명령에 대해서도 설명하지 않습니다 $PATH. 알고 싶은 것이 사용자가 실행 한 명령 인 경우 프로세스 회계 또는 일부 감사 감사 시스템이 필요합니다. 내 컴퓨터의 활동 모니터링을 참조하십시오 . , 프로세스가 완료된 후 시간이 얼마나 걸 렸는지 확인하는 방법은 무엇입니까? .


프로세스 회계 제안 대신 +1 히스토리 파일은 실제로 사용자 편의를위한 것이며 어떤 종류의 로깅 목적으로도이를 완벽하게 방지 할 수있는 간단한 방법은 없습니다.
— jw013

@ jw013 예, 이미 쉘 히스토리로 편집 / 수정 및 뭉개는 것이 얼마나 쉬운 지에 대해 이미 알고 있습니다. = |
— 웨슬리

이것은 오래된 질문이지만 첫 번째 Google 검색 결과이므로 추가 할 가치가 있습니다. 파일을 grep하기 전에 파일이 존재하는지 확인하기 위해 이것을 수정했습니다.getent passwd | cut -d : -f 6 | sed "s:$:/.bash_history:" | xargs -d'\n' -I{} sh -c "[ -f {} ] && echo {}" | xargs -d'\n' grep -Hn -e "$pattern"
— BryKKan

1
@BryKKan 존재하지 않는 파일을 무시하는 것이 좋습니다. 일반적인 사용자 이름에 "이상한"문자가 포함되어 있지 않지만 실제로는 {}이와 같이 사용 하는 것이 매우 위험하므로 실제로는 작동해야합니다 . 파일 이름은 스크립트에서 직접 보간됩니다. say $(rm -rf /)또는 say를 포함하는 파일 이름 (여기서는 사용자 이름) ;rm -rf /;이 있으면 명령이 실행됩니다. 항상 파일 이름을 셸 스크립트에 인수로 전달하고 find 또는 xargs의 {}메커니즘을 사용하지 마십시오 .
— Gilles 'SO- 악의를 멈춰라

4
find /home -name .bash_history | xargs grep <string>

또는

grep string $(find /home -name .bash_history)

여기에는 기본 위치의 홈 디렉토리가 포함됩니다. 파싱 /etc/passwd또는 호출 getent하고 그 결과를 파싱하는 것이 좋습니다.

for i in $(getent passwd | cut -d: -f6 ); do grep string ${i}/.bash_history; done

3

넌 할 수있어

find /home | grep bash_history | xargs grep "whatever"

그러나 나는 그것이 당신이 생각하는 것보다 훨씬 낫다고 생각하지 않습니다.

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