【问题标题】:Connecting in SSH in a Python script在 Python 脚本中连接 SSH
【发布时间】:2017-02-17 21:39:27
【问题描述】:

我通过 SSH 连接到第一个 Raspberry Pi (172.18.xx),我想在第一个 RPI 上启动一个脚本,但该脚本在另一个 Raspberry Pi (192.168.xx) 上。 首先,我进行了配置,无需密码即可从第一个 RPI 连接到第二个 RPI。 当我在第一个时,我正在启动这个命令:

ssh pi@192.168.x.x 'sudo python script_RPI2.py'

这工作正常,我可以检查正确的结果,但我想在第一个 RPI 上的另一个脚本中启动这个脚本。所以,我把前面的命令放在文件中:script_RPI1.py。 然后,我启动脚本:sudo python script_RPI1.py 我收到以下错误:

 ssh pi@192.168.x.x 
         ^
SyntaxError: invalid syntax

有人知道我的问题吗?

【问题讨论】:

    标签: python ssh raspberry-pi ip raspberry-pi3


    【解决方案1】:

    你是如何启动脚本的?从您提供的最少信息中可以看出,您正在尝试或在 Python 交互式解释器中执行该命令,或者您想在解释器中执行该命令,而您忘记用引号 (") 将其括起来以使其为一个字符串。

    请多解释一下。

    你想运行一个 bash 命令:

    ssh pi@192.168.x.x 'sudo python script_RPI2.py'
    

    您将在 .sh 文件中显示,如下例所示:

    #!/bin/sh
    
    ssh pi@192.168.x.x 'sudo python script_RPI2.py'
    

    保存此文件后,只需执行 ./name_of_file.sh,它只会在终端中运行您的 bash 文件,如果您想运行在另一个进程中打开终端并执行终端命令字符串的 python 脚本,您应该看看这样的东西:

    from subprocess import call
    call(["ls"])
    

    这将在另一个终端进程中执行 ls 并将结果返回给您。请检查您想要实际执行的操作并决定其中一种路径。

    【讨论】:

    • 我说我从第一个 RPI (172.18.x.x) 启动脚本:sudo python script_RPI1.py,在这个脚本中,有命令:ssh pi@192.168.x.x 'sudo python script_RPI2.py'这不是引号的问题,因为我在引号中遇到了同样的错误。这是 script_RPI1.py 的代码:#!/usr/bin/python ssh pi@192.168.x.x 'sudo python script_RPI2.py' 如果我在脚本中删除了 'sudo ...',我得到了同样的错误:SyntaxError: invalid syntax
    • 好吧,我想我明白了,这行:ssh pi@192.168.x.x 'sudo python script_RPI2.py' 不是一个有效的 python 语句,你正试图这样运行它。请回答我这个问题,您喜欢在您的机器上将其作为 shell 脚本启动,还是在进程中打开终端并执行命令的 python 脚本启动?
    • 事实上,在文件script_RPI1.py和script_RPI2.py中,我有很多行是用Python编码的,所以最好用Python而不是bash shell继续。同时,是否可以在 Python 脚本中启动 bash 脚本?就我而言,我将在第一个 RPI 中创建一个由 #!/bin/sh ssh pi@192.168.x.x 'sudo python script_RPI2.py' 组成的文件:script.sh,我将在 script_RPI1.py 中通过 bash script.sh 调用此脚本。可能吗 ?如果是的话,我明天试试
    • 我尝试了我在下面说的但没有用,我认为sudo bash script.sh这不是一个有效的python语句
    • 我也在文件 script_RPI1.py 中尝试了from subprocess import call call(["sudo python script_RPI2.py"]),但它不起作用,而它只使用ls
    【解决方案2】:

    修改了整个答案,实际上在代码上花费了一些额外的时间。供您集成的完整解决方案类似于下面的代码。请注意,代码的设置方式可以定义要连接的主机,以及要在远程 RPi 中执行的命令

    import subprocess
    import sys
    
    remoteHost="pi@192.168.x.x"
    command="python /path/to/script.py"
    
    ssh = subprocess.Popen(["ssh", "%s" % remoteHost, command],
                           shell=False,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE)
    result = ssh.stdout.readlines()
    if result == []:
        error = ssh.stderr.readlines()
        print >>sys.stderr, "ERROR: %s" % error
    else:
        print result
    
    yourVar = result   ### This is where you assign the remote result to a variable
    

    【讨论】:

    • 这是错误信息:Traceback (most recent call last): File "script_RPI1.py", line 110, in <module> Flow_sensor = call(['ssh pi@192.168.x.x "sudo python /home/pi/script_RPI2.py"']) File "/usr/lib/python2.7/subprocess.py", line 522, in call return Popen(*popenargs, **kwargs).wait() File "/usr/lib/python2.7/subprocess.py", line 710, in __init__ errread, errwrite) File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory
    • 我尝试了通过放入文件 script_RPI1.py 的方法:'from subprocess import call RPI2_Sensor = call(['ssh pi@192.168.x.x "sudo python /home/pi/script_RPI2.py "']) print (RPI2_Sensor)` 错误信息如下
    • 我更改了整个答案并添加了一些代码,使您可以轻松插入远程主机和要执行的命令,在这种情况下,您的 Python 脚本可以从传感器获取值。我希望它有所帮助。
    • 您的脚本工作正常,但是当我将它整合到整个文件(即 script_RPI1.py)中时,我刚刚得到了脚本的结果,所以我在第二个 RPi 上得到了传感器的结果,但是我没有在第一个 RPI 上得到其他传感器的结果
    • 你再试一次吗?该代码使用“Popen”而不是“调用”。此外,您需要将整段代码包含在“script_RPI1.py”中。它没有包含在此处,因此您必须根据需要调整缩进以及远程主机数据和远程 Pi 中脚本的路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多