Bash 命令只在第一次执行

Bash command only executes the first time around

我有以下 nmap 命令:

nmap -n -p 25 10.11.1.1-254 --open | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\.[0-9]\{1,3\}' | cut -d" " -f5

这会生成一个 IP 地址列表,我正试图将其传递给以下 python 脚本:

#!/usr/bin/python


# Python tool to check a range of hosts for SMTP servers that respond to VRFY requests

import socket
import sys
from socket import error as socket_error

# Read the username file
with open(sys.argv[1]) as f:
    usernames = f.read().splitlines()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host_ip = sys.argv[2]

print("****************************")
print("Results for: " + host_ip)
try: 
    c = s.connect((host_ip,25))
    banner=s.recv(1024)

    #Send VRFY requests and print result
    for user in usernames:
        s.send('VRFY ' + user + '\r\n')
        result = s.recv(1024)
        print(result)

    print("****************************")
    #Close Socket
    s.close()

#If error is thrown
except socket_error as serr:
    print("\nNo SMTP verify for " +host_ip)
    print("****************************")

我尝试使用以下命令执行此操作,但它只是 运行 它找到的第一个 ip 上的脚本:

./smtp_verify.py users.txt $(nmap -n -p 25 10.11.1.1-254 --open | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\.[0-9]\{1,3\}' | cut -d" " -f5)

我也尝试过这样做:

for $ip in (nmap -n -p 25 10.11.1.1-254 --open | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\.[0-9]\{1,3\}' | cut -d" " -f5); do ./smtp_verify.py users.txt $ip done

但是我收到一个语法错误,提示我不能通过这种方式传递管道?

bash: syntax error near unexpected token `('

不要有意识地使用 for 循环来解析命令输出,请参阅带有 while 循环的 DontReadLinesWithFor, rather use a Process-Subtitution 语法

#!/bin/bash

while IFS= read -r line; do
    ./smtp_verify.py users.txt "$line"
done< <(nmap -n -p 25 10.11.1.1-254 --open | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\.[0-9]\{1,3\}' | cut -d" " -f5)

对于您可能看到的错误,您没有使用命令替换$(..)语法正确地运行管道命令,命令应该用 $ 包围在 () 周围。像,

#!/bin/bash

for ip in $(nmap -n -p 25 10.11.1.1-254 --open | grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\.[0-9]\{1,3\}' | cut -d" " -f5); do 
    ./smtp_verify.py users.txt "$ip" 
done

并记住始终对 shell 变量进行双引号以避免 Word Splitting 由 shell.

完成