【问题标题】:How to contact server and run program on it如何联系服务器并在其上运行程序
【发布时间】:2018-04-04 16:18:46
【问题描述】:

背景:

我需要在不登录服务器的情况下在远程服务器上运行程序。服务器只允许人们联系它,而不是查看上面有什么文件或登录。

服务器中有一个.py 和一个Python 的安装。该文件具有数据库的硬编码登录凭据,我不希望本地计算机程序的用户看到。

我想联系服务器,向它传递参数并请求它与它们一起运行程序。

原因是我不希望本地计算机上的程序存储服务器的登录凭据,所以我不想ssh,因为这将再次需要某种形式的本地化凭据,这会使凭据暴露在用户在某个时候(我从不希望他们看到他们)。

传统上,当我进行远程机器调用时,它通过requestshttp.client 库访问公开的API;据我所知,这可能需要socket 库,这是一个我不太熟悉的库,似乎无法找到我正在尝试做的示例。

服务器代码:

import sys
from pymongo import MongoClient

usr = 'user_login'
pwd = 'user_pass'

client = MongoClient('mongodb://' + usr + ':' + pwd +'@host:port')
db = client['some_db']
db.add_user(sys.argv[1], sys.argv[2])

问题:

  1. 如何向包含脚本文件的服务器发出单向请求并传递参数?
  2. 这是确保用户看不到管理员凭据的适当方法吗?

这里的问题 2 有点超出范围,因为根本问题是程序需要在数据库上创建一个新的用户帐户,但您必须使用授权帐户登录才能这样做。如果我将凭据硬编码或存储在本地机器可以看到的文件中,那么精明的用户可以调试程序并查看它们是什么。

我认为将它们放在任何人都看不到文件的服务器上,只要求服务器运行它们,这是一个安全的选择并确保安全。

【问题讨论】:

  • 看看Flask flask.pocoo.org
  • 如果你想构建一个自定义的网络服务,你要么需要套接字库,要么需要一些基于套接字的更高级别(并且可能更易于使用)的框架。这只是您要求做的事情所固有的。
  • 你可以在一些现有的服务器上搭载,但你所做的任何事情基本上就像使用sshd。例如,您可以设置一个放置目录,将其与samba 共享,然后在有人在那里添加新文件时触发脚本——但是您只需要管理 SMB 凭据而不是 SSH 凭据,那又如何呢?你买了吗?

标签: python python-3.x server


【解决方案1】:

您需要的似乎是一个典型的 HTTP 端点。需要阅读和考虑的事项:

  • 一个最简单的网络框架,例如web.py。或者,您可以使用 CGI script 运行您的程序,无论使用哪种语言。
  • 将保留 mongodb 管理员用户凭据的配置文件。 Read it 每次您的程序运行时。
  • 最难的部分:适当的授权层在您的脚本之上。否则任何人都可以运行它。至少,基本的 http 身份验证或令牌持有者身份验证。
  • 除非它位于具有内置加密功能的小型私有可信 VPN 中,否则通过 HTTPS 为您的端点提供服务。 因为它无论如何都会由 Web 服务器前端(作为传递或通过uwsgi),只需使用您的网络服务器已经使用 HTTPS 的事实(和it does,对吗?)。

【讨论】:

  • 本地计算机正在运行客户端应用程序,而不是 Web 应用程序。所以客户端需要检查数据库用户是否存在,否则注册创建。如果我与客户端有一个配置文件,用户难道不能捕获变量或只检查配置文件吗?问题在于程序代码是开源的,但我不希望数据库登录凭据与开源部分一起提供。为此,我认为 CGI 解决方案可能是一个很好的解决方案。您可以将参数发送到 CGI 脚本吗?
  • 如果你需要在同一台主机上调用你的脚本,为什么不能直接调用它,作为一个可执行文件?
  • 嗯,有效点。假设我想利用我已有的服务器。数据库驻留在其他地方的服务器上,所以我认为我的服务器上的远程脚本可以由用户客户端执行(如果需要),然后远程脚本将更新数据库并且用户永远不会看到我希望的凭据隐藏。
【解决方案2】:

一个简单的例子

from flask import Flask, request
app = Flask(__name__)

@app.route("/adduser")
def hello():
  user = request.args.get("user")
  pwd = request.args.get("pwd")

  client = MongoClient('mongodb://' + usr + ':' + pwd +'@host:port')
  db = client['some_db']
  db.add_user(user, pwd)
  return "user inserted"

if __name__ == '__main__':
  app.run()

并发出以下请求http://localhost:5000/adduser?user=root&pwd=1234

除此之外,您可以使用 POST over SSL (HTTPS),因此数据将被加密并在请求正文中传输,而不是 url(如 GET),这假设就足够了,安全

【讨论】:

  • 应用程序是检查数据库的客户端应用程序。它将允许用户创建一个帐户,但这需要授权凭据。我想将代码作为开源提供给程序,但不提供登录凭据(即位于服务器中用于创建帐户的脚本。这些信息会改变你的答案吗?我不熟悉 Flask,但这个文件是否只是坐在服务器上,我会用正确的地址替换localhost:5000?我是否将此文件命名为adduser.py
猜你喜欢
  • 2018-06-23
  • 1970-01-01
  • 2017-06-21
  • 2015-05-09
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多