通过ssh隧道按需执行本地Python脚本

通过ssh隧道按需执行本地Python脚本

我有一个本地(本地网络,位于 NAT 路由器和防火墙后面)Ubuntu 机器和一个可公开访问的(Ubuntu)服务器。我想启动从本地计算机到服务器的连接,然后在服务器上在本地计算机上执行一个特定的 Python 脚本(没有其他命令或脚本)。但问题是:我想在将来的任何时候执行该 Python 脚本,有时每次执行后多次。我的第一个想法是 SSH 隧道(在本地计算机上执行):

ssh user@remoteserver -R 21000:127.0.0.1:8081

但这对我没有任何好处。我的下一次尝试是这个答案这里。但这会在连接时执行脚本,然后在执行后断开连接。

最后,我的问题是:如何建立由本地计算机发起到服务器的安全连接,在该连接上我可以按需在本地计算机上执行 Python 脚本,而不仅仅是在 SSH 命令的连接时间?
(如果有什么事情太令人困惑,请告诉我,我将重新表述问题的部分内容)。

答案1

有几个选项,从这里开始:

ssh -N -R 21000:127.0.0.1:22 user@remoteserver

这将创建一个到本地 SSH 服务器的隧道(假设它正在标准端口上运行并侦听22)。任何能够localhost:21000从进行连接的人remoteserver都将到达您的 SSH 服务器(因此他们应该用于ssh连接)。如果他们设法进行身份验证、登录并获取 shell,那么通常他们将能够执行命令,包括 Python 脚本。

我的这个答案如果您想从外部授予访问权限remoteserver

通过本地根访问,您可以调整此:

  • 您可以创建一个专用用户,并让相关方以该用户身份进行身份验证。
  • 您可以使用受限 shell 作为用户的登录 shell 来限制他们可以执行的操作。
  • 您可以使用户的登录 shell 自动执行您选择的某个 python 脚本。
  • 或者你可以制作脚本首先是用户的登录 shell。

这种方法可能是最理想的,因为您的本地 SSH 服务器将处理身份验证。路人将无法执行该脚本。

ssh请注意客户端使用和使用的选项 ( -t, )连接到隧道的方式,-T确定是否在服务器上(即本例中在本地计算机上)为它们分配了 tty。


或者,您可以使您的 Python 脚本可用,例如这是我的另一个答案。初始命令是:

# on your local machine
socat TCP-LISTEN:50011,fork EXEC:'/path/to/script',stderr,pty,echo=0

(请参阅;您可能只想使用该选项man 1 socat绑定。)127.0.0.1bind=

然后创建到本地端口的隧道50011

ssh -N -R 21000:127.0.0.1:50011 user@remoteserver

任何连接到 的人localhost:21000remoteserver将无需身份验证即可访问您的脚本。例如,它们可以用于nc连接。

相关内容