사용자가 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 su
all 루트로 실행 중인 모든 프로세스 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=600
bash는 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
때문에 그들을 찾아내는 것은 어려울 것입니다 . 더 완벽하지만 위에서 언급한 대로 부수적인 피해를 일으킬 수 있습니다.su
killall
답변4
루트에 속한 모든 bash 프로세스를 종료하기 위해 다음 스크립트를 사용했습니다.
for pid in $(pgrep -u 0 bash); do
if [ "$pid" != "$$" ]; then
kill -HUP "$pid";
fi
done