SSH用のRaspberry PiのIPアドレスを取得する方法


11

Mac OSxを使用してSSH経由でPiにアクセスしています。アクセスするには、PiのIPアドレスが必要であることを知っています。そこで、私は常にローカルIPを取得することに成功しているいくつかのPythonコマンドを使用することにしました。

import socket
host_name = socket.gethostname()
host_ip = socket.gethostbyname(host_name)
print host_ip

奇妙なことに、私はローカルホストIP(127.0.1.1)しか取得していません。

誰かがPIに適切なローカル/グローバル(どちらか良い方、これは今のところLANでのみ動作する必要がある)IPを取得する方法を教えてもらえますか?


1
これをグーグルで試したことはありますか?
アレクサンダー-モニカを

見ていlsleasesを、[1]、[IPアドレスを知らなくても、ラズベリーPIにSSH]のための私の答えを参照してください。[1]:raspberrypi.stackexchange.com/questions/12440/...
セバスチャン

Piに独自のアドレスを取得させようとしていますか?これはどのように役立ちますsshか?確かにあなたはあなたの前にIPアドレスを必要としますssh
ctrl-alt-delor

回答:


12

Pythonが必須の場合は、この記事を確認できます。http//code.activestate.com/recipes/439094-get-the-ip-address-associated-with-a-network-inter/

彼らは、コンピュータにはネットワークインターフェイスと同じ数のIPアドレスがあることを正しく指摘しています。

ネットワークアダプターのIPアドレスを取得するコードは次のとおりです。コードをテストしましたが、機能します。

import socket
import fcntl
import struct

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  # SIOCGIFADDR
        struct.pack('256s', ifname[:15])
    )[20:24])

print get_ip_address('lo')
print get_ip_address('eth0')

RPiがWiFi経由で接続されている場合、アダプター名は wlan0

それ以外の場合は、ip次のコマンドで取得できます。

ip addr show eth0 | grep inet

あなたは次のようなものを得るはずです:

inet 192.168.0.140/24 brd ....

それがあなたのIPアドレスです。

もちろん、RPiを起動しただけでIPアドレスがわからないため接続できなかった場合、これは機能しません。その場合は、DHCPサーバーが確実にRPiに付与したIPアドレスを確実に伝えることができます(または、それらすべてを試してみます:))

そうは言っても、名前でRPiを参照することにはメリットがあるかもしれません。Macを使用しているので、おそらく最良の解決策はavahi-daemonをインストールすることです。

sudo apt-get install avahi-daemon

これは、(Bonjourのような)Apple Zeroconf仕様を実装しています。次に、名前でRPiにsshできます。

ssh pi@raspberry.local

2つのラズベリー(ygdrasilldvalinnという名前)には異なるアプローチを使用しました。固定IP(192.168.0.140と192.168.0.142)を選択したので、他の一部のマシンでetc / hostsファイルも使用できます。

内部DNSをセットアップしたり、Winsに依存したりすることもできましたが、現在のソリューションでうまくいきます。


こんにちはレモ、これを詳しく説明してくれてありがとう。rasp pi 3で実行されているpython 3.5でコーディングしようとしましたが、機能せず、実行時エラーが発生します。"struct.error: 's'の引数はbytesオブジェクトでなければなりません"
Amit Rai Sharma

これにはssh pi@raspberrypi.local、RPiのデフォルトのホスト名を指定する必要があると思いますraspberrypi。なぜavahi-daemonがDebianの世界に普遍的にインストールされていないのかは、私を超えています。アドホックネットワークは、そのまま使用できる夢です。
ヒースラフター

私の以前のコメントとは対照的に、現在(5月19日)の最新のRaspbian(4月19日)では、raspberrypi.localの解決と169.254.xx自動割り当ての両方が、設定なしで機能します!
ヒースラフター

2

このコード:

import socket
import fcntl
import struct

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  # SIOCGIFADDR
        struct.pack('256s', ifname[:15])
    )[20:24])

print get_ip_address('lo')
print get_ip_address('eth0')

Python 2.7でのみ機能し、Python 3では機能しません。's 'の引数はバイトオブジェクトでなければならないというエラーが表示されます...


質問の答えは何に役立ちますか?で動作するバージョンはありpython3ますか?
インゴ

0

OSの設定方法によっては、ソケットがlocalhostを返す場合があります。したがって、移植性はありません。

Python経由でIPを取得することに関するこの Stackoverflowの回答は役に立ちます。/etc/hostsの問題を説明し、適切な回避策を提供します。完全ではありません(ipv6)。複数のバインドされたIPがある場合、ルーティング可能なバージョンが見つからない可能性がありますが、ニーズに応じて適切なonelinerです。

コマンドラインから、ifconfigあなたの友達です。通常、バインドされているすべてのインターフェースなどがリストされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.