通过 SSH 登录网络后,网络使用的默认 shell 是 BASH。
只有启用了 X11 转发,才可以运行使用图形的应用程序,我通常-X
在登录时通过该选项执行此操作:
ssh -X [email protected]
我注意到,当启用它时,DISPLAY 环境变量存在并被设置为这样DISPLAY=localhost:11.0
,但是没有什么可以阻止用户导出名为相同内容的环境变量,使其看起来好像已启用。
有没有办法从 bash shell 或 bash 脚本来确定是否启用了 X11 转发?
答案1
第一的,为什么?用户为什么要伪造 DISPLAY?尽管如此,我看到了两种解决方法:
readonly DISPLAY
在 bashrc/配置文件中。如果在登录时正确执行,用户之后将无法设置 DISPLAY。xset q
。查询一些X11信息。如果不存在 X11 会话,则返回错误
答案2
测试DISPLAY
是正确的事情。你不可能做得更好,任何变得更聪明的尝试很可能弊大于利。
是的,当然,用户可以撒谎并设置DISPLAY
为不正确的值。但用户也可以关闭显示器;你永远无法保证他们会看到你展示的内容。如果用户撒谎了,你无论如何也无法知道。可以DISPLAY
设置一个值,使信息显示在其他地方(通常在同一用户的另一个会话中)。相反,即使存在有效值,也可能会被DISPLAY
取消设置或设置为无效值,但您无法知道该值是什么。
当然有可能DISPLAY
会被设置,但你无法连接到 X 服务器。在这种情况下,有用的做法是打印一条清晰的错误消息。如果DISPLAY
已设置但不可用,则表明某处配置错误,您应该将此信息传达给用户。
答案3
据我了解,您无法通过测试 DISPLAY 变量来判断,但是,在建立 SSH 会话时,有一个 SSH_CONNECTION 环境变量。 X11-Forarding 不使用 xhost,但如果 SSH_CONNECTION 变量存在并且您可以使用 xhost 而不会产生错误,那么您显然拥有一个支持 X 的连接,因此是 X11-Forwarding。