Ruby on Rails에서 호스트 이름 또는 IP 가져 오기
Ruby on Rails 앱을 유지 관리하는 중이며 현재 사용중인 상자의 호스트 이름 또는 IP 주소를 쉽게 찾을 수있는 방법을 찾고 있습니다 (VM이므로 새 인스턴스에는 다른 호스트 이름 또는 IP 주소가있을 수 있음). . Ruby on Rails에서이 작업을 수행하는 빠르고 쉬운 방법이 있습니까?
편집 : 아래 답변은 정확하지만 Craig가 제공 한 설명이 유용합니다 (답변에 제공된 링크 참조).
[아래] 코드는 연결을하거나 패킷을 보내지 않습니다 (google 인 64.233.187.99로). UDP는 상태 비 저장 프로토콜이기 때문에 connect ()는 주소를 기반으로 패킷을 라우팅하는 방법과 바인딩해야하는 인터페이스 (따라서 IP 주소)를 파악하는 시스템 호출을 수행 할뿐입니다. addr ()은 소켓의 패밀리 (AF_INET), 로컬 포트 및 로컬 주소 (원하는 것)를 포함하는 배열을 반환합니다.
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 주소
루비 1.9부터 소켓 라이브러리를 사용하여 로컬 주소 목록을 가져올 수도 있습니다. AddrInfo 객체 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
일반적으로 서버에는 둘 이상의 인터페이스, 하나 이상의 개인 및 하나의 공용이 있습니다.
여기에있는 모든 답변은이 간단한 시나리오를 다루기 때문에 다음과 같이 소켓에 전류를 요청하는 것이 더 깨끗한 방법입니다 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인지 아닌지 신경 쓰지 않는 경우.
UNIX / LINUX hostname
에서 외부 uname
명령을 사용 하는를 사용한 대답과 유사합니다 .
hostname = `uname -n`.chomp.sub(/\..*/,'') # stripping off "\n" and the network name if present
for the IP addresses in use (your machine could have multiple network interfaces), you could use something like this:
# 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']
You will likely find yourself having multiple IP addresses on each machine (127.0.0.1, 192.168.0.1, etc). If you are using *NIX as your OS, I'd suggest using hostname
, and then running a DNS look up on that. You should be able to use /etc/hosts to define the local hostname to resolve to the IP address for that machine. There is similar functionality on Windows, but I haven't used it since Windows 95 was the bleeding edge.
The other option would be to hit a lookup service like WhatIsMyIp.com. These guys will kick back your real-world IP address to you. This is also something that you can easily setup with a Perl script on a local server if you prefer. I believe 3 lines or so of code to output the remote IP from %ENV should cover you.
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}\ /)
The couple of answers with require 'socket'
look good. The ones with request.blah_blah_blah assume that you are using Rails.
IO should be available all the time. The only problem with this script would be that if ifconfig
is output in a different manor on your systems, then you would get different results for the IP. The hostname look up should be solid as Sears.
try: Request.remote_ip
remote_ip()
Determine originating IP address. REMOTE_ADDR is the standard but will fail if the user is behind a proxy. HTTP_CLIENT_IP and/or HTTP_X_FORWARDED_FOR are set by proxies so check for these if REMOTE_ADDR is a proxy. HTTP_X_FORWARDED_FOR may be a comma- delimited list in the case of multiple chained proxies; the last address which is not trusted is the originating IP.
Update: Oops, sorry I misread the documentation.
참고URL : https://stackoverflow.com/questions/42566/getting-the-hostname-or-ip-in-ruby-on-rails
'developer tip' 카테고리의 다른 글
DateTime. 날짜가 30 일 미만인지 확인하는 방법을 비교합니까? (0) | 2020.10.13 |
---|---|
Angular 6 재질 매트 선택 변경 방법 제거 (0) | 2020.10.13 |
임베디드 개발에 C ++ 대신 C를 사용하는 이유가 있습니까? (0) | 2020.10.13 |
C # /. NET 프로그램 최적화를위한 팁 (0) | 2020.10.13 |
jQuery를 사용하여 JSON 객체를 만드는 방법 (0) | 2020.10.13 |