[linux] 'No protocol specified' error

今天突然所有的GUI程序都打不开了, 一直提示有

1
2
3
4
oneyoung:/home/oneyoung$google-chrome-stable
No protocol specified

(google-chrome-stable:13264): Gtk-WARNING **: cannot open display: :0

错误无非就两种:

  • No protocol specified
  • cannot open display

奇了怪了, 最近Arch Linux没有升级过, 也没干过神马坏事, 怎么GUI的程序全废了 T.T

立马Google之, 好像是跟Xauthority有关系. 但是AUTHORITY的env我早就有了, 不是缺失环境变量的缘故.

1
2
oneyoung:/home/oneyoung$env | grep "xauth" -i
XAUTHORITY=/home/oneyoung//.Xauthority

同一个帖子, 上面有一个老外有说, 出现这种问题通常和权限管理有关系:

Can't open display :0 This usually indicates a permission problem;

Xauthority 是由xauth管理的, 咱们来看看xauth是神马东东:

xauth The xauth program is used to edit and display the authorization information used in connecting to the X server. This program is usually used to extract authorization records from one machine and merge them in on another (as is the case when using remote logins or granting access to other users).

简单来说就是对远程client连接X server的一个权限管理.

xauth list 可以列出当前授权的主机列表:

1
2
3
oneyoung:/home/oneyoung$xauth list
localhost/unix:0  MIT-MAGIC-COOKIE-1  xxxxxxxxxxxxxxxx85f2192bf00243e4
Device-04027B/unix:0  MIT-MAGIC-COOKIE-1  xxxxxxxxxxxxxxxx85f2192bf00243e4

xauth 列出来的列表, cookie是绑定hostname的, 会不会就是这个问题?

好吧, 咱来瞅瞅:

1
2
3
4
5
6
oneyoung:/home/oneyoung$hostname
Device-040761

# or another way
oneyoung:~$cat /proc/sys/kernel/hostname 
Device-040761

WTF, hostname 不知怎么被谁给改了, 导致xauth拒绝连接display.

来来来, 到大家喜闻乐见的solution时间了. 不喜欢看废话的, 直接往这边瞧.

无非就是两种方法:

  • 将新的hostname 加入auth list

    1
    2
    
    # 最后一个参数就是 xauth list 列出的hash value
    xauth add $DISPLAY MIT-MAGIC-COOKIE-1  xxxxxxxxxxxxxxxx85f2192bf00243e4
    
  • 把hostname改回去

    1
    
    hostnamectl set-hostname ORIGINAL_HOSTNAME
    

关于hostname

Linux操作系统的hostname是一个kernel变量,可以通过hostname命令来查看本机的hostname。也可以直接cat /proc/sys/kernel/hostname查看。

1
2
3
hostname
# or this way
cat /proc/sys/kernel/hostname

上面两种输出结果相同。

Note: 此hostname和/etc/hosts里面的hostname不一样.

临时更改hostname

修改运行时Linux系统的hostname,即不需要重启系统. hostname命令可以设置系统的hostname

1
#hostname newname

newname即要设置的新的hostname,运行后立即生效,但是在系统重启后会丢失所做的修改,如果要永久更改系统的hostname,就要修改相关的设置文件。

永久更改hostname

hostnamectl 提供了一个命令接口, 将新的hostname写入到/etc/hostname配置文件.

1
2
hostnamectl set-hostname newhostname
# newhostname is the hostname you want to set

Ref:

  1. https://bbs.archlinux.org/viewtopic.php?id=122848
  2. http://liuleijsjx.iteye.com/blog/427900
  3. https://wiki.archlinux.org/index.php/Network_configuration#Set_the_hostname

留言