【问题标题】:Running a python script over ssh with paramiko not working as expected使用 paramiko 在 ssh 上运行 python 脚本未按预期工作
【发布时间】:2019-01-19 20:05:13
【问题描述】:

我在覆盆子上有一个可以拍照的 python 脚本,当我使用 putty 运行它时,确实创建了 foo.jpg。

但是,当我使用 paramiko 运行它时,未创建 foo.jpg,但脚本按预期运行(它打印“foo.jpg capture”)。

class RemoteServer():
    def __init__(self, ip, port, username, password):
        self.ip = ip
        self.port = port
        self.username = username
        self.password = password

class RemoteHelper():
    def __init__(self, paramiko_ssh_object):
        self.ssh = paramiko_ssh_object

    def waitForExecCommandEnd(self, channel, command):
        """
        Block untill the end of a command executed by Paramiko.ssh.exec_command
            -channel : (channel) channel stdout returned by Paramiko.ssh.exec_command
            -command : (string) command to run
        """
        while not channel.exit_status_ready():
            print "Waiting for end of {}".format(command)
            time.sleep(1)

    def runRemoteCommand(self, command):
        """
        Run a command on the remote server via ssh and block until it ends
            -command : (string) command to run
        """
        print "running {}".format(command)
        a, stdout, stderr = self.ssh.exec_command(command)
        self.waitForExecCommandEnd(stdout.channel, command)
        for line in stdout.readlines():
            print line
        for line in stderr.readlines():
            print li

def authentificate(ssh, rpi):
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    print "Connection a %s:%s user=%s mdp=XXXXXXXXX" % (rpi.ip, rpi.port, rpi.username)
    ssh.connect(rpi.ip, port=rpi.port, username=rpi.username, password=rpi.password)

rpi = RemoteServer("192.168.1.20", 22, "pi", "raspberry")
ssh = paramiko.SSHClient()
authentificate(ssh, rpi)
remoteHelper = RemoteHelper(ssh)
remoteHelper.runRemoteCommand("sudo python /home/pi/camera/pictaker.py")

这是 RPI 上的脚本:

#!/usr/bin/env python
# --*-- encoding: utf-8 --*--

from time import sleep
from picamera import PiCamera

#camera conf
camera = PiCamera()
camera.resolution = (2592, 1944)
camera.vflip = True
camera.framerate = 5

#camera warmpup
print "preparing camera"
camera.start_preview()
sleep(2)

#taking pic
camera.capture('foo.jpg')
print "foo.jpg captured"
camera.close()

会不会是因为某些 unix 权限?

谢谢。

【问题讨论】:

    标签: python ssh raspberry-pi paramiko


    【解决方案1】:

    尝试:
    1) print(camera.capture('foo.jpg') 看是否返回0
    2)尝试将'foo.jpg'更改为'/tmp/foo.jpg',也许它捕获图像但将其保存到相同的其他路径并且你不知道在哪里
    编辑:
    3)你可以尝试,但它不像上面那么简单,运行 sudo strace -f -o /tmp/strace.out 。然后你会看到是否有任何“权限被拒绝”或其他东西

    【讨论】:

    • foo.jpg 确实保存在其他地方,使用 /tmp/foo.jpg 解决了这个问题。 (print(camera.capture('foo.jpg') 总是显示'None',即使它正在工作)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 2021-11-03
    • 2019-11-04
    • 2015-10-24
    • 1970-01-01
    • 2019-06-20
    相关资源
    最近更新 更多