我有一个远程服务器,我可以使用 ssh 登录。但是我的用户没有主目录。
当我尝试ssh -X
连接到该服务器时,ssh 尝试将一个 cookie 放入其中~/.Xauthority
,但显然失败了,因此不可能有 X 输出。
据我所知,没有办法指定不同的文件来保存 cookie。
因此我尝试在临时家中手动设置:
mkdir -p /tmp/myhome
cd /tmp/myhome
export HOME=$PWD
xauth add $DISPLAY . $COOKIE
xlogo # test setup
理论上,ssh 应该正确设置隧道并设置 $DISPLAY,唯一缺少的是 $COOKIE 的正确值。
另一台服务器上显示的值xauth list
(类似ffb3c8b945442b70146f7158861f1a54
)在这台服务器上似乎无效。
问题:
- 为什么在一台服务器上工作的 cookie 在另一台服务器上不起作用?
- 在我的情况下如何获得有效的 cookie?
- 在这种情况下,是否有更简单的方法来设置 xforwarding? (除了获取正确的主目录或使用未加密的
xhost
连接)
答案1
OpenSSH 提供了另一种在协议端设置 X cookie 的方法:sshrc
文件。此文件可以是~/.ssh/rc
或/etc/ssh/sshrc
(或/etc/sshrc
或其他位置,具体取决于服务器配置)。手册提供了该文件中用于手动设置 cookie 的代码片段。除非您的服务器/bin/sh
是 POSIX 之前的古董,否则您可以将此代码简化为
if read proto cookie && [ -n "$DISPLAY" ]; then
echo "add unix:${DISPLAY#localhost:} $proto $cookie" | xauth -q -
fi
该手册建议将此代码放在一些设置主目录的代码之后 - 在您的情况下,您需要设置HOME
环境变量,可能首先为其创建一个临时目录。
您的代码类似,但保留localhost:
在显示的开头,如果服务器未侦听 TCP 连接,则该代码将不起作用。表单的显示localhost:10
并不等同于:10
,尽管如果两者都工作,它们具有类似的效果:具有主机名的表单通过 TCP 连接,而没有主机名的表单使用 Unix 套接字,这可能是所有可用的(即使 TCP 可用,它也允许优化,但我怀疑当连接通过 TCP 通过 SSH 中继时,这些优化是否会起作用)。
更喜欢echo add … | xauth -
而不是xauth add …
因为另一个用户窥探您创建的进程可能会捕获xauth
命令行。由于echo
是内置的 shell,他们将无法使用表单恢复 cookie echo add …
。