특정 열에 대한 데이터 범위를 기반으로 행만 표시하도록 명령의 출력을 구문 분석합니다.

특정 열에 대한 데이터 범위를 기반으로 행만 표시하도록 명령의 출력을 구문 분석합니다.

유사한 게시물을 많이 접했지만 내가 원하는 것을 찾으려고 노력하면서 이것은 확실히 rtfm의 예입니다. 나는 awk나 grep이 어떤 식으로든 도움이 될 수 있다고 생각하며, 올바른 방향을 가리키는 데 도움을 사용할 수 있습니다.

앞으로 다른 사용자가 해당 기능을 실행할 수 있다는 프롬프트가 포함된 스크립트를 작성할 계획이지만 먼저 나 자신을 위해 작업하는 기본 아이디어를 얻고 싶습니다.

who -u현재 로그인한 사용자를 표시한 다음 유휴 시간을 기준으로 사용자 ID, 유휴 시간 및 PID를 표시 해야 합니다 .

예를 들어,

01sale1  pts/11       2016-10-05 06:39 00:04       14132 (192.168...)
01sale2  pts/16       2016-10-05 06:40 00:07       17902 (192.168...)
01sale3  pts/14       2016-10-05 06:40   .         17779 (192.168...)
01sale5  pts/25       2016-10-05 06:41 00:04       18339 (192.168...)

모든 사람이 온라인에 접속하면 목록이 매우 길어지고 특정 소프트웨어에 대한 라이선스 제한에 도달하는 데 문제가 발생합니다. 이 문제가 해결되려면 사용자를 한 시간 정도 유휴 상태로 두어야 합니다.

내가 원하는 것은 who -u를 실행하여 열 6이 한 시간보다 오래된지 여부에 따라 열 1, 5, 6만 표시하여 01:** 이상이 표시되도록 하는 것입니다.

궁극적으로 나는 루트가 없는 사용자가 실행할 수 있는 스크립트를 만들고 싶습니다. 이 스크립트는 그들에게 이 정보를 표시한 다음 유휴 사용자를 종료합니다. 완전 자동화를 원하는지 잘 모르겠습니다.

이전 Red Hat에서 이 애플리케이션을 실행하고 있습니다.

답변1

다음과 같이 시도해 볼 수 있습니다.

who -u | \
awk '$5 ~ /^[0-9][1-9]:.*$|^[1-9][0-9]:.*$/ {printf "%s %s %s\n", $1,$5,$6}'  

awk로 시작하는 패턴과 일치합니다 0[1-9] || [1-9][0-9].
일치하는 패턴을 시도해 볼 수 있습니다.시작하지 않음00당신이 할 의향이 있다면 .

답변2

유휴 시간은 tty 장치의 마지막 액세스 시간에서 파생되므로 다음을 수행할 수 있습니다.

kill_idle() (
  sig=$1
  old_ttys=$(find /dev/pts -type c ! -name ptmx -amin +60 -printf %p,)
  [ "$#" -eq 0 ] || pkill "-$sig" -t "$old_ttys"
)
kill_idle HUP; sleep 3; kill_idle KILL

이러한 비활성 tty에 의해 제어되는 모든 프로세스를 종료하십시오.

이제 @rudimeter가 올바르게 지적했듯이 /dev/pts장치는 항상 사용자 터미널 세션에만 사용되는 것은 아니므로 다른 목적으로 의사 터미널을 사용하는 프로세스(예: 다른 터미널 규칙 또는 pty를 사용하는 프로세스) expect가 종료될 수 있습니다.socat

터미널 에뮬레이터, getty, screen, sshd 등과 같은 것들은 생성한 의사 터미널을 데이터베이스에 등록하고 utmp그것이 who -u쿼리됩니다.

얻기 위해서는게으른who -u대신 다음을 수행할 수 있습니다.

old_ttys=$(
  who -u | awk '$5 != "." && $5 !~ /^00/ {printf "%s,", $2}'
)

who -u그러나 pty를 등록하는 데 사용된 시스템에서 의 출력이 변조될 수 있습니다.utempter

예를 들어, 여기에서는 socat다음을 사용하여 pty를 만듭니다.

name=$':0)\nnobody pts/2 2016-10-05 00:00 old 123 (:0' socat pty \
  system:'/usr/lib/x86_64-linux-gnu/utempter/utempter add \"$name\"; sleep infinity',nofork &

utempterutmp에 항목을 추가하는 데 사용되는 sgid 명령입니다. 표준 입력이 다음을 가리켜야 ptmx하고 해당 슬레이브 지점이 호출자가 소유해야 하기 때문에 어느 정도 입력의 유효성을 검사 하지만 유효성을 검사하지는 않습니다.주인대지. 여기서는주인필드에는 개행 문자가 포함되어 있으며 출력에 가짜 항목을 만듭니다 who -u.

nobody pts/2 2016-10-05 00:00 old 123 (:0)

즉, 언제든지 프로세스를 종료할 수 있습니다.


유휴 터미널만 나열:

who -u | awk '$5 != "." && $5 !~ /^00/'

아니면 사용자, 유휴 시간, 터미널 제어 프로세스의 pid를 나열하세요.

who -u | awk '
  $5 != "." && $5 !~ /^00/ {printf "%-16s %6s %d\n", $1, $5, $6}'

w명령은 더 유용한 출력을 제공할 수 있습니다(또한 위에서 언급한 취약점에 취약하지 않습니다).

$ w -sf | awk 'NR > 2 && $3 !~ /[0-9]s?$/'
stephane tty7      50days /usr/bin/lxsession -s LXDE -e LXDE
stephane pts/1      3:07m /bin/zsh
stephane pts/3      1:25m elinks

관련 정보