내가 달성하고 싶은 것은 Yakuake/Konsole을 사용할 때마다 터미널 세션을 자동으로 기록하고 보관하는 것입니다.
수업 시작 부분에 다음과 같이 하면 구현하기가 쉽습니다.
script -f /home/$USER/bin/shell_logs/$(date +"%d-%b-%y_%H-%M-%S")_shell.log
하지만 Yakuake를 시작하거나 새 탭을 열 때마다 위의 내용이 자동으로 실행되기를 원합니다.
.bashrc를 사용하면 "스크립트"가 새 세션을 열고 .bashrc를 읽고 다른 "스크립트"를 시작하는 등 무한 루프가 생성되므로 작동하지 않습니다.
따라서 아마도 새 탭이 열릴 때 "스크립트"가 한 번 실행되도록 Yakuake/Konsole을 스크립트로 작성해야 할 것입니다. 문제는 어떻게?
답변1
script
이 유틸리티를 사용하여 터미널 세션(SSH 세션(!) 포함)을 자동으로 기록하려는 경우 방법은 다음과 같습니다.
.bashrc
홈 디렉터리 끝에 다음 줄을 추가하거나 /etc/bash.bashrc
모든 사용자의 세션만 기록하려면 다음 줄을 추가하세요. 쉘의 상위 프로세스가 존재하지 않는지 테스트한 script
다음 이를 실행합니다 script
.
리눅스의 경우:
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
script -F
(Linux) 또는 (BSD 및 macOS) 이후의 경로를 변경하여 파일이 기록되는 위치를 조정할 수 있습니다.
script
물론 이 답변은 귀하가 이미 설치했다고 가정합니다. Debian 기반 배포판에서는 script
패키지의 일부입니다 bsdutils
.
답변2
이 질문은 자신의 세션을 기록하려는 개인이 요청한 것이지만 개별 사용자가 무엇을 하고 있는지 추적하려는 시스템 관리자가 대체 사용 사례일 수도 있습니다.
시스템 사용자가 세션 기록을 꺼릴 경우
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
모든 파일의 기록을 기록하는 Copy-On-Write 파일 시스템을 사용하여 유사한 변경 사항을 모니터링할 수 있습니다.
그러나 비슷한 트릭을 사용하면 사용자가 명령을 기록하지 않고 실행할 수 있습니다.
curl "http://users.own.server/server/secret_commands_824" | sh
나는 간단한 해결책을 모른다. 가능성은 다음과 같습니다:
- 모든 네트워크 데이터를 기록하고 압축을 푼다.
- 모든 시스템 호출을 기록합니다.
이런게 가능하구나심사.
하지만 어쨌든...
사용자 세션 로깅은 관리자에게 실제 보안을 제공할 가능성이 없습니다. 기본적으로 사용자는 자신의 파일만 조작할 수 있으며 시스템에 해를 끼칠 수 없습니다. 악의적인 사용자가 권한을 상승시키는 데 성공하면 로깅을 비활성화하고 로그를 삭제할 수 있습니다(관리자가 로그를 추가 전용 모드로 별도의 시스템에 저장하도록 구성하지 않은 경우).
사용자 세션을 자동으로 기록하는 관리자는 아마도이 작업이 수행되고 있음을 사용자에게 알립니다.. 일부 관할권에서는 이러한 형태의 데이터 수집이데이터 또는 개인 정보 보호법 위반. 최소한 이 사실을 사용자에게 알리는 것은 예의입니다.
sudo
관리자는 사용자 세션 기록에 관심을 가질 가능성이 더 높습니다 . 어쩌면 이 문제는 다른 답변이나 다른 질문으로 해결될 수도 있습니다.
답변3
바꾸다:
test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' ||
나는 다음을 사용할 것이다:
grep -qx "$PPID" <(pgrep -x "script") ||
이 경우에는 큰따옴표가 필요하지 않지만 표준 관행으로 사용하는 경향이 있습니다. 드물지만 문제가 있는 하위 문자열 일치를 피하기 위해 grep 및 pgrep에서 "x" 스위치를 사용하는 것이 좋습니다.