Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux监视命令在脚本中不工作_Linux_Bash_Shell_Ubuntu_Debian - Fatal编程技术网

Linux监视命令在脚本中不工作

Linux监视命令在脚本中不工作,linux,bash,shell,ubuntu,debian,Linux,Bash,Shell,Ubuntu,Debian,大家好 我正在编写一个脚本,用于定期监视与端口的连接(在本例中为80) 我写这篇短文 echo '=================================';a=`sudo lsof -i :80`;echo $a | awk '{print $1," ",$2," ",$3," ",$8}'; b=`echo $a | wc -l`; b=$(($b - 1));echo Total SSH Connections: $b;echo '========================

大家好

我正在编写一个脚本,用于定期监视与端口的连接(在本例中为80)

我写这篇短文

echo '=================================';a=`sudo lsof -i :80`;echo $a | awk '{print $1," ",$2," ",$3," ",$8}'; b=`echo $a | wc -l`; b=$(($b - 1));echo Total SSH Connections: $b;echo '================================='
输出为:

=================================  
COMMAND   PID   USER   NODE  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
acwebseca   90   root   TCP  
Total SSH Connections: 19  
=================================  
但是,当尝试使用watch命令时,它会抛出错误,当我取消该命令时,我看不到输出,我看到如下错误:

sh: PID: command not found
                          sh: -c: line 1: syntax error near unexpected token `('
                                                                                sh: -c: line 1: `acwebseca  90 root   37u  IPv4 0x81ae738f91e7bed9      0t0  TCP 192.168.0.11:49915->108.160.163.33:http (ESTABLISHED)'
我怎样才能解决这个问题

watch -n 2 "echo '=================================';a=`sudo lsof -i :80`;echo $a | awk '{print $1," ",$2," ",$3," ",$8}'; b=`echo $a | wc -l`; b=$(($b - 1));echo Total SSH Connections: $b;echo '================================='"

如果您将脚本写入一个文件并执行它,它就会工作。那么它不一定是一个可怕的单衬里,但可以像这样:

echo '================================='
a=`sudo lsof -i :80`
echo $a | awk '{print $1," ",$2," ",$3," ",$8}'
b=`echo $a | wc -l`
b=$(($b - 1))
echo Total SSH Connections: $b
echo '================================='
把它放在一个文件中,然后运行
watch my script.sh
。这解决了问题,同时使代码可读

编辑:如果你真的想要一行,这是一个坏主意,你可以试试这个:

watch 'echo =================================;a=`lsof -i :80`;echo $a | awk "{print \$1, \$2, \$3, \$8}"; b=`echo $a | wc -l`; b=$(($b - 1));echo Total SSH Connections: $b;echo ================================='

基本上,我调整了报价,使其正常运行;我可能稍微弄乱了awk的格式,但我相信如果需要的话,您可以将其重新修改成正确的形状。

引自
人工观察

Note that command is given to "sh -c" which means that you may need
to use extra quoting to get the desired effect.  You can disable this
with the -x or --exec option, which passes the command to exec(2) instead.

Note that POSIX option processing is used (i.e., option processing stops
at the first non-option argument).  This means that
flags after command don't get interpreted by watch itself.

这与其说是一个答案,不如说是一个注释,因为我不打算将命令传递给
watch
。但是格式化评论很难。通过在awk中执行更多操作,可以大大简化命令:

 sudo lsof -i :80 | awk '
      BEGIN { d="================================="; print d}
      {print $1," ",$2," ",$3," ",$8}'
      END { print "Total SSH Connections:", NR-1; print d}'

我知道。但有没有办法做到“一行”呢?你为什么要这么做?与我更好的判断相反,我在我的答案中添加了一个例子。是的,我需要它工作,而不管代码的可读性:)我应该在哪里应用这个?桌面手表用法:手表[-dhntv][--差异[=累积][--帮助][--间隔][--无标题][--版本]谢谢@William_Pursell,我正在查找。我知道这可以用一种更好的方式来实现,就像你的一样,但这是为了测试watch命令,并在里面引用。