如何从 .sh 可执行文件执行远程 Python 文件?

Posted

技术标签:

【中文标题】如何从 .sh 可执行文件执行远程 Python 文件?【英文标题】:How do I execute a remote Python file from a .sh executable? 【发布时间】:2014-12-17 11:52:01 【问题描述】:

我使用的是 Mac。

我在服务器上有一个 Python 文件。假设它在这里:http://jake.com/python_file.py。我想制作一个我可以run in Terminal by double-clicking 的脚本,并将在本地机器上的终端中运行 Python 文件。有什么想法吗?

我是否必须使用 SSH 连接到服务器并使用download the file 连接到硬盘驱动器上的临时位置 (/tmp?),然后在完成后将其删除?但这还有另一个问题。它必须将 Python 文件下载到用户主文件夹中的某个位置,因为我认为用户没有必要的权限来写入文件夹 /tmp 或 /var 或类似的东西。

我四处寻找解决问题的方法并找到了this。它讨论了如何在 unix 上使用 SSH 执行远程脚本,但我尝试使用我的 Python 文件执行此操作,但没有成功。

如果您没有意识到,我希望这样做的主要原因是用户可以在本地运行文件,但他们无法读取/编辑存储在服务器上的实际 Python 文件。

如果有人对如何实现这一点有任何想法(无论是否使用上述想法),请告诉我,我将不胜感激!

谢谢, 杰克

【问题讨论】:

用户没有对/tmp 的写入权限是不寻常的。此外,如果用户可以下载脚本,那么他们可以随意阅读和修改它 - ssh 只会限制可以这样做的用户集。 @mhawke 没关系。我真的不在乎是否有人阅读我只关心 Python 文件的脚本。但是如果他们不知道 python 文件在哪里,那么他们就无法读取它。 “脚本”是指远程 Python 文件。你将如何向确定的用户隐藏它的位置? @mhawke 好吧,如果必须将文件下载到用户的计算机上,那么我想他们可以找到它,但我认为如果它隐藏在文件系统中将很难找到。但是如果该文件可以远程运行,那么无论用户多么确定,他们都无法访问它。我在这里可能完全错了,但是不可能像 php 一样在服务器端运行 Python 文件,这样文件就永远不会真正在用户的计算机上,只是输出。 对不起,也许我不明白。你的问题是(是?)如何在本地机器上运行存储在远程服务器上的 python 脚本 - 正如你所说的,以某种方式将 python 脚本复制到本地机器,然后执行它。如果你想远程运行python脚本,那是完全不同的事情,有很多解决方案。 【参考方案1】:

假设远程 Python 脚本是一个单独的文件,除了 Python 标准库的依赖之外没有其他依赖项,并且在用户的本地计算机上安装了兼容的 Python 版本,有一些明显的方法可以做到这一点。

使用ssh:

#!/usr/bin/env sh
ssh user@host cat /path/to/python/script.py | python

或使用scp:

#!/usr/bin/env sh
TMPFILE=/tmp/$$
scp user@host:/path/to/python/script.py $TMPFILE
python $TMPFILE
rm $TMPFILE

第一个具有明显的优势,不需要复制文件和事后清理。

如果你想在远程服务器上执行 python 脚本,也可以通过 ssh 来完成:

ssh user@host python /path/to/python/script.py

标准输入和输出将是用户本地机器上的终端。

【讨论】:

【参考方案2】:

像这样下载和执行代码的python脚本怎么样?

import requests 
py1 = requests.get('https://example.com/file.py').content
exec(py1, globals(), locals())

注意:我使用的是requests 库,但您也可以轻松地使用内置的httplib 的HTTPSConnection。它只是更冗长。

注意 2:当您说您不希望用户能够“读取/编辑实际的 Python 文件”时,如果他们自己打开 url,他们能够读取它并查看内容。他们不太可能在本地编辑文件并搞砸一些事情。您还可以将 Python 脚本的更新部署到 URL,而不必将它们本地复制到每台机器。这可能会带来安全风险,具体取决于您使用它的范围。

【讨论】:

感谢您的回答。我安装了请求库,但在运行您提供的 Python 文件时出现错误。这是错误:Traceback (most recent call last): File "/Users/jake 1/Dropbox/Python/downloadpy.py", line 3, in <module> exec(py1, globals(), locals()) File "<string>", line 1 <!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN"> ^ SyntaxError: invalid syntax 打开替换“example.com/file.py”的网址?是 python 代码,还是以 '..' 开头

以上是关于如何从 .sh 可执行文件执行远程 Python 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python执行远程shell脚本

linux怎么远程执行另一台linux机器上的shell文件?

java如何执行远程服务器上的.sh文件

shell中怎么批量执行命令。

运行 .sh 脚本而不是可执行文件

如何让shell脚本变成可执行文件