我已经在网上搜索了很长时间,但我仍然没有得到答案。
让我举一个问题来更清楚地描述我的问题:
机器A(本地)现在连接到机器B(远程)。我想做的就是:
P.S这个python程序存储在机器B上。
这是我现在所做的事情:
这是我的名为test.py的python程序,它存放在/ home / pi / Documents下的B上:
import webbrowser
webbrowser.open('http://www.google.com')
在A上,我使用了命令:
ssh <username of B>@<ip of B> python /home/pi/Documents/test.py
在A上运行上述命令后,A上没有错误,但B上没有任何操作。
如果我将命令更改为在B上创建文件或 sudo reboot ,则在运行此命令后,将在B上创建一个文件或者B成功关闭。
如果我将python程序更改为打印内容,例如:
print("hello from B")
内容神奇地印在A&#39的终端上。
如果我想在B上打开网页或在B上打印某些内容,这个命令似乎不能正常工作。
任何人都可以帮我解决这个问题,还是有其他方法可以实现这个目标?
无助..
有人有什么想法吗??? 提前谢谢!
答案 0 :(得分:1)
最简单的解决方案之一是使用stdin的重定向
$ ssh pi@B python <<EOF
> print "Hello World from B"
> EOF
Hello World from B
$
但是,如果脚本非常大,最好将py文件复制到服务器B,然后使用@Eliethesaiyan建议的文件名调用ssh。
$ scp X.py pi@B:/home/pi/
X.py 100% 26 0.0KB/s 00:00
$ ssh pi@B python X.py
Hello World from B
$
答案 1 :(得分:1)
假设B是Linux或类Unix系统,则会出现DISPLAY问题。 webbrowser
模块在计算机上找到浏览器,并尝试在当前显示器上打开它。当你在localy启动它时它会起作用,但是ssh会话默认没有配置显示,因此任何启动XWindow(GUI)应用程序的尝试都将失败。
其背后的基本原理是ssh命令的-X
和-Y
标志允许将客户端显示传递到服务器并在本地屏幕上打开窗口(在您的示例中为A) 。因此,如果A和B上的X服务器的权限兼容,您可以尝试:
A$ ssh -Y <username of B>@<ip of B> # open an interactive shell on B
B$ echo $DISPLAY # control the DISPLAY env variable
-> localhost:10.0 # common value for ssh transported DISPLAY
B$ python /home/pi/Documents/test.py # open the window on A
要强制打开B,可以将DISPLAY设置为localhost:0.0(主要XWindow)
A$ ssh ssh <username of B>@<ip of B> # open an interactive shell on B
B$ DISPLAY = localhost:0.0 # sets the DISPLAY env variable
B$ export DISPLAY
B$ python /home/pi/Documents/test.py # open the window on B
您可能需要在A和/或B上调整XWindow服务器的授权(或使用可怕的xhost +
)以使上述示例正常工作
一旦您能够在正确的屏幕上成功打开一个窗口,您就必须在打开浏览器窗口之前将DISPLAY环境变量设置为Python脚本中的正确值。
答案 2 :(得分:0)
我已经使用运行Ubuntu的虚拟机对此进行了测试,您在远程系统上运行了哪些操作系统?这是我的launch_google.py
:
import os
os.environ["DISPLAY"] = ":0"
import webbrowser
webbrowser.open("https://google.com")
使用以下方式启动:
ssh <user>@<IP Address> "python launch_google.py&"
我包含了&符号,否则ssh会话保持打开状态。 python进程不需要继续运行。
在导入DISPLAY
模块之前设置webbrowser
环境变量很重要,否则浏览器将无法正确设置。您可以通过SSH验证此运行的python:
>>> import os
>>> "DISPLAY" in os.environ
False
>>> import webbrowser
>>> len(webbrowser._browsers)
0
>>> webbrowser.open("https://google.com")
False
>>> os.environ["DISPLAY"] = ":0"
>>> reload(webbrowser)
<module 'webbrowser' from '/usr/lib/python2.7/webbrowser.pyc'>
>>> len(webbrowser._browsers)
3
>>> webbrowser.open("https://google.com")
True
>>>