서버 포트의 콘텐츠에 대한 공개 액세스를 허용합니다.

서버 포트의 콘텐츠에 대한 공개 액세스를 허용합니다.

원격 Linux 서버(내 대학에서 설정)의 포트 127.0.0.1:5006에 자동으로 업데이트되는 실시간 Python 플롯(Bokeh 사용)이 표시되어 있습니다. 일반적으로 로컬 컴퓨터에서 플롯을 보려면 서버에 SSH로 연결하고 해당 주소에 대한 포트 전달을 활성화해야 합니다. 제 질문은 누군가에게 내 서버의 IP 주소(예: 123.12.12.123)와 찾을 포트를 알려주면 SSH 문제 없이 플롯을 볼 수 있도록 하려면 어떻게 해야 합니까? 이것이 가능한가?

고쳐 쓰다: 세부 사항을 구현하는 데 필요한 코드입니다. 플롯 데이터를 읽으려면 두 개의 파일이 필요하므로 포함합니다.여기.

''' 
Use the ``bokeh serve`` command to run the example by executing: bokeh serve sliders.py
at your command prompt. Then navigate to the URL-http://localhost:5006/sliders
in your browser.
'''

from bokeh.io import curdoc
from bokeh.layouts import column, row
from bokeh.models import Button, ColumnDataSource
from bokeh.plotting import figure

# Callbacks
def update_data():
   print("reading new data")
   df1 = read_pickle('weeklydata2.pkl')
   source.data = ColumnDataSource.from_df(df1)

# Set up data
df =read_pickle('weeklydata1.pkl')
f = dict(OAT='green', SAT='orange', OAH='red')
source = ColumnDataSource(df)

# Set up plot
p = figure(x_axis_type="datetime")

for i in df.columns:
   p.line('index',
          i,
          source=source,
          legend_label=i,
          line_color=f[i])
   p.circle('index',
            i,
            source=source,
            size=10,
            color=f[i])

# Set up widgets
button = Button(label='Refresh Plot')
button.on_click(update_data)
inputs = column(button)

curdoc().add_root(row(inputs, p, width=800))
curdoc().title = "Time Series of Temp., Setpoint and Humidity Variables"

그러면 출력이 생성됩니다.

2019-11-26 10:53:19,916 Bokeh 서버 버전 1.4.0 시작 (Tornado 6.0.3에서 실행)

2019-11-26 10:53:19,918 사용자 인증 Hook 미제공 (기본적으로 활성화되어 있음)

2019-11-26 10:53:19,921 Bokeh 애플리케이션은 다음에서 실행됩니다.http://localhost:5006/datashow

2019-11-26 10:53:19,921 Bokeh 서버 시작, 프로세스 ID: 7116

2019-11-26 10:53:23,385 WebSocket 연결이 열렸습니다.

2019-11-26 10:53:23,385 서버 연결이 생성되었습니다

새 데이터 읽기

새 데이터 읽기

2019-11-26 10:54:41,574 WebSocket 연결 종료: 코드=1001, 이유=없음

중단하다, 닫다

위 포트에서 서버를 실행하여 누구나 라이브 플롯만 볼 수 있고 원하는 경우 업데이트할 수 있는 옵션을 갖기를 원합니다. 여기에서는 하드코딩된 정적 데이터 소스를 제공하는 경우에만 업데이트가 작동합니다. 하지만 무슨 말인지 알 것 같나요?

답변1

이 정보를 사용하여 원하는 것을 달성하는 유일한 방법은 사용자와 다른 모든 MAC 주소를 필수 포트로 리디렉션하는 iptables 규칙을 사용하는 것입니다. 예를 들어 다음과 같습니다.

iptables -t nat -A PREROUTING -p tcp --dport 22 -m mac ! --mac-source 11:22:33:44:55:66 -j DNAT --to 123.12.12.123:5006

답변2

  • 포트 5006에서 수신 대기하는 애플리케이션은 127.0.0.1 대신 0.0.0.0에 바인딩되어야 합니다(이미 바인딩되어 있고 방화벽으로 인해 제한이 발생하지 않는 한).
  • 포트 5006에 대한 트래픽은 서버의 자체 방화벽 및/또는 근처 라우터를 통해 허용되어야 합니다. 또는 허용된 일부 포트(80, 443...)에서 수신 대기하도록 애플리케이션을 재구성할 수 있습니다.

관련 정보