1

I open a terminal and use sudo -s -u mysql. Now when i try to open a file, whose owner is mysql using gedit xyz.err, I get the error :

No protocol specified

** (gedit:23076): WARNING **: Could not open X display
No protocol specified
error: XDG_RUNTIME_DIR not set in the environment.

(gedit:23076): Gtk-WARNING **: cannot open display: :0

Is there some way to resolve this error ?

faizal
  • 111

3 Answers3

0

I didn't catch the question had nothing to do with mysql! The question is actually here:

** (gedit:23076): WARNING **: Could not open X display
No protocol specified
error: XDG_RUNTIME_DIR not set in the environment.

(gedit:23076): Gtk-WARNING **: cannot open display: :0

The question then becomes "why didn't sudo -s -u mysql export my environment variable to the mysql session, including and especially all the environment variables relative to X?"...

Well, consider this:

root@o-2:~# export vartest="this is a test variable"
root@o-2:~# echo ${vartest}
this is a test variable
root@o-2:~# sudo -s -u mysql
mysql@o-2:/root$ echo ${vartest}

mysql@o-2:/root$ exit

That's what you have at the moment. if you try to echo ${XDG_DISPLAY} in your original session, you probably get something, while when you do it in the mysql session, you get nothing.

There is a solution in man sudo:

-E, --preserve-env
Indicates to the security policy that the user wishes to preserve their existing environment variables.
The security policy may return an error if the user does not have permission to preserve the environment.

So, let's try that:

root@o-2:~# sudo -s -u mysql --preserve-env
bash: /root/.bashrc: Permission denied
mysql@o-2:~$ echo ${vartest}
this is a test variable
mysql@o-2:~$ whoami
mysql
mysql@o-2:~$ exit

As you can see, it kinda works: you "become" mysql with all the environment of your original user, expect a couple of mismatches, especially if you were coming from a root session. Fortunately, the manpage also says:

--preserve-env=list
Indicates to the security policy that the user wishes to add the comma-separated list of environment variables to those preserved from the user's environment.
The security policy may return an error if the user does not have permission to preserve the environment.
This option may be specified multiple times.

Let's try that:

root@o-2:~# sudo -s -u mysql --preserve-env=vartest
mysql@o-2:/root$ echo ${vartest}
this is a test variable
mysql@o-2:/root$ 

I don't have an X server at hand to test exactly your issue, but start with

sudo -s -u mysql --preserve-env=XDG_RUNTIME_DIR

and add variable names until you get no error (it's comma-separated, like in --preserve-env=XDG_RUNTIME_DIR,DISPLAY).

0

You can get an interactive session by using su - mysql, and then run gedit. Works for me.

man sudo doesn't give any details, but it could be that the default shell launched with -s is very limited.

l0b0
  • 7,453
-1

You're looking in the wrong place, running mysql as (system) user mysql won't solve anything.

mysql is a client program, the authentication to the server, run by mysqld, is made on the connection (tcpdump port 3306 to make it clear).

Therefore, you can launch mysql with any "system" user, like:

$ mysql -u root -p localhost

Give the admin ("root") password when prompted, and then you should see this:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 240
Server version: 5.5.38-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

...and there you go!

digitxp
  • 14,884