linux - 脚本读取输出以运行下一个命令

标签 linux bash shell

我无法执行此操作,因为我是脚本编写新手,我需要一个可以在文件中提到的所有服务器上运行的脚本。

首先应该登录服务器
第一个命令是 netstat -tulpun | grep -i port (端口和服务器列表位于同一文件中)

我可能会在这里得到 3 到 4 个输出,但我只需要 25 端口输出而不是其他端口

# netstat -tulpun | grep -i 25   
tcp        0      0 127.0.0.1:25                0.0.0.0:*             LISTEN    25/sendmail  
udp        0      0 0.0.0.0:19258               0.0.0.0:*  

第二个命令是 ps -ef | grep我从netstat获得的PID命令

输出应如下所示

=====  
Server1  
Port 1311  
root      8063  8062  0  2014 ?        00:08:06 /opt/dm_cd -run  

=====  
Server2  
Port 1311  
root      6844  6843  0  2014 ?        00:20:22 /etc/bin/linux/ds -run  

=====  
Server3  
Port 8000  
applmgr   1505  4215  0  2014 ?        00:05:44 /app/Apache/bin/httpd -d   

=====   
Server4  
Port 1311  
root      8122  8121  0  2014 ?        01:30:36 /opt/dsvcd -run  

=====  
Server5  
Port 1888  
root     10097 10096  0  2014 ?        01:29:00 /etc/32d -run  


while read -r -u10 server port line  
do  
  echo ==========  server: "$server" port: "$port"  ==========  
  ssh -qn "$server" "netstat -tulpun | grep -E \"\b$port\b\"" | awk '{print $7}' | grep "/" | awk -F "/" '{print $1}'  
  echo  
done 10< demo  

 netstat -tulpunt | grep -E ":25 " | awk '{print $7}' | grep "/" | awk -F "/" '{print $1}' | xargs -I % bash -c 'echo Port % && ps -ef | grep % && echo ' | grep -v grep

最佳答案

我在端口 25 上没有运行任何服务,但在端口 5433 上有服务,因此我将在该端口上使用该端口进行演示。

我的环境

$ ps -ef | grep ':5433'
daniel@synapse:~$ ps -ef | grep 5433
daniel    2824  1967  1 12:36 ?        00:05:43 /opt/vertica/bin/vertica -D /vertica/dev/v_dev_node0001_catalog -C dev -n v_dev_node0001 -h 127.0.0.1 -p 5433 -P 4803 -Y ipv4
daniel    9455  2702  0 20:27 pts/1    00:00:00 grep --color=auto 5433
<小时/>

我们应该避免在 grep 中使用,否则你会得到 grep 的垃圾行在输出中。

那么我们怎样才能得到想要的输出呢?

  • lsof提取进程 ID(应用程序 PID)
  • ps得到想要的输出

演示:

$ ps -p $(lsof -ti tcp:5433) o user=,pid=,ppid=,c=,stime=,tty=,time=,command=
daniel    2824  1967  1 12:36 ?        00:05:53 /opt/vertica/bin/vertica -D /vertica/dev/v_dev_node0001_catalog -C dev -n v_dev_node0001 -h 127.0.0.1 -p 5433 -P 4803 -Y ipv4

正如我们所见,输出与 ps -ef | grep ${PID} 相同并且没有带有 grep 的垃圾行.

现在我们准备编写最终脚本:

#!/usr/bin/env bash
# author: Daniel Leybovich

# list of hosts to check
declare -a CLUSTER=(localhost synapse 127.0.0.1 46.210.138.27)

# port
LOOKUP_PORT=5433

# run main task
for HOST in ${CLUSTER[@]}
do
    echo "===="
    echo "HOST: ${HOST}"
    echo "PORT: ${LOOKUP_PORT}"
    ssh -x ${HOST} "ps -p $(lsof -ti tcp:5433) o user=,pid=,ppid=,c=,stime=,tty=,time=,command="    
done

# we are done
exit 0

这是脚本的输出:

