我正在尝试运行一个paramiko
应该能够打开 X 窗口的命令。我使用的脚本如下:
import paramiko
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect('192.168.122.55', username='user', password='password')
transport = ssh_client.get_transport()
session = transport.open_session()
session.request_x11()
stdin = session.makefile('wb')
stdout = session.makefile('rb')
stderr = session.makefile_stderr('rb')
session.exec_command('env; xterm')
transport.accept()
print 'Exit status:', session.recv_exit_status()
print 'stdout:\n{}'.format(stdout.read())
print 'stderr:\n{}'.format(stderr.read())
session.close()
不幸的是,当我运行上面的脚本时,我得到了这个输出:
Exit status: 1
stdout:
SHELL=/bin/bash
XDG_SESSION_COOKIE=8025e1ba5e6c47be0d2f3ad6504a25ee-1347286654.617967-1932974971
SSH_CLIENT=192.168.122.1 58654 22
USER=user
MAIL=/var/mail/user
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
PWD=/home/user
LANG=en_US.UTF-8
SHLVL=1
HOME=/home/user
LOGNAME=user
SSH_CONNECTION=192.168.122.1 58654 192.168.122.55 22
DISPLAY=localhost:10.0
_=/usr/bin/env
stderr:
xterm: Xt error: Can't open display: localhost:10.0
如果我在终端中运行以下命令:
ssh -X user@192.168.122.55 'env; xterm'
然后我得到相同的环境变量(虽然有些端口发生了变化),所以我会说我的环境是正确的。但是,我仍然缺少paramiko
使用 x11 转发的东西。
我尝试过的几件事是:
- 使用
handler
参数 inrequest_x11
: 除了打印值之外,我没有比使用默认处理程序更进一步。 - Use the
auth_cookie
parameter in : 尝试硬编码根据输出request_x11
正在使用的 cookie 值。xauth list
这样做的想法是避免根据文档字符串paramiko
本身可能发生的问题:
如果省略 auth_cookie,将生成、使用和返回一个新的安全随机 128 位值。您将需要使用此值来验证传入的 x11 请求并将其替换为实际的本地 x11 cookie(这需要一些 x11 协议的知识)。
我还能做些什么来使其正常工作或解决问题吗?
注意:这已经在之前被问过:
- superuser:唯一的响应指向
request_x11
我已经尝试使用无济于事的文档。 - stackoverflow:接受的响应建议使用
handler
参数,但它是错误的。 - github:一年多没有提供答案。