서버의 모든 사용자에서 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.