daniel@synapse:/tmp$ ./reds.sh
====
HOST: localhost
PORT: 5433
daniel    2824  1967  1 12:36 ?        00:06:01 /opt/vertica/bin/vertica -D /vertica/dev/v_dev_node0001_catalog -C dev -n v_dev_node0001 -h 127.0.0.1 -p 5433 -P 4803 -Y ipv4
====
HOST: synapse
PORT: 5433
daniel    2824  1967  1 12:36 ?        00:06:01 /opt/vertica/bin/vertica -D /vertica/dev/v_dev_node0001_catalog -C dev -n v_dev_node0001 -h 127.0.0.1 -p 5433 -P 4803 -Y ipv4
====
HOST: 127.0.0.1
PORT: 5433
daniel    2824  1967  1 12:36 ?        00:06:01 /opt/vertica/bin/vertica -D /vertica/dev/v_dev_node0001_catalog -C dev -n v_dev_node0001 -h 127.0.0.1 -p 5433 -P 4803 -Y ipv4
====
HOST: 46.210.138.27
PORT: 5433
daniel    2824  1967  1 12:36 ?        00:06:01 /opt/vertica/bin/vertica -D /vertica/dev/v_dev_node0001_catalog -C dev -n v_dev_node0001 -h 127.0.0.1 -p 5433 -P 4803 -Y ipv4

根据需要修改脚本。

编辑

我修改了脚本。

文件 hosts.txt :

daniel@node1:5433
johns@node1:4803
johns@node2:5444
johns@node3:4803
daniel@node4:80

脚本 reds.sh :

#!/usr/bin/env bash
# author: Daniel Leybovich

# file with lookup params
HOSTS_FILE=${1}


# run main task
for LINE in $(cat ${HOSTS_FILE})
do
    USER=$(echo ${LINE} | cut -d'@' -f1)
    HOST=$(echo ${LINE} | cut -d'@' -f2 | cut -d':' -f1)
    PORT=$(echo ${LINE} | cut -d':' -f2)
    echo "===="
    echo "HOST: ${HOST}"
    echo "USER: ${USER}"
    echo "PORT: ${PORT}"
    ssh "${USER}@${HOST}" -x \
        "ps -p $(lsof -ti tcp:${PORT}) o user=,pid=,ppid=,c=,stime=,tty=,time=,command="
done

# we are done
exit 0

输出

daniel@synapse:/tmp$ ./reds.sh /tmp/hosts.txt
====
HOST: node1
USER: daniel
PORT: 5433
daniel    2934  1902  1 13:51 ?        00:00:31 /opt/vertica/bin/vertica -D /vertica/dev/v_dev_node0001_catalog -C dev -n v_dev_node0001 -h 127.0.0.1 -p 5433 -P 4803 -Y ipv4
====
HOST: node1
USER: johns
PORT: 4803
daniel    2932  1902  0 13:51 ?        00:00:00 /opt/vertica/spread/sbin/spread -c /vertica/dev/v_dev_node0001_catalog/spread.conf
====
HOST: node2
USER: johns
PORT: 5444
daniel    1353  1345  0 13:48 ?        00:00:18 /opt/vertica/oss/python/bin/python ./simply_fast.py
====
HOST: node3
USER: johns
PORT: 4803
daniel    2932  1902  0 13:51 ?        00:00:00 /opt/vertica/spread/sbin/spread -c /vertica/dev/v_dev_node0001_catalog/spread.conf
====
HOST: node4
USER: daniel
PORT: 80
daniel    2484  1902  5 13:48 ?        00:02:18 /usr/lib/firefox/firefox

问候

关于linux - 脚本读取输出以运行下一个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27943945/

相关文章:

linux - 我无法在 linux mint 上安装工具包 srilm

c - 在我自己的 C shell 中管道

linux - while循环bash中的if语句

Linux shell 命令反转变长文本记录的字段顺序

java - IntelliJ 嵌入式 Java JVM 插件 bash 错误

c++ - 如何保证共享库在 Linux 发行版之间可移植?

linux - 在 perl 中的 SSH 中执行第二次 SSH

bash - 当 docker 以 PID 1 运行时,为什么我不能在 docker 中 CTRL-C sleep 无穷大

linux - 如何获取特定目录的完整路径?

linux - 检查 docker-compose 服务是否正在运行