4

コンピュータがネットワーク上にあるときに、そのコンピュータの IP アドレスを見つけるのに助けが必要です。さまざまな場所に配置されるキオスク タイプのシステムを構築しています。Web ブラウザを使用して、ローカル ネットワーク上のそのコンピュータの IP アドレスを見つける必要があります。

使用する$_SERVER['SERVER_ADDR']と、そのマシンのローカルブラウザー (127.0.0.1) を介して接続している IP アドレスを取得します。

ユニットがルーターの背後にある可能性があり、ルーターのパブリック IP アドレスが必要ないため、呼び出してパブリック IP を取得できません。

サーバー上のそのボックスの IP アドレスを見つける必要があります (例: 192.168.0.xxx)

端末から「ip addr show」を実行すると、

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 61:a6:4d:63:a2:80 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.211/24 brd 192.168.0.255 scope global em1
    inet6 fe80::62a4:4cff:fe64:a399/64 scope link 
       valid_lft forever preferred_lft forever

私がしようとすると:

$command="ip addr show";
$localIP = exec ($command);

$localIP「valid_lft forever preferred_lft forever」で出てきますが、他の情報はありません。すべてを取得できれば$localIP、inet IP アドレスを除外できますが、すべてが得られるわけではありません。

これを行う簡単な方法や、「ip addr show」コマンドを実行しようとしたときに欠けているものはありますか? また、ユーザー apache で実行しているため、このアプリケーションのルートとしてこれを実行できません。

4

11 に答える 11

6

で説明されてexec()いるように、exec'd コマンドからの出力の最後の行のみが関数から返されます。すべての出力をキャプチャするには、オプションの 2 番目の引数を関数に使用する必要があります。

$last_line = exec('ip addr show', $full_output);
                                  ^^^^^^^^^^^^

$full_outputexec されたプログラムからの出力行の配列になります。

于 2013-09-12T20:49:55.587 に答える
4

サーバーは、インターネットに接続されていない場合でも、自身のホスト名を正しい IP アドレスに解決する方法を知っている必要があります。

したがって、ホスト名を取得して、ホスト名を IP アドレスに解決するだけです。このようなものはあなたにとってうまくいくはずです:

$ip = gethostbyname(gethostname());

ホスト名が DNS、/etc/hosts ファイル、または ActiveDirectory に登録されているかどうかに関係なく、何らかの方法で解決できる限り、解決された IP アドレスを取得できます。

おそらく、他のオプションも計画する必要があります。したがって、上記が機能することを確認し、機能しない場合は、他のオプションにフォールバックする必要があります。

  • $_SERVER['HTTP_HOST']ページにアクセスするためにブラウザのアドレスバーに入力されたアドレスが含まれています。http://192.168.0.1/index.phpブラウザに(たとえば)入力してページにアクセスする$_SERVER['HTTP_HOST']と、192.168.0.1.
  • DNS 名を使用してページにアクセスした場合は、 gethostbyname($_SERVER['HTTP_HOST']); その DNS 名を IP アドレスに変換します。
  • $_SERVER['SERVER_NAME']サーバー名として Web サーバー構成で構成された名前が含まれます。これを使用する場合は、PHP でハードコーディングすることもできます。
  • $_SERVER['SERVER_ADDR']サーバーのプライマリ IP アドレスのオペレーティング システムが含まれます。これは、ページへのアクセスに使用された IP アドレスである場合とそうでない場合があり、Web サーバーがバインドされている IP アドレスである場合とそうでない場合があります。OS とサーバー構成に大きく依存します。サーバーが単一の IP アドレスを持っている場合、これはおそらく安全な賭けですが、これには127.0.0.1.

次のようなものを試すことができます。

<?php

$ip = gethostbyname(gethostname());

// if we didn't get an IP address
if ($ip === gethostname()){
    // lets see if we can get it from the
    // configured web server name
    $ip = gethostbyname($_SERVER['SERVER_NAME']);

    // if we still don't have an IP address
    if ($ip === $_SERVER['SERVER_NAME']){
        // Then we default to whatever the OS
        // is telling us is it's primary IP address
        $ip = $_SERVER['SERVER_ADDR'];
    }
}

Linux でコマンド ライン操作 (危険で潜在的な攻撃ベクトル) を実行する場合は、次のようにすることができます。

//then all non 127.0.0.1 ips should be in the $IPS variable
echo exec('/sbin/ifconfig | grep "inet addr:" | grep -v "127.0.0.1" | cut -d: -f2 | awk \'{ print $1}\'', $IPS);
$ip = '';
$foundIps = count($IPS);
switch($foundIps){
    case 0:
       print "Crud, we don't have any IP addresses here!\n";
       $ip = '127.0.0.1';
       break;
    case 1:
        print "Perfect, we found a single usable IP address, this must be what we want!\n";
        $ip = $IPS[0];
        break;
    default:
        print "Oh snap, this machine has multiple IP addresses assigned, what you wanna do about that?\n"
        // I'm crazy, I'll just take the second one!
        $ip = $IPS[1];

}
于 2013-09-12T20:31:41.837 に答える
1

