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

问题描述:

大家好,我正在Raspberry Pi-3上制作一款汽车。我正在发送一些shh命令。我的问题ID,我不想直接发送shh命令,虽然我想发送一个python控制台输出的输出我该怎么做?我想发送一个python脚本输出到SSH shell

+0

你的问题是不明确的,你要输出(打印报表等)发送到SSH shell或做你该做希望你的python脚本的输出被视为shell命令?如果第一个从ssh会话中调用脚本有什么问题? –

+0

我想把python控制台的输出作为我输入到SSH shell的输入 – salmanarshad1999

+0

真的有两个选择,你可以使用'subprocess.Popen'跨越你的ssh连接,然后发送消息到那个,或者你可以使用一个python ssh库如http://www.paramiko.org/无论哪种方式,你将不得不改变你的脚本,以便“输​​出”不打印,而是发送到子进程或ssh模块 –

您可以在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脚本应该采取任何形式的用户输入?

我无法帮助您使用您寻求的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()