Bash命令只在第一次执行

2024-04-18 08:20:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下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 `('


Tags: importiphostforassyserrorsocket
1条回答
网友
1楼 · 发布于 2024-04-18 08:20:23

不要有意识地使用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)

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

#!/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变量,以避免shell执行Word Splitting。你知道吗

相关问题 更多 >