2016-08-01 189 views
0

我一直在搜索互联网寻找答案。请不要我的python编码技能不是很好。我想创建一个命令行脚本,它将从这样的命令行输入:Python - 如何从命令行输入并将其输入到socket.gethostbyaddr(“”)

$python GetHostID.py serverName.com 

的最后一部分,我想传递一个变量socket.gethostbyaddr(“”)是什么模块。这是我迄今为止的代码。有人可以帮我弄清楚如何把这个变量放到(“”)中。我认为使用一个简单的变量名会产生问题,因为它试图把它当作一个字符串来处理变量名。 这里是我在我的脚本代码:

#!/bin/python 
# 
import sys, os 
import optparse 
import socket 


remoteServer = input("Enter a remote host to scan: ") 
remoteServerIP = socket.gethostbyaddr(remoteServer) 
socket.gethostbyaddr('remoteServer')[0] 
os.getenv('remoteServer') 
print (remoteServerIP) 

任何帮助将受到欢迎。我一直在绞尽脑汁... 谢谢

+1

为什么你认为你需要把'remoteServer'放在引号中? – zwol

+0

当我做出来的报价似乎错误了。文件“C:\ Bin \ Scripts \ PyTools \ tiniGetHost.py”,第10行,在 socket.gethostbyaddr('remoteServer')[0] socket.gaierror:[Errno 11004] getaddrinfo失败 – betzelel

+0

我删除了引号,它在python shell中运行成功,但是当我在bash shell下运行它时,它似乎没有注意到我添加了服务器名称,然后出错......➤python tiniGetHost.py serverName 输入要扫描的远程主机:serverName#必须采用真实姓名发布....# 回溯(最近呼叫最后): 文件“tiniGetHost.py”,第8行,在 remoteServer = input(“输入要扫描的远程主机: “) 文件”“,第1行,在 N ameError:名称'serv'没有定义 – betzelel

回答

0

os.getenv('remoteserver')不使用变量remoteserver作为参数。相反,它使用一个字符串'remoteserver'。

另外,你是否想把输入作为命令行参数?或者你是否想把它当作用户输入?您的问题描述和实施有所不同。最简单的方法是使用

python GetHostID.py 

和运行脚本,然后在你的代码包括

remoteServer = raw_input().strip().split() 

得到你想要的REMOTESERVER输入。

0

可以使用sys.argv

$python GetHostID.py serverName.com 

sys.argv

['GetHostID.py', 'serverName.com'] 

但友善的用户有一个看看argparse Tutorial

1

命令行参数可用作lis t sys.argv,其第一个元素是程序的路径。有一个数字,你可以使用库(argparse,optparse等)来分析命令行的,但是对于你的简单的应用程序,你可以做这样的事情:

import sys 
import sys, os 
import optparse 
import socket 
remoteServer = sys.argv[1] 
remoteServerIP = socket.gethostbyaddr(remoteServer) 
print (remoteServerIP) 

使用命令行

运行这个程序
$ python GetHostID.py holdenweb.com 

给出输出

('web105.webfaction.com', [], ['108.59.9.144']) 
+0

真棒,非常感谢你!我有另一个与此有关的问题。对于套接字模块,是否有一个函数可用于告知服务器正在运行的远程操作系统?我处于一种严重的防火墙/安全锁定env后面的情况,所以我无法安装python模块,比如scapy ......所以我不得不依赖于我能够使用默认值进行编码python 3.5包。任何想法都会很棒。 – betzelel

+0

不是一个简单的问题,我个人并不知道可能会解决这个问题的库。大多数这样的“客户端指纹识别”依赖于关于TCP/IP协议栈之间差异的神秘知识以及它们对特定探测器的响应之间的细微差异。你可以阅读'nmap'实用程序来了解什么是可能的,但积极的客户端指纹不是一个简单的或者常见的任务。 – holdenweb

0

在Python 2,input读取文本并评估其作为在c Python表达式urrent背景。这几乎不是你想要的;您需要改为raw_input。但是,在Python 3中,input在版本2中做了raw_inputraw_input不可用。

所以,如果你需要你的代码工作都 Python 2和3,你应该将进口块后做这样的事情:

# Apply Python 3 semantics to input() if running under v2. 
try: 
    input = raw_input 
    def raw_input(*a, **k): 
     raise NameError('use input()') 
except NameError: 
    pass 

这在Python 3里没有影响,但在v2它用raw_inputraw_input取代股票input与一个总是抛出异常(所以你注意到,如果你不小心使用raw_input)的功能。

如果您发现自己需要平滑处理v2和v3之间差异的批次,那么python-future库可能会让您的生活更轻松。