마지막 세션 시간을 초 단위로 가져옵니다.

마지막 세션 시간을 초 단위로 가져옵니다.

last특정 사용자의 마지막 세션 시간을 얻으려면 다음 명령을 사용합니다.

last -aiF -n 1 fakeuser

이 명령의 출력은 다음과 유사합니다.

fakeuser pts/0 2018년 11월 27일 화요일 11:03:19 - 2018년 11월 27일 화요일 11:14:57 (00:11) 999.999.99.999

내 질문은 세션 시간( (00:11)예제에서는)에 관한 것입니다. 이 시간을 초 단위로 설정할 수 있는 방법이 있나요?

로그인 및 로그아웃 시간을 기준으로 계산할 수 있다는 것을 알고 있지만 해당 명령 항목에서도 네트워크에서 아무것도 찾지 못했기 last때문에 명령에서 직접 솔루션을 찾고 있습니다 .man

참고로 저는 Debian 9.5를 사용하고 있지만 그 솔루션 중 일부는 모든 배포판에서 작동할 것이라고 확신합니다.

완벽한 답변에 대한 부가 질문(여기서 첫 번째 답변 이후에 확인했습니다): 1분 미만 지속되는 세션을 식별하는 방법은 무엇입니까?

답변1

제가 정확하게 기억한다면 관심 있는 필드는 일반적으로 형식 Days+HH:MM이며 초로 변환하려면 다음을 수행할 수 있습니다.

last -aiF -n 1 fakeuser | \
awk '{gsub(/\(|\)/, "", $14); print $14}' | \ 
awk -F'[:+]' 'length($0) != 0 {if(length($3) == 0) {$3=$2; $2=$1; $1=0} {print ($1 * 86400) + ($2 * 3600) + ($3 * 60)}}'

첫 번째 줄은 명령입니다 last.

두 번째 줄에서는 명령 출력에서 ​​원하는 필드를 구분합니다(필드 14로 표시됨).

세 번째 줄에는 모든 작업이 포함됩니다. -F더하기 기호( +)와 콜론( )에서 필드를 분할하려면 구분 기호( )를 설정합니다 :. 그런 다음 행이 비어 있지 않은지 테스트합니다( length($0) != 0). 다음 비트( if(length($3) == 0) {$3=$2; $2=$1; $1=0})는 모든 행을 일, 시간, 분의 세 가지 필드로 정규화하는 빠른 방법입니다. 나머지( {print ($1 * 86400) + ($2 * 3600) + ($3 * 60)})는 그냥 초로 환산한 것이다(하루는 86400초, 한 시간은 3600초, 1분은 60초).

아마도 더 쉬운 방법이 있을 것입니다. 그러나 이것은 제가 점심 시간에 이 문제를 다루면서 생각해낸 것입니다.

답변2

이 문제에 대한 GracefulRestart의 awk 솔루션은 훌륭합니다. 답변에 대한 설명에서 지적했듯이 명령은 last충분히 세부적이지 않습니다. 그러나 auth.log데비안의 상황이 내가 우분투에서 본 것과 충분히 유사하다고 가정하면 거기에 있는 데이터를 기반으로 몇 가지 계산을 수행할 수 있습니다.

감사합니다이것대답은 아니지만 여전히 도움이 될 수 있습니다.

/var/log/auth.log로컬 로그인과 SSH 로그인이 모두 포함된 여러 행을 필터링했습니다 .

cat auth.log
2018-12-06T07:28:00.487714+13:00 server systemd-logind[944]: New session 2597 of user tink.
2018-12-06T08:34:16.360766+13:00 server login[29537]: pam_unix(login:session): session opened for user tink by LOGIN(uid=0)
2018-12-06T08:34:16.372714+13:00 server systemd-logind[944]: New session c4 of user tink.
2018-12-06T08:34:20.960596+13:00 server login[29537]: pam_unix(login:session): session closed for user tink
2018-12-06T08:36:01.197712+13:00 server systemd-logind[944]: Removed session 2597.

이것은 (복잡한) awk 스크립트입니다..

cat session.awk
{
  if( $0 ~ /systemd-logind.+New session/  && $0~user ){
      start[$6]=$1
    }
  if( $0 ~ /systemd-logind.+ Removed session/ && start[gensub(/([0-9]+).*/, "\\1", "1", $6)] != ""  ){
      tmp = start[gensub(/([0-9]+).*/, "\\1", "1", $6)]
      cmd = "date +%s -d ";
      cmd  $1 | getline outa;
      cmd " "  tmp | getline ina;
      close( cmd )
      printf "%s was logged in for %s seconds\n", user, outa-ina
    }
  if( $0 ~ /login.+ session opened/  && $0~user ){
      start[gensub(/[^0-9]+([0-9]+).*/,"\\1","1",$3)]=$1
    }
  if( $0 ~ /login.* session closed/  ){
      tmp = start[gensub(/[^0-9]+([0-9]+).*/,"\\1","1",$3)]
      cmd = "date +%s -d ";
      cmd  $1 | getline outa;
      cmd " "  tmp | getline ina;
      close( cmd )
      printf "%s was logged in for %s seconds\n", user, outa-ina
    }
}

위의 코드 조각에 대해 이 코드를 실행하세요.

awk -v user=tink -f session.awk sessions
tink was logged in for 4 seconds
tink was logged in for 4081 seconds

관련 정보