我想发送一个python脚本输出到SSH shell
问题描述:
大家好,我正在Raspberry Pi-3上制作一款汽车。我正在发送一些shh命令。我的问题ID,我不想直接发送shh命令,虽然我想发送一个python控制台输出的输出我该怎么做?我想发送一个python脚本输出到SSH shell
答
您可以在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()
你的问题是不明确的,你要输出(打印报表等)发送到SSH shell或做你该做希望你的python脚本的输出被视为shell命令?如果第一个从ssh会话中调用脚本有什么问题? –
我想把python控制台的输出作为我输入到SSH shell的输入 – salmanarshad1999
真的有两个选择,你可以使用'subprocess.Popen'跨越你的ssh连接,然后发送消息到那个,或者你可以使用一个python ssh库如http://www.paramiko.org/无论哪种方式,你将不得不改变你的脚本,以便“输出”不打印,而是发送到子进程或ssh模块 –