我想将一个python的脚本输出发送到SSH shell

时间:2017-10-17 13:18:57

标签: python shell terminal raspberry-pi

大家好,我在Raspberry Pi-3上开车。我正在发送一些嘘命令。我的问题ID我不想直接发送shh命令,虽然我想发送一个python控制台输出的输出我该怎么办?

2 个答案:

答案 0 :(得分:0)

您可以在python中使用OS库,这将允许python程序与unix shell集成。

#Import Library
import os

#Set the action to 0 as it's not needed right now
action = 0

#Loop infinitely
while True:
    #First of all, list the available actions and let the user choose one.
    print('Actions that can be performed')
    print('ID.  Action')
    print('')
    print('1.  Go Forward')
    print('2.  Go Backwards')
    print('3.  Stop')
    print('')
    print('0.  Stop and exit program')
    print('')

    #Ask the 'driver' what they want the car to do. Program will hang continuing
    #to perform any current action that was previously selected until a different
    #action is provided.
    action = int(input('Enter the numerical ID of the action and press return: '))

    #Do the action based on the numerical ID
    if(action == 1):
        os.system('shell-command-to-go-forward')

    if(action == 2):
        os.system('shell-command-to-go-backward')

    if(action == 3):
        os.system('shell-command-to-stop-everything')

    if(action == 0):
        os.system('shell-command-to-stop-everything')
        exit(0)

如果这不是你想要做的,请你更具体一点。 python脚本是否应该采用任何形式的用户输入?

答案 1 :(得分:0)

我无法帮助您使用ssh功能,因为我从未尝试过,也没有我现在可以使用的工具尝试。但是,我不相信这是适合此目的的正确工具。 相反,我使用tkinter GUI连接套接字服务器示例,按箭头键将事件发送到套接字服务器,然后可以对其执行操作。

server.py:

import socket

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Bind the socket to the port
server_address = ('localhost', 10000)
print('starting up on %s port %s' % server_address)
sock.bind(server_address)

while True:
    try:
        # Listen for incoming connections
        sock.listen(1)

        while True:
            # Wait for a connection
            print('waiting for a connection')
            connection, client_address = sock.accept()

            try:
                print('connection from', client_address)

                # Receive the data in small chunks and retransmit it
                while True:
                    data = connection.recv(16)
                    if data:
                        print('received "%s"' % data)
                        # here you can test the character received and act accordingly
                        # you could also opt to send data back the other way
#                       print('sending data back to the client')
#                       connection.sendall(data)
                    else:
                        print('no more data from', client_address)
                        break

            finally:
                # Clean up the connection
                connection.close()
    except:
        pass

client.py

import socket
import tkinter as tk

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.title("Car control")

        self.sock = None

        self.addr = tk.Entry(self)
        self.addr.insert(0, "127.0.0.1")
        self.addr.grid(column=1, row=1, sticky="nesw")

        self.button = tk.Button(self, text="Connect", command=self.connect)
        self.button.grid(column=2, row=1, sticky="nesw")

        self.bind("<KeyPress>", self.handle_binding)
        self.bind("<KeyRelease>", self.handle_binding)

    def connect(self):
        try:
            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.sock.connect((self.addr.get(),10000))
            self.addr.configure(state="disabled")
            self.button.configure(text="Disconnect", command=self.disconnect)
            self.focus()
        except (ConnectionRefusedError, socket.gaierror):
            pass

    def disconnect(self):
        self.sock.close()
        self.sock = None
        self.addr.configure(state="normal")
        self.button.configure(text="Connect", command=self.connect)

    def send(self, data):
        if self.sock:
            self.sock.sendall(data.encode('utf8'))

    def handle_binding(self, event):
        if event.widget != self.addr: # ignore key events aimed at texkbox
            char = ""
            if event.keysym == "Up":
                char = "u"
            elif event.keysym == "Down":
                char = "d"
            elif event.keysym == "Left":
                char = "l"
            elif event.keysym == "Right":
                char = "r"
            if event.type == '2': # pressed
                self.send(char)
            elif event.type == '3': # released
                self.send(char.upper())

if __name__ == "__main__":
    app = App()
    app.mainloop()