尽管之前的If语句为真,但Elif语句仍被执行。

问题描述 投票:0回答:1

按照Udemy上的课程,我一直想做一个程序,在Linux中使用ifconfig命令,配合subprocess和opparse模块,自动改变一个接口的mac地址。

我的问题是关于下面get_arguments()函数中的elif语句,我想让程序在没有指定参数的情况下在命令行运行,然后要求用户输入接口和new_mac变量。

不知为何,用下面写的get_arguments()函数。

elif not options.interface:
     parser.error("[-] Please specify an interface. Use -- help for more info.")

如果在命令行上运行程序时没有指定参数,那么程序将被执行,打印文本并以parser.error()停止程序,甚至不要求输入。

但是,这样写的话。

if options.interface or options.new_mac:
     if not options.interface:
          parser.error("[-] Please specify an interface. Use -- help for more info.")
     if not options.new_mac:
          parser.error("[-] Please specify a new MAC address. Use --help for more info.")
     else:
          return options

程序会停下来获取输入,一切都会好起来。

这就是程序。

#!/usr/bin/env python

import subprocess
import optparse


def get_arguments():
    parser = optparse.OptionParser()
    parser.add_option("-i", "--interface", dest="interface", help="Interface to change MAC address")
    parser.add_option("-m", "--mac", dest="new_mac", help="New MAC address")
    (options, arguments) = parser.parse_args()
    if not options.interface and options.new_mac:
         options = False
         return options
    elif not options.interface:
         parser.error("[-] Please specify an interface. Use -- help for more info.")
    elif not options.new_mac:
         parser.error("[-] Please specify a new MAC address. Use --help for more info.")
    else:
         return options

def change_mac(interface, new_mac):
    print("[+] Changing MAC address for '" + interface + "' to '" + new_mac + "'")
    subprocess.call(["sudo", "ifconfig", interface, "down"])
    subprocess.call(["sudo", "ifconfig", interface, "hw", "ether", new_mac])
    subprocess.call(["sudo", "ifconfig", interface, "up"])
    subprocess.call(["sudo", "ifconfig", interface])
    print("[+] Done!")


options = get_arguments()

if not options:
     interface = raw_input("Specify interface > ")
     new_mac = raw_input("Specify new MAC address > ")
     change_mac(interface, new_mac)
else:
     change_mac(options.interface, options.new_mac)
python subprocess optparse
1个回答
0
投票

只要在解析后立即检查每个选项是否有值,并在这时提示用户取值即可。不需要一个 elif; 独立处理每一个就好。

另外,不要使用 optparse;使用 argparse 来代替。

#!/usr/bin/env python

import subprocess
import argparse


def get_arguments():
    parser = argparse.ArgumentParser()
    parser.add_argument("-i", "--interface", dest="interface", help="Interface to change MAC address")
    parser.add_argument("-m", "--mac", dest="new_mac", help="New MAC address")
    args = parser.parse_args()
    if args.interface is None:
        args.interface = raw_input("Specify interface > ")

    if args.new_mac is None:
        args.new_mac = raw_input("Specify new MAC address > ")

    return args


def change_mac(interface, new_mac):
    print("[+] Changing MAC address for '" + interface + "' to '" + new_mac + "'")
    subprocess.call(["sudo", "ifconfig", interface, "down"])
    subprocess.call(["sudo", "ifconfig", interface, "hw", "ether", new_mac])
    subprocess.call(["sudo", "ifconfig", interface, "up"])
    subprocess.call(["sudo", "ifconfig", interface])
    print("[+] Done!")


args = get_arguments()
change_mac(args.interface, args.new_mac)

我还强烈建议,作为初学者,你应该换成Python 3。

© www.soinside.com 2019 - 2024. All rights reserved.