我正在尝试编写一个脚本来查找反向SSH PID,如果存在则将其终止。因为它给出错误,我被困在“awk”上。下面是剧本:
a=('ps -aef | grep "ssh -fN" | grep -v grep | awk '{ print $2 }'')
if [ -n "$a" ]
then
echo "String \"$a\" is not null."
kill -9 "$a"
fi
我注释掉了,然后,杀死和fi行来调试脚本。我收到以下错误:
String "ps -aef | grep "ssh -fN" | grep -v grep | awk {" is not null.
我相信awk的括号正在创建问题,我无法为此找到解决方法。在命令行上,这完美地工作并返回正确的PID。
ps -aef | grep "ssh -fN" | grep -v grep | (awk '{ print $2 }'
将PID传递给变量“a”后,我需要发出kill命令。操作系统是Centos 6.4
P.S:我不会说流利的脚本,但试图实现目标。帮助将受到高度赞赏!答案 0 :(得分:1)
您的脚本存在多个问题。
ps
管道的输出存储到数组中。以下内容可能适合您:
pids=( $(ps -ef | grep '[s]sh -fN' | awk '{print $2}') )
if [ "${#pids[@]}" -gt 0 ]; then
kill -9 "${pids[@]}";
fi
答案 1 :(得分:0)
首先,如果你有grep
然后awk
,你可以摆脱这些油脂:
ps -aef | grep "ssh -fN" | grep -v grep | awk '{ print $2 }'
ps -aef |awk ' { if ( ($0 ~ /ssh -FN/) && (! $0 ~ /grep/) ) { print $2 } }'
但是,请使用pgrep
。
ps
pgrep -f "ssh -[fN][fN]" # Will match against either 'ssh -fN' or 'ssh -Nf'
甚至有一个pkill
会为你完成整个命令:
pkill -f "ssh -[fN][fN]"
这将找到与该特定字符串匹配的所有进程并将其终止(如果它们存在)。