스크립트 유틸리티를 사용하여 모든 터미널 세션을 자동으로 기록하는 방법


28

내가 원하는 것은 Yakuake / Konsole을 사용할 때마다 터미널 세션을 자동으로 파일에 기록하는 것입니다.

세션을 시작할 때 내가하는 경우 쉽게 달성 할 수 있습니다.

script -f /home/$USER/bin/shell_logs/$(date +"%d-%b-%y_%H-%M-%S")_shell.log

그러나 Yakuake를 시작하거나 새 탭을 열 때마다 위의 내용을 자동으로 실행하고 싶습니다.

.bashrc는 'script'가 새 세션을 열고 .bashrc를 읽고 다른 'script'를 시작하는 등 무한 루프를 생성하기 때문에 작동하지 않습니다.

따라서 새로운 탭이 열리면 Yakuake / Konsole을 스크립트로 실행하여 스크립트를 한 번 실행해야합니다. 문제는 어떻게?


루프 문제가있는 문제 해결 방법을 시도하지만 exec줄의 시작 부분에 앞에 씁니다 . script -f동일한 쉘 PID에서 시작해야합니다 .
Hanan N.

또한이 질문의 흥미로운 버전은 비휠 사용자가 자신의 모든 세션을 스크립팅하는 방법으로 강제하는 방법입니다.
Yordan Georgiev

답변:


26

누군가가 script유틸리티를 사용하여 SSH 세션 (!)을 포함하여 터미널 세션을 자동으로 기록하려면 다음 과 같이하십시오.

.bashrc홈 디렉토리 의 끝에 다음 행을 추가하십시오. 그렇지 않으면 /etc/bash.bashrc모든 사용자의 세션 만 기록하려는 경우. 쉘의 부모 프로세스가 없는지 테스트 script한 다음 실행 script합니다.

Linux의 경우 :

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -f $HOME/$(date +"%d-%b-%y_%H-%M-%S")_shell.log)

BSD 및 macOS의 경우 다음 script -f으로 변경 하십시오 script -F.

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -F $HOME/$(date +"%d-%b-%y_%H-%M-%S")_shell.log)

그게 다야!

이제 새로운 터미널을 열면 다음을 볼 수 있습니다 :

Script started, file is /home/username/file_name.log

script홈 디렉토리의 파일에 세션을 작성하여 30-Nov-11_00-11-12_shell.log결과적으로 이름을 지정합니다 .

더 많은 사용자 정의 :

  • 모든 세션에 대해 새 세션을 만들지 않고 하나의 큰 파일에 세션을 추가 할 수 있습니다. script -a /path/to/single_log_file
  • script -f(Linux) 또는 script -F(BSD 및 macOS) 이후의 경로를 변경하여 파일이 작성된 위치를 조정할 수 있습니다

이 답변은 script물론 설치 했다고 가정합니다 . 데비안 기반 배포판 script에서 bsdutils패키지의 일부입니다 .


질문과 제목을 직접 편집 할 수 있습니다. 바로 edit아래 에있는 버튼을 클릭하십시오 .
Mat

8
1 초 내에 두 개의 쉘을 시작하면 파일 이름 충돌이 발생하므로 파일 이름에 ${RANDOM}및 / 또는 $$파일 이름을 추가하는 것이 좋습니다. 개인적 script.$(date -u +%Y%m%dt%H%M%S).${HOSTNAME:-$(hostname)}.$$.${RANDOM}.log으로 파일을 날짜 / 시간별로 자동 정렬하고 TZ와 일관되게 일치하는지 확인하고, 시작한 호스트를 알고, 소유 프로세스를 알고 있으며, 이름 충돌이 없습니다. 나는 ${USER}일반적으로 나만을위한 것이기 때문에 거의 사용하지 않습니다 .
nicerobot 2016

"실제로 / var / log / script를 작성하고 다른 사람이 쓸 수있게했는지 확인하십시오." 이 경우 "sudo chmod 777 / var / log / script"를 사용하는 것이 보안 관점에서 권장되는지 궁금합니다.
Teo

10

이 질문은 자신의 세션을 기록하려는 개인이 요청했지만 다른 사용 사례는 다양한 사용자의 활동을 추적하려는 시스템 관리자 일 수 있습니다.

