脚本读取输出到 运行 下一个命令
Script read the output to run the next command
我无法执行此操作,因为我是脚本编写新手,我需要一个脚本,该脚本应在文件中提到的所有服务器上提供 运行。
首先它应该登录到服务器
第一个命令是 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 }' | grep "/" | awk -F "/" '{print }'
echo
done 10< demo
netstat -tulpunt | grep -E ":25 " | awk '{print }' | grep "/" | awk -F "/" '{print }' | xargs -I % bash -c 'echo Port % && ps -ef | grep % && echo ' | grep -v grep
开始于
netstat -tulpun
管道进入 grep,但还包括冒号和 space 以排除其中包含 25 的端口:
grep ":25 "
然后将其通过管道传输到 AWK 中以显示第七列
awk '{print }'
只取带有斜杠的(不是唯一的破折号)
grep "/"
然后取PID
awk -F "/" '{print }'
通过管道传递给所有进程 ID
netstat -tulpunt | grep ":25 " | awk '{print }' | grep "/" | awk -F "/" '{print }'
现在将其通过管道传输到 xargs 以执行以该参数为参数的命令
netstat -tulpunt | grep ":25 " | awk '{print }' | grep "/" | awk -F "/" '{print }' | xargs -I % sh -c 'echo Port % && ps -ef | grep % && echo '
类似的东西?试着理解每一步,看看发生了什么。
编辑:要遍历服务器列表,创建一个 bash 文件,如下所示:
#!/bin/bash
cat serverlist.txt | while read line
do
ssh $line "netstat -tulpunt | grep ':25 ' | awk '{print }' | grep '/' | awk -F '/' '{print }' | xargs -I % sh -c 'echo Port % && ps -ef | grep % && echo "
done
保存到something.sh
并执行
./something.sh
它像这样循环遍历文件中的服务器列表
user1@server1.com
user2@server2.com
...
如果需要给密码,可以这样做:
user1:pass1@server1.com
user2:pass2@server2.com
...
虽然我没有对此进行测试,因此某处可能存在语法错误:)
我在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=
# 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
此致
我无法执行此操作,因为我是脚本编写新手,我需要一个脚本,该脚本应在文件中提到的所有服务器上提供 运行。
首先它应该登录到服务器
第一个命令是 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
命令
输出应如下所述
=====
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 }' | grep "/" | awk -F "/" '{print }'
echo
done 10< demo
netstat -tulpunt | grep -E ":25 " | awk '{print }' | grep "/" | awk -F "/" '{print }' | xargs -I % bash -c 'echo Port % && ps -ef | grep % && echo ' | grep -v grep
开始于
netstat -tulpun
管道进入 grep,但还包括冒号和 space 以排除其中包含 25 的端口:
grep ":25 "
然后将其通过管道传输到 AWK 中以显示第七列
awk '{print }'
只取带有斜杠的(不是唯一的破折号)
grep "/"
然后取PID
awk -F "/" '{print }'
通过管道传递给所有进程 ID
netstat -tulpunt | grep ":25 " | awk '{print }' | grep "/" | awk -F "/" '{print }'
现在将其通过管道传输到 xargs 以执行以该参数为参数的命令
netstat -tulpunt | grep ":25 " | awk '{print }' | grep "/" | awk -F "/" '{print }' | xargs -I % sh -c 'echo Port % && ps -ef | grep % && echo '
类似的东西?试着理解每一步,看看发生了什么。
编辑:要遍历服务器列表,创建一个 bash 文件,如下所示:
#!/bin/bash
cat serverlist.txt | while read line
do
ssh $line "netstat -tulpunt | grep ':25 ' | awk '{print }' | grep '/' | awk -F '/' '{print }' | xargs -I % sh -c 'echo Port % && ps -ef | grep % && echo "
done
保存到something.sh
并执行
./something.sh
它像这样循环遍历文件中的服务器列表
user1@server1.com
user2@server2.com
...
如果需要给密码,可以这样做:
user1:pass1@server1.com
user2:pass2@server2.com
...
虽然我没有对此进行测试,因此某处可能存在语法错误:)
我在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=
# 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
此致