특정 시간에 su-ed 루트에서 로그아웃하는 방법

특정 시간에 su-ed 루트에서 로그아웃하는 방법

사용자가 su다음으로 전환한다고 가정합니다.root

$ su
Password: 
bash-4.2# crontab -l

root특정 시간에 이러한 사용자를 모두 로그아웃하려면 어떻게 해야 합니까 ?

내가 시도한 것

알아요. 다음 명령을 사용하세요.

bash-4.2# ps -A -u root | grep bash
 2303 tty1     00:00:00 bash
 2548 pts/0    00:00:00 bash
 3040 pts/0    00:00:00 bash
 3080 pts/2    00:00:00 bash

가 소유한 모든 Bash 쉘을 얻을 수 있습니다 root. 하지만 에 의해 생성된 것을 어떻게 선택할 수 있습니까 su? su-ed 쉘을 실행 하면 echo $$다음과 같은 결과가 나타납니다.

bash-4.2# echo $$
3040

그런 다음 다음을 시도합니다.

bash-4.2# kill 3040

root그러나 그것은 껍질을 죽이지 않습니다 . 또한 하나를 생성하면 cron job echo $$필요한 PID가 제공되지 않습니다. 그래서 이것은 작동하지 않습니다.

이제 나는 막혔습니다.

답변1

pkill -u 0 suall 루트로 실행 중인 모든 프로세스 su(이로 인해 하위 쉘이 종료됨)

다음에서 실행 중인 bash 프로세스만 종료하려는 경우 su:

for pid in $(pgrep -u 0 bash); do
  parent_pid=$(ps -o ppid= -p "$pid")
  parent_command=$(ps -o comm= -p "$parent")
  if [ "$parent_command" = "su" ]; then kill -HUP "$parent_pid"; fi
done

그렇게 말하면 이것은 아마도 나쁜 생각일 것입니다. 당신이 죽이는 껍질이 중요한 일을 하고 있다면 어떻게 될까요?

오랫동안 방치된 포탄을 죽이려면 다음을 설정하십시오.TMOUT. .bashrc​예를 들어, 를 사용하면 TMOUT=600bash는 10분 동안 입력이 없으면 자동으로 종료됩니다.

당신이 달성하고 싶은 것이 무엇인지 신중하게 생각하십시오. 쉘을 종료해도 해결하려는 문제는 해결되지 않을 가능성이 높습니다.

답변2

다른 나라와 마찬가지로 요구되어서는 안 됩니다. 먼저 왜 많은 프로세스가 활성화되어 있는지 이해해야 합니다 su.

반면, 예를 들어 Linux에서 이러한 모든 프로세스를 종료하려면 다음을 사용할 수 있습니다.

ps aux | awk '/su( -)?$/ {print $2}' | xargs sudo kill

답변3

다른 프로세스를 종료하는 것에 신경 쓰지 않는다면 su( su -u username) 쉬운 방법은 다음과 같습니다.

   echo "killall su" | at 1145 jan 31

관심이 있다면 Emy의 솔루션을 사용하여 "at"과 마지막 "sometime"에 피드하거나 주기적으로 호출되도록 crontab에 추가하세요.

똑똑한 사용자는 Emy의 필터를 극복할 것이며 정규식을 속이기 위해서는 꽤 많은 옵션이 필요하기 su -u root때문에 그들을 찾아내는 것은 어려울 것입니다 . 더 완벽하지만 위에서 언급한 대로 부수적인 피해를 일으킬 수 있습니다.sukillall

답변4

루트에 속한 모든 bash 프로세스를 종료하기 위해 다음 스크립트를 사용했습니다.

for pid in $(pgrep -u 0 bash); do
    if [ "$pid" != "$$" ]; then
        kill -HUP "$pid";
    fi
done

관련 정보