简体   繁体   English

Python GetHostId.py获取sys.argv [1] IndexError:列表索引超出范围

[英]Python GetHostId.py getting sys.argv[1] IndexError: list index out of range

i am working on a python script to be a multi tool for getting DNS information on servers in a enterprise env. 我正在使用python脚本作为要在企业环境中的服务器上获取DNS信息的多功能工具。 so far the script i have is using python 3.5. 到目前为止,我拥有的脚本正在使用python 3.5。 i am using argparse for creating command line options, which i am trying to create an if/ elif / else statement which contains the different selections. 我正在使用argparse创建命令行选项,我正在尝试创建一个包含不同选择的if / elif / else语句。 the main error message i am getting is: 我收到的主要错误消息是:

./GetHostName.py
Traceback (most recent call last):
  File "./GetHostName.py", line 34, in <module>
    remoteServer = sys.argv[1]
IndexError: list index out of range

that is when the command is run by itself. 也就是命令本身运行时。 when it is run with a host name at the end ./GetHostName.py hostName it gives this message: 当它以./GetHostName.py hostName结尾的主机名运行时,它将显示以下消息:

GetHostName.py: error: unrecognized arguments: hostName 

I didn't put real name of server for security issues.... When i use the argparse options say like the -f option for getting the FQDN, it gives this response... 对于安全性问题,我没有提供服务器的真实名称。...当我使用argparse选项时,如-f选项那样获取FQDN,它会给出此响应...

./GetHostName.py -f hostName
3
-f

from the way it appears, it is taking the -f as input for the server name, when it should only be the input for argparse input. 从出现的方式来看,它仅将-f作为服务器名称的输入,而应仅将其作为argparse输入的输入。 i have tried everything to fix it that i can think of. 我已经尽力解决了我能想到的问题。 i have encased the main code body in a main function, that didn't work so i removed it. 我已经将主要代码主体包裹在一个主要函数中,但是没有用,所以我删除了它。 i use the try: statement and exception statements. 我使用try:语句和异常语句。 that didn't work. 那没有用。 i am wondering if there is something just basically wrong with my programming logic at this point... 我想知道此时我的编程逻辑是否存在根本上的错误...

this here is the code from the script: 这是脚本中的代码:

#!C:\Bin\Python35\python.exe
# 

# import libraries
import sys, os
import argparse as ap
import socket

# Command Line interface setup


def argParse():
    #Command Line arg parse
    parser=ap.ArgumentParser(description='A tool to get a remote servers DNS information.')
    parser.add_argument("-a", "--address", default="fqdn", help="Gets IP address from host name.")
    parser.add_argument("-f", "--fqdn", default="fqdn", help="Gets the FQDN address of server.")
    parser.add_argument("-d", "--addrinfo", default="fqdn", help="Gets the FQDN address of server.")
    parser.add_argument("-l", "--local", default="fqdn", help="Gets info on local host.")
    parser.add_argument("-Pr", "--proto",  default="fqdn", help="Translate an Internet protocol name to a constant suitable for passing as the (optional) third argument to the socket() function.")
    parser.add_argument("-n", "--nameinfo", default="fqdn", help="Gets name and port on remote host.")
    parser.add_argument("-Sn", "--servbyname", default="fqdn", help="Translate an Internet service name and protocol name to a port number for that service.")
    parser.add_argument("-Sp", "--servbyport",  default="fqdn", help="Translate an Internet port number and protocol name to a service name for that service.")
    parser.add_argument("-t", "--timeout", default="fqdn", help="Return the default timeout in seconds for new socket objects.")
    parser.add_argument("-v", "--verbose",  default="fqdn", help="Increase output verbosity")
    return parser.parse_args()
    #remoteServer = input().strip().split()

args=argParse()




if args.fqdn:
    remoteServer = sys.argv[1]
    print (len(sys.argv))
    remoteServerIP = socket.getfqdn(remoteServer)
    print (remoteServerIP)

elif args.address:
    remoteServer = sys.argv[2]
    print (len(sys.argv))
    remoteServerIP = socket.gethostbyname(remoteServer)
    print (remoteServerIP)

elif args.addrinfo:
    remoteServer = sys.argv[3]
    print (len(sys.argv))
    remoteServerIP = socket.getaddrinfo(remoteServer)
    print (remoteServerIP)

