我有一个本地(本地网络,位于 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.1
bind=
然后创建到本地端口的隧道50011
:
ssh -N -R 21000:127.0.0.1:50011 user@remoteserver
任何连接到 的人localhost:21000
都remoteserver
将无需身份验证即可访问您的脚本。例如,它们可以用于nc
连接。