2016-08-01 12 views
0

Ich habe das Internet auf der Suche nach der Antwort auf diese Suche. Bitte nicht meine Python Coding-Fähigkeiten sind nicht so toll. Ich versuche, ein Kommandozeilen-Skript zu erstellen, die die Eingabe von der Befehlszeile wie folgt statt:Python - Wie nehme ich die Eingabe von der Befehlszeile und pipe es in socket.gethostbyaddr ("")

$python GetHostID.py serverName.com 

der letzte Teil ist das, was ich bin zu wollen als Variable weitergeben socket.gethostbyaddr („“) Modul. Das ist der Code, den ich bisher habe. kann jemand mir helfen, herauszufinden, wie man diese Variable in den ("") steckt. Ich denke, dass das "" Probleme mit der Verwendung eines einfachen Variablennamens verursacht, da es versucht, es als eine Textzeichenfolge wie einem Variablennamen zu behandeln. hier ist der Code, den ich in meinem Skript haben:

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

jede Hilfe willkommen wäre. Ich habe mein Gehirn über diese ... Dank

+1

Warum müssen Sie 'remoteServer' in Anführungszeichen setzen? – zwol

+0

Wenn ich es ohne die Anführungszeichen mache, scheint es zu einem Fehler zu kommen. Datei "C: \ Bin \ Skripte \ PyTools \ tiniGetHost.py", Zeile 10, in socket.gethostbyaddr ('remoteServer') [0] socket.gaierror: [Errno 11004] getaddrinfo fehlgeschlagen – betzelel

+0

ich entfernte die Anführungszeichen, es lief erfolgreich in der Python-Shell, aber wenn ich es unter der Bash-Shell ausführe, scheint es nicht zu bemerken, dass ich den Servernamen hinzugefügt habe, und dann Fehler aus ... ➤ python tiniGetHost.py serverName Geben Sie einen Remote-Host zum Scannen ein : serverName # musste den richtigen Namen für die Buchung nehmen ... # Traceback (letzter Anruf zuletzt): Datei "tiniGetHost.py", Zeile 8, in remoteServer = Eingabe ("Geben Sie einen entfernten Host zum Scannen ein: ") Datei" ", Zeile 1, in N ameError: Name 'Serv' ist nicht definiert – betzelel

Antwort

0

os.getenv ('Remoteserver') verwendet nicht die Variable remoteserver als Argument. Stattdessen verwendet es eine Zeichenfolge 'remoteserver'.

Versuchen Sie auch, die Eingabe als Befehlszeilenargument zu verwenden? Oder versuchen Sie es als Benutzereingabe zu nehmen? Ihre Problembeschreibung und Implementierung unterscheiden sich hier. Der einfachste Weg wäre Ihr Skript ausgeführt werden soll mit

python GetHostID.py 

und dann im Code enthalten

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

bekommen Sie den Eingang für Entfernter_Server wollen.

0

können Sie sys.argv

verwenden für

$python GetHostID.py serverName.com 

sys.argv

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

wäre aber für haben am argparse Tutorial

1

Die Linie einen Blick auf die benutzerfreundliche sein Kommando Argumente sind als lis verfügbar t sys.argv, dessen erstes Element der Pfad zum Programm ist. Es gibt eine Reihe von Bibliotheken, die Sie verwenden können (argparse, optparse, etc.) über die Befehlszeile zu analysieren, sondern auch für Ihre einfache Anwendung, die Sie so etwas tun könnten:

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

Ausführen dieses Programms mit der Befehlszeile

$ python GetHostID.py holdenweb.com 

gibt die Ausgabe

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

genial, vielen Dank! Ich hatte eine andere Frage dazu. Gibt es für das Socket-Modul eine Funktion, die verwendet werden kann, um festzustellen, auf welchem ​​Remote-Betriebssystem der Server läuft? Ich bin in einer Situation, in der ich hinter einem heavely firewalled/security locked env laufe, also kann ich Python-Module wie scapy nicht installieren ... also muss ich mich darauf verlassen, was ich mit dem Standardcode schreiben kann Python 3.5-Paket. Irgendwelche Ideen wären großartig. – betzelel

+0

Kein einfaches Problem, und ich persönlich kenne keine Bibliothek, die es lösen könnte. Die meisten solcher "Client-Fingerabdrücke" beruhen auf einem obskuren Wissen über die Unterschiede zwischen TCP/IP-Stapeln und feinen Unterschieden zwischen ihren Antworten auf bestimmte Sonden. Sie können etwas um das Dienstprogramm "nmap" herumlesen, um eine Vorstellung davon zu bekommen, was möglich ist, aber aggressives Client-Fingerprinting ist keine einfache oder häufige Aufgabe. – holdenweb

0

in Python 2, inputText liest und wertet es als Ausdruck in dem Python c Aktueller Kontext. Das ist fast nie was du willst; Sie möchten stattdessen raw_input. In Python 3 tut input jedoch, was raw_input in Version 2 tat, und raw_input ist nicht verfügbar.

Also, wenn Sie Ihren Code benötigen in sowohl Python 2 und 3 zu arbeiten, sollten Sie so etwas wie dies nach der Einfuhr Block tun:

# 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 

Dieser keinen Effekt in Python 3 hat, aber in v2 ersetzt es die Aktie input mit raw_input und raw_input mit einer Funktion, die immer eine Ausnahme auslöst (so bemerken Sie, wenn Sie versehentlich raw_input verwenden).

Wenn Sie finden, dass Sie über Lose der Unterschiede zwischen v2 und v3 glätten müssen, wird die python-future Bibliothek wahrscheinlich Ihr Leben einfacher machen.