script시스템 전체에서 실행하는 bashrc것이 세션 사용자가 기록을 가지고 싶어하지 않는 경우에는 적합하지 않을 수 있습니다.

시크릿 상태를 유지하려는 사용자는 sshd에 다른 셸 (예 :)을 열거 zsh나 로드 bash --rcfile ___되지 않도록 실행 하여 로깅을 무시할 수 /etc/bash.bashrc있습니다.

대체 접근법

2008 ( 보관 됨 ) 의이 안내서 는 사용자가 ssh로 로그인 할 때 다른 방법script사용하여 공개 / 개인 키로 로그인해야합니다.

이는 .ssh/authorized_keys키 앞에 사용자 파일에 스크립트를 추가하여 수행됩니다 .

command="/usr/local/sbin/log-session" ssh-dss AAAAB3NzaC1kc3MAAAEBAMKr1HxJz.....

log-session( 보관 ) 스크립트가 실행 여부 결정 /usr/bin/script이 사용자의 세션을 기록 할 수 있습니다.

exec script -a -f -q -c "$SSH_ORIGINAL_COMMAND" $LOGFILE

사용자가 추가 된 명령을 제거하지 못하게하려면 관리자는 사용자 authorized_keys파일 의 소유권을 가져야 합니다.

chown root:root ~user/.ssh/authorized_keys

불행히도, 이것은 사용자가 자신에게 추가 키를 추가하거나 기존 키가 손상되면 더 이상 중요한 키를 취소 할 수 없다는 것을 의미합니다. 이상적이지는 않습니다.

경고

sshd의 기본 구성은 사용자가 ssh 로그인을 통해 SFTP를 수행 할 수 있도록하는 것이 일반적입니다. 이를 통해 사용자는 변경 사항을 기록하지 않고 파일을 편집 할 수 있습니다. 관리자가 사용자가 그렇게하지 못하게하려면 SFTP에 대한 일부 로깅을 활성화하거나 서비스를 비활성화해야합니다. 그럼에도 불구하고 사용자는 터미널에서 다음과 같이 실행하여 파일을 보이지 않게 변경할 수 있습니다.

curl "http://users.own.server/server/new_data" > existing_file

모든 파일 히스토리를 기록하는 COW (Copy-On-Write) 파일 시스템을 사용하여 이와 같은 변경 사항을 모니터 할 수 있습니다.

그러나 비슷한 트릭을 통해 사용자는 명령을 기록하지 않고도 명령을 실행할 수 있습니다.

curl "http://users.own.server/server/secret_commands_824" | sh

나는 그것에 대한 쉬운 해결책을 모른다. 가능성은 다음과 같습니다.

  • 모든 네트워크 데이터를 기록하고 나중에 연결 해제합니다.
  • 모든 시스템 호출을 기록합니다.

이런 종류의 일은 감사를 통해 가능할 수 있습니다 .

어쨌든 ...

사용자 세션 로깅이 관리자에게 실질적인 보안을 제공하지는 않습니다. 기본적으로 사용자는 자신의 파일 만 조작 할 수 있으며 시스템을 손상시킬 수 없습니다. 악의적 인 사용자가 권한을 에스컬레이션 한 경우 관리자가 로그를 별도의 컴퓨터에 추가 전용 방식으로 저장하도록 구성하지 않은 경우 로깅을 비활성화하고 로그를 삭제할 수 있습니다.

사용자 세션을 자동으로 기록하는 관리자 는 사용자에게 이것이 완료되었음을 알려야합니다 . 일부 관할 지역에서는이 형식의 데이터 수집이 데이터 또는 개인 정보 보호법을 위반할 수 있습니다 . 그리고 최소한 사용자가이를 인식하게하는 것은 존중하는 일입니다.

관리자가 sudo사용자 세션 기록에 관심이있을 가능성이 높습니다 . 그것은 아마도 다른 대답이나 실제로 다른 질문에서 다룰 수 있습니다.


2

대신에:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' ||

나는 사용할 것이다 :

grep -qx "$PPID" <(pgrep -x "script") ||

이 경우 큰 따옴표는 필요하지 않지만 어쨌든 표준 연습으로 사용하는 경향이 있습니다. "x"스위치를 grep과 pgrep에 모두 사용하여 하위 문자열과의 드물지만 문제가되는 일치를 피하는 것이 좋습니다.

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