微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

需要使用PHP在Ubuntu上查找networking接口的IP地址

在networking上时,我需要帮助find我的电脑的IP地址。 我正在build立一个信息亭types的系统,将被放置到不同的位置,我需要能够使用networking浏览器来查找本地networking上的该计算机的IP地址。

如果我使用$_SERVER['SERVER_ADDR']我将通过该机器上的本地浏览器(127.0.0.1)获得我要连接的IP地址。

我不能呼叫并获得公共IP,因为这些单元可能在路由器后面,我不想要路由器的公共IP地址。

我需要find服务器上的那个盒子的IP地址(例如:192.168.0.xxx)

如何在一行中接触文件和mkdir

Linux:python:在raw_input()之前清除input缓冲区

这个bash语法是什么意思? (特点:案件,执行)

在Windows和Linux编写C会导致编译问题?

configurationJenkins以编程方式从构build参数在构build时确定从属?

我知道,当我从terminal上得到'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,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永远preferred_lft永远”但没有其他信息。 如果我可以把整个东西放到$localIP那么我可以过滤掉这个IP地址,但它不会给我所有的东西。

有没有更简单的方法来做到这一点,或者当我尝试执行“ip addr show”命令时丢失的东西? 另外,我在用户apache下运行,不能以root身份运行这个应用程序。

RPM打包一个专有的安装程序的tarball

不能–enable-pcregrep-libbz2,因为没有findbzlib.h

将命令输出分配给shellvariables

如何将文件从Vagrant机器复制到本地主机

启动Vagrant时连接超时

正如exec()所记录的,从函数返回的只有exec'd命令的最后一行输出。 要捕获所有的输出,你必须使用函数的可选第二个参数:

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

$full_output将是exec'd程序的输出行数组。

服务器(应该)知道如何解析自己的主机名到正确的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地址。 它很大程度上取决于操作系统和服务器配置 如果服务器有一个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]; }

这是一个简单的功能,使用系统/etc/network/interfaces将返回公共和私有IPv4地址设置为eth0和eth1

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; }

$_SERVER['REMOTE_ADDR']; 应该做的伎俩。

如果这不起作用,你总是可以用shell_exec($command); 。 但请记住,您需要设置您的PHP文件权限才能执行。

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;

好吧,我找到了一个解决方案….

布巴 – >你解决方案返回127.0.0.1地址。 这个盒子的域名是demo01.com,它看起来像是用它拉动本地127地址。 我尝试使用实际的192.168.x地址与该计算机上的网络浏览器一起使用来自另一台计算机的浏览器调用PHP文件,并且两次都给了我127.0.0.1地址。

Paulina – > IP地址由主机路由器动态设置。 由于这是在几个地方,我不能硬编码的IP到盒子里。 我不知道是否对它进行硬编码实际上与此有关,但我确实获取文件内容,但没有IP地址:#此文件描述了系统中可用的网络接口#以及激活它们。 有关更多信息,请参阅接口(5)。

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

马克B – >你的是解决方案,为我工作。 我不知道我需要添加第二个变量来调用它来显示一切。 我可以从那里解析出IP地址。 这只是为了显示一个正在设置自助服务终端的人,如果因为某种原因有多个地址,我可以把每个人都拉出来,然后显示出来,然后他们可以播放命中和错过,它只会是2知识产权,他们可能不得不担心无论如何(LAN和WAN)

如果我可以的话,我没有足够的果汁来应对这个问题。 但是我非常感谢,谢谢!

Joren – >那不适合我的需要,remote_address返回调用脚本的计算机的地址。 如果我从远程计算机调用它,我将获得该计算机的IP,如果我从浏览器中调用它,我必须已经知道该地址栏以将其放在地址栏中没有,这就是为什么我需要脚本),或者从127.0.0.1或本地主机中获取127.0.0.1作为响应。

如果你只是想要特定的接口,你可以使用这个

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

输出只是这个接口的ip

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