35

When I am running some software using sudo command it showing error like

cannot connect to X server

For example if I run the following command:

$ sudo gedit /etc/profile

I am getting following command

(gedit:6758): WARNING **: Command line `dbus-launch --autolaunch=84b871d735f31ffe014dc9ba00000009 --binary-syntax --close-stderr' 
exited with non-zero exit status 1: 
Autolaunch error: X11 initialization failed. 
Cannot open display:
Run 'gedit --help' to see a full list of available command line options.

Or if I am running super-boot-manager I am getting following error

buc: cannot connect to X server

Please help.

11
  • Where do you run super-boot-manger from?
    – Thor
    Aug 15, 2012 at 9:49
  • First I have tried to run super-boot-manager directly from unity luncher, it did not worked. Then I have tried it from terminal, then I got those error massage.
    – Apurba
    Aug 15, 2012 at 13:21
  • As in a terminal within the graphical user environment? What does: echo $DISPLAY say? You should run it without sudo as super-boot-manager runs sudo internally.
    – Thor
    Aug 15, 2012 at 15:23
  • echo $DISPLAY is giving :0.0. And I am not running super-boot-manager as sudo. I am running just using command super-boot-manager from terminal.
    – Apurba
    Aug 16, 2012 at 19:36
  • 2
    Finally the problem is solved. I have just added the line: Defaults env_keep="DISPLAY XAUTHORITY" at the end of visudo. Thanks to all, specially @Thor for kind help.
    – Apurba
    Aug 17, 2012 at 8:03

5 Answers 5

51

You need to allow the root user access to the X server:

xhost local:root

And point the command to the right DISPLAY:

sudo DISPLAY=$DISPLAY gedit /etc/profile
5
  • That solved the problem with opening gedit as sudo, but still can't lunch super-boot-manager. It is showing same error
    – Apurba
    Aug 15, 2012 at 5:44
  • I've just learned that sudo -H should be used when starting graphical applications, to avoid file corruption of X-related files.
    – jpaugh
    May 23, 2020 at 9:44
  • setting the DISPLAY in sudo was not even required for me - Debian Buster.
    – Joerg S
    Oct 27, 2020 at 23:02
  • How can I make this permanent?
    – user508402
    Oct 3, 2021 at 19:56
  • @user508402: that depends on many things. You should probably post this as a new question, where you detail your current setup, i.e. shell, window manager etc.
    – Thor
    Oct 5, 2021 at 12:59
20

Finally the problem is solved. I have just added the line:

Defaults env_keep="DISPLAY XAUTHORITY"

at the end of visudo.

To do that you have to run

sudo visudo

it will open the file then add the above line at the end.

Thanks to all, specially @Thor for kind help

2
  • 2
    Defaults env_keep="DISPLAY" works for me.
    – sugab
    Mar 9, 2015 at 16:28
  • I have been searching high and low for this answer forever. I wish I could upvote both of you multiple times for your answers. Thank you so very much! :)
    – Ev-
    Dec 28, 2016 at 6:38
5

Supplementing @Thor's answer:

Run xhost local:root before sudo gedit. To make this permanent, add the line

xhost local:root

to the file ~/.xinitrc 1. Create the file if it doesn't exist.


[1] https://askubuntu.com/a/720120/452398

1
  • Thank you for providing an answer that provides a non-permanent solution. Jan 5, 2019 at 0:07
0

Actually the code you are running has cv2.imshow() or any other display commands, for remote running of code you have to comment them, and better save for visualization.

0
0

set DISPLAY and XAUTHORITY variable environment before running your scrip. for example in systemctl service file:

[Unit]
Description=Start Clock

[Service]
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/pi/.Xauthority
ExecStart=/usr/bin/python3 /home/pi/clock.py
Restart=always
RestartSec=10s
KillMode=process
TimeoutSec=infinity

[Install]
WantedBy=graphical.target

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.