After logging in as another user how do I run GUI programs?

thufir@doge:~$ sudo -u hawat -i
hawat@doge:~$ whoami
hawat@doge:~$ pwd
hawat@doge:~$ echo $HOME
hawat@doge:~$ firefox
No protocol specified
Failed to connect to Mir: Failed to connect to server socket: No such file or directory
Unable to init server: Could not connect: Connection refused
Error: cannot open display: :0

4 Answers 4


export DISPLAY=:0 worked for me. Make sure you execute the command on the connecting system, not on the system you're connecting to!

  • 2
    On the machine I was using to connect, not the machine you are connecting to.
    – bgame2498
    Feb 7, 2017 at 18:45
  • ahhh, this is on the same box. diff accounts.
    – Thufir
    Apr 1, 2017 at 20:46
  • 1
    Did not have any effect on my computer Aug 21, 2018 at 14:50
  • not work for me. I don't know why this is happening to me.
    – Chan Kim
    Sep 20, 2019 at 18:15

This answer works on my Ubuntu 16.04 and Mir (with slight adaptations):

Run x command as another user using xauth

Wrapper bash script:

For convenience, I created a wrapper bash script, that you might want to download to /usr/local/bin/xsudo and mark executable (chmod +x /usr/local/bin/xsudo).

Then simply run:

xsudo hawat firefox

Potential Alternatives:

  • As a far simpler alternative, you might look into pam_xauth (s. this answer) However this doesn't work for me for some reason. (I still get the error about firefox not being able to connect to the display at :0)
  • In a lot of forums you might see the command xhost +local: or similar, which will make gksudo -u hawat firefox work without any wrapper script. However be aware that this opens a security loophole: Any active user on your local host will be able to access your keyboard, mouse, screen etc.
  • There used to be sux, which has been discontinued for some reason - you might still be able to download and use it though. As far as I can tell, it did something similar to my script only a lot more. Unfortunately I couldn't find out, why this is no longer maintained. (Maybe because we should now use pam_xauth instead - s. first alternative)

After spending way too much time on this, I discovered that with Gnome on Ubuntu 16.04, the correct value is DISPLAY=:1, not DISPLAY=:0 as it has been from time immemorial.


export DISPLAY=:0 works fine but this is a temporary solution since you need to type this each time when you open the terminal.

Permanent Solution : The problem might be due to env_keep variable in /etc/sudoers. Add the following line at the end of /etc/sudoers using gedit or using sudo visudo

Defaults env_keep+="DISPLAY"

Note : Keep in mind to always use "+=" while adding to env_keep. In case if there are any other env_keep with "=" change them to "+=" because using "=" will override other values.

  • FYI: keep in mind you aren't supposed to edit the sudoers file directly, but by using the visudo wrapper, which provides some sanity checking before writing a new sudoers file. Jan 21, 2019 at 18:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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