これは、システムを使用する/etc/network/interfacesと、eth0 と eth1 のパブリックおよびプライベート IPv4 アドレスの設定が返される単純な関数です。

function getIps()
{
    $ifs_raw=file('/etc/network/interfaces');
    $tocheck=array('eth0','eth1');
    foreach($tocheck as $if)
    {
        foreach($ifs_raw as $idx=>$line)
        {
            if(strpos($line,"iface {$if} inet static")!==false)
            {
                $address=$ifs_raw[$idx+1];
                $address=trim($address);$address=ltrim($address,"\t");$address=rtrim($address,"\t");

                list($address_text,$addrip)=explode(" ",$address);
                if($address_text=='address')
                {
                    if(filter_var($addrip, FILTER_VALIDATE_IP) !== false)
                    {
                        //Valid IP
                        if(false===filter_var($addrip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE |  FILTER_FLAG_NO_RES_RANGE))
                        {
                            $ips['private']=$addrip;
                        }
                        else
                        {
                            $ips['public']=$addrip;
                        }
                    }
                }
            }       
        }
    }
    return $ips;
}
于 2014-01-02T17:13:31.517 に答える
1

特定のインターフェイスだけが必要な場合は、これを使用できます

$ip = `ifconfig en1 inet | grep inet | awk '{print $2}'`

出力はこのインターフェイスの ip だけです

于 2015-11-25T08:52:29.093 に答える
0

わかりました、私は解決策を見つけました....

Bubba -> あなたのソリューションは 127.0.0.1 アドレスを返しました。ボックスのドメインは demo01.com で、ローカルの 127 アドレスを取得しているようです。実際の192.168.xアドレスを使用して、そのコンピューター自体のWebブラウザーと別のコンピューターのブラウザーでphpファイルを呼び出してみましたが、どちらも127.0.0.1アドレスが返されました。

Paulina -> IP アドレスは、ホスト ルーターによって動的に設定されます。これはいくつかの場所で行われているため、IP をボックスにハードコードすることはできません。ハードコーディングが実際にこれと関係があるかどうかはわかりませんが、ファイルの内容は取得しましたが、IP アドレスはありません。それらをアクティブにします。詳細については、interfaces(5) を参照してください。

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
#auto em1
#iface em1 inet dhcp

Marc B -> Yours は、私にとってうまくいった解決策です。すべてを表示するには、2 番目の変数を呼び出しに追加する必要があることを知りませんでした。そこから IP アドレスを解析できます。これはキオスクを設置する人向けの表示なので、なぜかアドレスが複数ある場合は、それぞれを抜き出して一覧表示させて、当たり外れをつければ2つだけとにかく心配しなければならない IP (lan と wan)

できれば、あなたの応答を増やすほどのジュースがありません。しかし、私は感謝しています、そしてありがとう!

Joren -> それは私のニーズには合いません。remote_address は、スクリプトを呼び出すコンピューターのアドレスを返します。リモート コンピューターから呼び出す場合は、そのコンピューターの IP を取得します。ブラウザー内から呼び出す場合は、アドレス バーに配置するボックスのアドレスを既に知っている必要があります (これはわかりません)。持っていないので、スクリプトが必要です) または 127.0.0.1 または localhost から呼び出して、どちらの場合も応答として 127.0.0.1 を取得します。

于 2013-09-13T14:04:54.007 に答える
0

$_SERVER['REMOTE_ADDR'];トリックを行う必要があります。

それがうまくいかない場合は、いつでもいじることができますshell_exec($command);。ただし、実行できるようにするには、php ファイルの権限を設定する必要があることに注意してください。

于 2013-09-12T20:19:50.290 に答える
0

debian/ubuntu の Web インターフェイスの設定は /etc/network/interfaces ファイルにあります。php cgiプロセスがchrootされていない場合は無料で読むことができ、このファイルを参照して解析してIPアドレスを取得できます. 読みやすいです。そのようなものはうまくいくはずです...

$myFile = "/etc/network/interfaces";
$fh = fopen($myFile, 'r');
$theData = "";
$resoult = "";
while(! feof($file)){
 $theData = fgets($fh);
 if($theData == "iface em1 inet static"){
  while(! feof($file)){
   $theData = fgets($fh);
   if(split(" ",$theData)[0] == "address"){
    $resoult = split(" ",$theData)[1];
    brake;
   }
  }
  brake;
 }
}

fclose($fh);
echo $resoult;
于 2013-09-12T20:34:09.720 に答える