我是shell脚本的新手,这是我的问题:
我想将airmon-ng check
的输出中的PID存储到某些变量(例如:$ 1,$ 2,$ 3),以便我可以执行kill $1 $2 $3
。
这是airmon-ng check
的示例输出:
Found 3 processes that could cause trouble.
If airodump-ng, aireplay-ng or airtun-ng stops working after
a short period of time, you may want to kill (some of) them!
PID Name
707 NetworkManager
786 wpa_supplicant
820 dhclient
我想抓取数字 707 , 786 , 820 。
我尝试使用set 'airmon-ng check'
然后使用for循环:
set `airmon-ng check`
n=$#
for (( i=0; i<=n; i++ ))
do
echo $i
done
输出1,2,3,...... 36 不是文字或数字,所以我无法弄清楚我应该怎么做。
答案 0 :(得分:1)
您可以获取以空格分隔的PID列表,例如像这样(#34之后的第1列; PID&#34;):
l=`airmon-ng check | awk 'BEGIN { p=0 } { if (p) { print $1" "; } if ($1=="PID") { p=1 } }' | tr '\n' ' '`
答案 1 :(得分:1)
airmon-ng check | egrep -o '\b[0-9]+\b' | xargs kill
egrep
是带有扩展正则表达式的grep(例如grep -E
),-o
表示只提取匹配的部分,\b
匹配字边界,因此您不会t在进程名称或其他内容中意外发生任何数字,[0-9]+
匹配一个或多个十进制数字,xargs kill
将所有匹配作为参数传递给kill
命令。
请注意,解析旨在由人类阅读的输出可能并不总是一个好主意。而且,只是杀死所有这些过程并不会听起来太聪明,但正确使用airocrack是不可能的。
答案 2 :(得分:0)
我会使用awk
并将输出存储在数组
pids=( $(airmon-ng check | awk '/^[[:blank:]]+[[:digit:]]+[[:blank:]]+/{print $1}') )
#'pids' is an array
kill "${pids[@]}" #killing all the processes thus found.
答案 3 :(得分:0)
为什么不使用grep?
myvar=$(airmon-ng check | grep '[0-9]\{3,6\}')
这假定PID为3到6位,并且将从类似长度的airmon-ng输出中获取任何内容。因此,如果输出包含具有相似长度的数字的其他字符串,则这可能不起作用。