対応するシェル コマンドを実行しなくても、Python 内から ping と traceroute を実行できるようにしたいので、ネイティブの Python ソリューションを使用したいと思います。
7 に答える
外部モジュールを使用し、UDP や TCP を使用しないことを気にしない場合は、scapyが簡単な解決策です。
from scapy.all import *
target = ["192.168.1.254"]
result, unans = traceroute(target,l4=UDP(sport=RandShort())/DNS(qd=DNSQR(qname="www.google.com")))
または、tcpバージョンを使用できます
from scapy.all import *
target = ["192.168.1.254"]
result, unans = traceroute(target,maxttl=32)
これらのタスクを実行できるようにするには、root として scapy を実行する必要があることに注意してください。そうしないと、次のようになります。
socket.error: [Errno 1] Operation not permitted
Webb Libraryは、あらゆる種類の Web 関連の抽出を実行するのに非常に便利です...そして ping と traceroute はそれを介して簡単に実行できます。トレースルート先の URL を含めるだけです。
import webb
webb.traceroute("your-web-page-url")
traceroute ログをテキスト ファイルに自動的に保存する場合は、次のコマンドを使用します。
webb.traceroute("your-web-page-url",'file-name.txt')
同様に、URl (サーバー) の IP アドレスは、次のコード行で取得できます。
print(webb.get_ip("your-web-page-url"))
それが役に立てば幸い!
root としてインタープリターを実行することは、セキュリティ上の理由からしばしば嫌われます (もちろん、ping と traceroute の ICMP 仕様で必要とされる "生の" socked にアクセスするには、root 権限が必要です!)。難しいことではありません -- たとえば、この投稿は実行可能な ping を提供し、Jeremy Hylton の古いページには ICMP (ping と traceroute の両方) の基礎となるコードがまだ使用可能ですが、非常に古い Python バージョン用に書かれており、最新の機能に合わせて少し手を加える必要があります。 1 つ -- しかし、私が提供した両方の URL には、概念がすべて含まれています。
mtrpacketパッケージを使用して、ping または traceroute を実行できるネットワーク プローブを送信できます。mtr コマンドライン ツールのバックエンドを使用するため、スクリプトをルートとして実行する必要はありません。
また、asyncio のイベント ループも使用するため、複数の進行中の traceroute または ping を同時に実行し、それらの結果が完了すると処理できます。
「example.com」に traceroute する Python スクリプトを次に示します。
import asyncio
import mtrpacket
async def trace():
async with mtrpacket.MtrPacket() as mtr:
for ttl in range(1, 256):
result = await mtr.probe('example.com', ttl=ttl)
print(result)
if result.success:
break
asyncio.get_event_loop().run_until_complete(trace())
「ttl」を使用したループが使用されるのは、発信パケットの「time-to-live」によって、パケットが期限切れになって元のソースにエラーが返される前に移動するネットワーク ホップの数が決まるためです。
root 権限を必要としない単純な tcptraceroute を Python で作成しましたhttp://www.thomas-guettler.de/scripts/tcptraceroute.py.txt
ただし、中間ホップの IP アドレスは表示できません。ただし、ブロックしているファイアウォールがどこにあるかを推測できるため、便利な場合もあります。ルートの最初または最後です。
scapyパッケージをチェックアウトすることをお勧めします。これは、Python 用ネットワーク ツールのスイス アーミー ナイフです。
ICMP Ping は、ICMP プロトコルの一部として標準です。
Traceroute は、ICMP および IP の機能を使用して、Time To Live 値によってパスを決定します。パスのホップについて通知するのは ICMP TTL EXceeded メッセージであるため、TTL 値を使用すると、IP/ICMP が機能する限り、さまざまなプロトコルで traceroute を実行できます。
リスナーが利用できないポートにアクセスしようとすると、ICMP プロトコル ルールにより、ホストは ICMP Port Unreachable メッセージを送信することになっています。