脚本帮助允许用户交互以基于ps输出终止进程



我正在尝试这个,但做得不好,我被卡住了。我有一个用户将 sudo 限制为仅运行某些命令。它们有时会运行多个命令,并且需要能够终止某些命令/进程。该命令是 tcpdump,当它生成为 sudo 时,它会创建 2 个进程。又跑了一遍,总数是4。每个 2 都绑定到每个 tcpdump 实例,所以我让我的脚本找到 PPID,我将杀死它以照顾子进程。这是我到目前为止所拥有的:

#!/bin/bash 
RESULT1=$(ps -ef | grep "sudo tcpdump" | grep -v grep)
RESULT2=$(ps -ef | grep "sudo tcpdump" | grep -v grep | awk '{print   $3}')
echo $RESULT1
echo $RESULT2
if [ "$RESULT2" = "$RESULT2" ]
then
echo "Choose which PPID you wish to kill"
fi

到目前为止,输出如下所示:

root 14485 14456 0 16:01 pts/0 00:00:00 sudo tcpdump -n -i any port   53 
root 14743 14720 0 16:09 pts/2 00:00:00 sudo tcpdump -n -i any port    220
14456 14720
Choose which PPID you wish to kill

我背后的想法

if [ "$RESULT2" = "$RESULT2" ]

以某种方式告诉脚本他们只被允许杀死它找到的 PPID。(因为他们不能自由支配来杀死任何东西)但我现在在想这不是实现这一目标的方法。

我正在绘制有关如何告诉脚本突破 $RESULT 2 的空白,以便我可以为用户提供选项。那么,任何人都可以帮助我继续前进,以便用户现在可以在找到的 PPID 之间进行选择,并且脚本只允许他们杀死这些?

#!/bin/bash 
RESULT1=$(ps -ef | grep "sudo tcpdump" | grep -v grep)
RESULT2=$(ps -ef | grep "sudo tcpdump" | grep -v grep | awk '{print   $3}')
echo $RESULT1
echo $RESULT2
#Validate existence of PPID before asking for input
if test -z "$RESULT2"; then         ## If no PPIDs
  echo 'No PPID value found' && exit 1    
else
  echo "Choose which PPID to kill" 
  read input
fi
# Get result of whether input matches a value in RESULT2
res=`echo $RESULT2 | grep $input`  
# If input is empty, then
if test -z "$input"; then         
  echo "input empty" && exit 1
elif test -z "$res"; then         # If input doesn't match PPID listed
  echo "input doesn't match PPID" && exit 1
else 
  pkill -P $INPUT             #kill PPID
fi
exit 0

这将始终计算为 true:

[ "$RESULT2" = "$RESULT2" ]

所以这不是一个有用的测试。相反,您可以验证用户输入以确保它等于RESULT2中的一行:

read input
sudo kill `echo "$RESULT2" |
    awk -v input="$input" 'input==$1'` ||
    echo "Invalid PID"

最新更新