elif args.local:
    remoteServer = sys.argv[4]
    print (len(sys.argv))
    remoteServerIP = socket.gethostname()
    print (remoteServerIP)  

 elif args.proto:
    remoteServer = sys.argv[5]
    print (len(sys.argv))
    remoteServerIP = socket.getprotobyname(remoteServer)
    print (remoteServerIP)

elif args.servbyname:
    remoteServer = sys.argv[6]
    print (len(sys.argv))
    remoteServerIP = socket.getservbyname(remoteServer)
    print (remoteServerIP)

elif args.servbyport:
    remoteServer = sys.argv[7]
    print (len(sys.argv))
    remoteServerIP = socket.getservbyport(remoteServer)
    print (remoteServerIP)

elif args.timeout:
    remoteServer = sys.argv[8]
    print (len(sys.argv))
    remoteServerIP = socket.getdefaulttimeout(remoteServer)
    print (remoteServerIP)

elif args.verbose:
    remoteServer = sys.argv[9]
    print (len(sys.argv))
    remoteServerIP = socket.gethostbyaddr(remoteServer)
    print (remoteServerIP)

else:
    args.nameinfo
    remoteServer = sys.argv[10]
    print (len(sys.argv))
    remoteServerIP = socket.getnameinfo(remoteServer)
    print (remoteServerIP)

any help would be appreciated. 任何帮助,将不胜感激。 please note that when i run a script with just this in it, it works just fine: 请注意,当我运行一个仅包含脚本的脚本时,它就可以正常工作:

#!C:\Bin\Python35\python.exe
#
import sys, os
import argparse
import socket

# Command Line interface setup
def main():
        remoteServer = sys.argv[1]
        remoteServerIP = socket.gethostbyaddr(remoteServer)
        print (remoteServerIP)

if __name__ == '__main__':
    main()

thanks in advance. 提前致谢。 -Betzelel -Betzelel

PS the code may look out of format, due to having to copy and paste into this blog, and manually putting 4 spaces on to each line to get it to show up as code lol. PS:由于必须复制并粘贴到此博客中,并且手动在每行上放置4个空格以使其显示为代码大声笑,因此代码的格式可能不正确。

I've had this problem long time ago. 我很久以前就有这个问题。 To fix this I've changed 为了解决这个问题,我改变了

parser.add_argument("-a", "--address", default="fqdn", help="Gets IP address from host name.")

in

parser.add_argument("-a", "--address", default="fqdn", help="Gets IP address from host name.", dest=ipfromhostname)

So for getting the value from -a you have to change 因此,要从-a获取值,您必须进行更改

remoteServer = sys.argv[1]

in

remoteServer = args.ipfromhostname

where ipfromhostname is the dest value. 其中ipfromhostnamedest值。

EDIT: 编辑:

You have to do this operation for every parser.add_argument 您必须对每个parser.add_argument执行此操作parser.add_argument

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 IndexError:列表索引超出范围:sys.argv[1] 超出范围 - IndexError: list index out of range: sys.argv[1] out of range sys.argv[1] 索引错误:列表索引超出范围 - sys.argv[1] IndexError: list index out of range 错误:文件“ xml_parser.py”的第5行 <module> out_file = sys.argv [2] IndexError:列表索引超出范围 - Error: File “xml_parser.py”, line 5, in <module> out_file = sys.argv[2] IndexError: list index out of range driver.get(sys.argv[1]) 在 PC 上正常工作,而在其他 PC 上工作正常(sys.argv[1],IndexError: list index out of range 错误) - driver.get(sys.argv[1]) working fine on a PC and not on the other (sys.argv[1], IndexError: list index out of range error) Python sys.argv [1]索引超出范围 - Python sys.argv[1] index out of range python sys.argv[1] 列表索引超出范围 - python sys.argv[1] list index out of range Sys.argv python错误列表索引超出范围 - Sys.argv python error list index out of range 我在使用Python命令“ cascPath = sys.argv [1]”时遇到问题,出现错误IndexError:列表索引超出范围 - Iam having trouble with Python command “ cascPath = sys.argv[1] ” i get error IndexError: list index out of range ds = data_set(sys.argv [1])IndexError:列表索引超出范围 - ds = data_set(sys.argv[1]) IndexError: list index out of range 使用 sys.argv[1] 和 numpy 数组将多个 arguments 传递给 Python 脚本。 IndexError:列表索引超出范围 - Passing multiple arguments to Python script using sys.argv[1] and numpy array. IndexError: list index out of range
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM