我有一个实时的、自动更新的 python 绘图(使用 Bokeh),显示在远程 Linux 服务器(由我的大学为我设置)的端口 127.0.0.1:5006 上。通常,我必须通过 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 未提供用户身份验证挂钩(默认用户启用)
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
只有有了这些信息,实现您想要的目标的唯一方法就是使用 iptables 规则,该规则会将所有与您不同的 MAC 地址重定向到所需的端口。例如这样的事情:
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 的应用程序应绑定到 0.0.0.0 而不是 127.0.0.1(除非它已经绑定并且限制是由防火墙引起的)
- 应允许到端口 5006 的流量(通过服务器自己的防火墙和/或附近的路由器),或者您可以重新配置应用程序以侦听某些允许的端口(80、443...)。