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转发配合使用。我尝试过的几件事情是:
- 在
request_x11
中使用handler
参数:除了打印值之外,我没有比默认处理程序更进一步。 - 在
request_x11
中使用auth_cookie
参数:尝试硬编码一个cookie值,该值根据xauth list
输出正在使用。这样做的想法是避免根据paramiko
自身的文档字符串可能发生的问题:
还有其他什么我可以做来使它工作或解决问题吗?如果省略auth_cookie,则会生成、使用和返回新的安全随机128位值。您需要使用此值来验证传入的x11请求,并用实际的本地x11 cookie替换它们(这需要一些关于x11协议的知识)。
注意: 这个问题之前已经被问过:
- superuser: 唯一的回答指向我已经尝试过但无济于事的
request_x11
文档。 - stackoverflow: 接受的回答建议使用
handler
参数,但是是错误的。 - github: 一年多没有提供答案。
netstat -lpn
。它是否在端口6010上侦听,地址为127.0.0.1?(2)ls -l ~user/.Xauthority
显示什么? - n. m.