簡體   English   中英

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

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

我正在使用python腳本作為要在企業環境中的服務器上獲取DNS信息的多功能工具。 到目前為止,我擁有的腳本正在使用python 3.5。 我正在使用argparse創建命令行選項,我正在嘗試創建一個包含不同選擇的if / elif / else語句。 我收到的主要錯誤消息是:

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

也就是命令本身運行時。 當它以./GetHostName.py hostName結尾的主機名運行時,它將顯示以下消息:

GetHostName.py: error: unrecognized arguments: hostName 

對於安全性問題,我沒有提供服務器的真實名稱。...當我使用argparse選項時,如-f選項那樣獲取FQDN,它會給出此響應...

./GetHostName.py -f hostName
3
-f

從出現的方式來看,它僅將-f作為服務器名稱的輸入,而應僅將其作為argparse輸入的輸入。 我已經盡力解決了我能想到的問題。 我已經將主要代碼主體包裹在一個主要函數中,但是沒有用,所以我刪除了它。 我使用try:語句和異常語句。 那沒有用。 我想知道此時我的編程邏輯是否存在根本上的錯誤...

這是腳本中的代碼:

#!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)

任何幫助,將不勝感激。 請注意,當我運行一個僅包含腳本的腳本時,它就可以正常工作:

#!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()

提前致謝。 -Betzelel

PS:由於必須復制並粘貼到此博客中,並且手動在每行上放置4個空格以使其顯示為代碼大聲笑,因此代碼的格式可能不正確。

我很久以前就有這個問題。 為了解決這個問題,我改變了

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

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

因此,要從-a獲取值,您必須進行更改

remoteServer = sys.argv[1]

remoteServer = args.ipfromhostname

其中ipfromhostnamedest值。

編輯:

您必須對每個parser.add_argument執行此操作parser.add_argument

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM