문제

Ruby on Rails 앱을 유지 관리하는 중이며 현재 사용 중인 상자의 호스트 이름이나 IP 주소를 쉽게 찾을 수 있는 방법을 찾고 있습니다(VM이고 새 인스턴스의 호스트 이름이나 IP 주소가 다를 수 있으므로). .Ruby on Rails에서 이 작업을 빠르고 쉽게 수행할 수 있는 방법이 있나요?

편집하다:아래 답변은 정확하지만 Craig가 제공한 설명은 유용합니다(답변에 제공된 링크도 참조).

아래] 코드는 연결하거나 패킷을 보내지 않습니다 (Google 인 64.233.187.99).UDP는 Sationeless Protocol ()이므로 주소를 기반으로 패킷을 라우팅하는 방법과 바인딩 해야하는 인터페이스 (및 IP 주소)를 파악하는 시스템 호출을 만듭니다.addr ()는 소켓의 패밀리 (AF_INET), 로컬 포트 ​​및 로컬 주소 (우리가 원하는 것)를 포함하는 배열을 반환합니다.

도움이 되었습니까?

해결책

에서 coderrr.wordpress.com:

require 'socket'

def local_ip
  orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true  # turn off reverse DNS resolution temporarily

  UDPSocket.open do |s|
    s.connect '64.233.187.99', 1
    s.addr.last
  end
ensure
  Socket.do_not_reverse_lookup = orig
end

# irb:0> local_ip
# => "192.168.0.127"

다른 팁

호스트 이름

Ruby에서 호스트 이름을 얻는 간단한 방법은 다음과 같습니다.

require 'socket'
hostname = Socket.gethostname

문제는 이것이 다음 중 하나를 사용하기 때문에 자신의 이름을 아는 호스트에 의존한다는 것입니다. gethostname 또는 uname 시스템 호출이므로 원래 문제에서는 작동하지 않습니다.

기능적으로 이것은 다음과 동일합니다. hostname 외부 프로그램을 호출하지 않고 응답합니다.호스트 이름은 시스템 구성에 따라 정규화되거나 정규화되지 않을 수 있습니다.


IP 주소

Ruby 1.9부터는 소켓 라이브러리를 사용하여 로컬 주소 목록을 얻을 수도 있습니다. ip_address_list 배열을 반환합니다. 주소정보 사물.선택 방법은 수행하려는 작업과 보유한 인터페이스 수에 따라 다르지만 다음은 첫 번째 비루프백 IPV4 IP 주소를 문자열로 선택하는 예입니다.

require 'socket'
ip_address = Socket.ip_address_list.find { |ai| ai.ipv4? && !ai.ipv4_loopback? }.ip_address

이 시도:

host = `hostname`.strip # Get the hostname from the shell and removing trailing \n
puts host               # Output the hostname

서버에는 일반적으로 하나 이상의 인터페이스(최소 하나는 개인용, 하나는 공용)가 있습니다.

여기에 있는 모든 답변은 이 간단한 시나리오를 다루기 때문에 더 깔끔한 방법은 Socket에 현재 ip_address_list() 다음과 같이:

require 'socket'

def my_first_private_ipv4
  Socket.ip_address_list.detect{|intf| intf.ipv4_private?}
end

def my_first_public_ipv4
  Socket.ip_address_list.detect{|intf| intf.ipv4? and !intf.ipv4_loopback? and !intf.ipv4_multicast? and !intf.ipv4_private?}
end

둘 다 Addrinfo 객체를 반환하므로 문자열이 필요한 경우 다음을 사용할 수 있습니다. ip_address() 방법은 다음과 같습니다.

ip= my_first_public_ipv4.ip_address unless my_first_public_ipv4.nil?

필요한 인터페이스 주소를 필터링하는 데 사용되는 Addrinfo 메서드를 변경하면 귀하의 사례에 더 적합한 솔루션을 쉽게 찾을 수 있습니다.

여기에 사용된 IP 주소는 Google의 것이지만 접근 가능한 모든 IP를 사용할 수 있습니다.

