2016-08-01 128 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庫可能會讓您的生活更輕鬆。