【发布时间】:2013-10-12 23:39:39
【问题描述】:
程序的流程是:
- 使用 Paramiko 库连接到 Linux 机器上的 OpenSSH 服务器
- 打开 X11 会话
- 运行 xterm 可执行文件
- 通过在终端中键入可执行文件名称并运行它来运行其他程序(例如 Firefox)。
如果有人可以解释如何使某些可执行文件在使用以下代码打开的终端中运行并提供示例源代码 (source),我将不胜感激:
import select
import sys
import paramiko
import Xlib.support.connect as xlib_connect
import os
import socket
import subprocess
# run xming
XmingProc = subprocess.Popen("C:/Program Files (x86)/Xming/Xming.exe :0 -clipboard -multiwindow")
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(SSHServerIP, SSHServerPort, username=user, password=pwd)
transport = ssh_client.get_transport()
channelOppositeEdges = {}
local_x11_display = xlib_connect.get_display(os.environ['DISPLAY'])
inputSockets = []
def x11_handler(channel, (src_addr, src_port)):
local_x11_socket = xlib_connect.get_socket(*local_x11_display[:3])
inputSockets.append(local_x11_socket)
inputSockets.append(channel)
channelOppositeEdges[local_x11_socket.fileno()] = channel
channelOppositeEdges[channel.fileno()] = local_x11_socket
transport._queue_incoming_channel(channel)
session = transport.open_session()
inputSockets.append(session)
session.request_x11(handler = x11_handler)
session.exec_command('xterm')
transport.accept()
while not session.exit_status_ready():
readable, writable, exceptional = select.select(inputSockets,[],[])
if len(transport.server_accepts) > 0:
transport.accept()
for sock in readable:
if sock is session:
while session.recv_ready():
sys.stdout.write(session.recv(4096))
while session.recv_stderr_ready():
sys.stderr.write(session.recv_stderr(4096))
else:
try:
data = sock.recv(4096)
counterPartSocket = channelOppositeEdges[sock.fileno()]
counterPartSocket.sendall(data)
except socket.error:
inputSockets.remove(sock)
inputSockets.remove(counterPartSocket)
del channelOppositeEdges[sock.fileno()]
del channelOppositeEdges[counterPartSocket.fileno()]
sock.close()
counterPartSocket.close()
print 'Exit status:', session.recv_exit_status()
while session.recv_ready():
sys.stdout.write(session.recv(4096))
while session.recv_stderr_ready():
sys.stdout.write(session.recv_stderr(4096))
session.close()
XmingProc.terminate()
XmingProc.wait()
我正在考虑在子线程中运行程序,而运行 xterm 的线程正在等待子线程终止。
【问题讨论】:
-
“在终端中输入”是什么意思?如果它通过 X11 发送模拟击键,那么这个练习 (a) 奇怪 (b) 困难 (c) 毫无意义,并且 (d) 与您发布的代码完全无关。如果您只是需要以某种方式使 Firefox 在 xterm 中运行,那么您可以使用类似于
session.exec_command('xterm -e firefox')的东西。 -
@n.m.谢谢。你的命令对我有帮助。然而,我的最终目标是以某种方式模仿 X11 用户的行为。这意味着运行程序、打开文件和做普通用户会做的事情。这意味着除了运行程序之外,还需要在一些基本级别上控制程序。
-
为什么要从 xterm 运行 firefox?可能是 X 会话没有从 xterm 传播到 firefox,而后者找不到要运行的 DISPLAY。 xterm 应该用于在 stdout/stderr 上具有文本输出的命令行应用程序
-
看起来你正在尝试开发一个终端模拟器。
标签: python multithreading ssh x11 paramiko