require "socket"
local_ip = UDPSocket.open {|s| s.connect("64.233.187.99", 1); s.addr.last}

가장 간단한 것은 host_with_port Controller.rb에서

host_port= request.host_with_port

허용된 답변은 작동하지만 모든 요청에 ​​대해 소켓을 만들어야 하며 서버가 로컬 네트워크에 있거나 인터넷에 연결되어 있지 않으면 작동하지 않습니다.아래는 요청 헤더를 구문 분석하므로 항상 작동할 것이라고 생각합니다.

request.env["SERVER_ADDR"]

강조 표시된 부분을 백틱 안에 넣습니다.

`dig #{request.host} +short`.strip # dig gives a newline at the end

아니면 그냥 request.host IP인지 아닌지 상관하지 않는다면요.

다음을 사용한 답변과 유사합니다. hostname, 외부를 사용하여 uname UNIX/LINUX의 명령:

hostname = `uname -n`.chomp.sub(/\..*/,'')  # stripping off "\n" and the network name if present

사용중인 IP 주소의 경우 (컴퓨터가 여러 네트워크 인터페이스를 가질 수 있음) 다음과 같은 것을 사용할 수 있습니다.

 # on a Mac:
 ip_addresses = `ifconfig | grep 'inet ' | grep -v 127.0.0.1 | cut -d' ' -f 2`.split
 => ['10.2.21.122','10.8.122.12']

 # on Linux:
 ip_addresses = `ifconfig -a | grep 'inet ' | grep -v 127.0.0.1 | cut -d':' -f 2 | cut -d' ' -f 1`.split
 => ['10.2.21.122','10.8.122.12']

각 시스템에 여러 개의 IP 주소(127.0.0.1, 192.168.0.1 등)가 있을 수 있습니다.*NIX를 OS로 사용하고 있다면 다음을 사용하는 것이 좋습니다. hostname, 그런 다음 DNS 조회를 실행합니다.해당 시스템의 IP 주소를 확인하기 위해 /etc/hosts를 사용하여 로컬 호스트 이름을 정의할 수 있어야 합니다.Windows에도 비슷한 기능이 있지만 Windows 95가 최첨단이었기 때문에 저는 이 기능을 사용하지 않았습니다.

다른 옵션은 다음과 같은 조회 서비스를 이용하는 것입니다. WhatIsMyIp.com.이 사람들은 귀하의 실제 IP 주소를 귀하에게 돌려줄 것입니다.이는 또한 원하는 경우 로컬 서버에서 Perl 스크립트를 사용하여 쉽게 설정할 수 있는 것입니다.%ENV에서 원격 IP를 출력하는 코드는 3줄 정도이면 충분할 것 같습니다.

io = IO.popen('hostname')
hostname = io.readlines

io = IO.popen('ifconfig')
ifconfig = io.readlines
ip = ifconfig[11].scan(/\ \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\ /)

몇 가지 답변 require 'socket' 좋아 보인다.request.blah_blah_blah가 당신이 레일을 사용하고 있다고 가정합니다.

IO는 항상 사용 가능해야 합니다.이 스크립트의 유일한 문제점은 다음과 같습니다. ifconfig 시스템의 다른 매너에서 출력되면 IP에 대해 다른 결과를 얻게 됩니다.호스트 이름 조회는 Sears처럼 견고해야 합니다.

노력하다: Request.remote_ip

원격_ip()

원래 IP 주소를 결정합니다.Remote_addr은 표준이지만 사용자가 프록시 뒤에 있으면 실패합니다.http_client_ip 및/또는 http_x_forwarded_for는 프록시에 의해 설정되므로 remote_addr이 프록시 인 경우 이러한 정보를 확인하십시오.HTTP_X_FORWARDED_FOR는 다중 체인 프록시의 경우 쉼표로 명시된 목록 일 수 있습니다.신뢰할 수없는 마지막 주소는 원래의 IP입니다.

업데이트:죄송합니다. 문서를 잘못 읽었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top