Bash命令仅在第一次执行时执行

时间:2017-03-18 03:12:00

标签: python bash shell nmap

我有以下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:意外令牌附近的语法错误`('

1 个答案:

答案 0 :(得分:1)

不要有意识地使用for循环来解析命令输出,请参阅DontReadLinesWithFor,而是使用带有while循环的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)

对于您可能看到的错误,您 NOT 正确使用命令替换$(..)语法来运行管道命令,命令应该包含在{{1}周围在它之前加()。像,

$

并且记得要始终双引shell变量以避免shell完成Word Splitting