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