Cómo pasar la contraseña a la línea de comando mysql

20

He contraseña de MySQL guardado en un archivo foo.php, por ejemplo P455w0rd, cuando trato de usarlo:

$ cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2 | mysql -U root -p mydb -h friendserver
Enter password: (holds)

$ echo P455w0rd | mysql -u root -p mydb -h friendserver
Enter password: (holds)

Ambas opciones aún solicitan contraseña, ¿cuál es la forma correcta de enviar la contraseña stdin?

Kokizzu
fuente
3
debe haber ningún espacio en blanco entre el -py su contraseña.
Firat küçük
mysql no lee la contraseña de la entrada estándar, que no era capaz de entender que lo que sí lo leyó a partir.
Omn
La respuesta correcta es no poner sus contraseñas en la línea de comando donde cualquier persona con acceso /procpueda leerlas trivialmente mientras el programa se esté ejecutando . Para eso ~/.my.cnfes a, correctamente modificado a 0600
Shadur

Respuestas:

25

Debes tener mucho cuidado al pasar las contraseñas a las líneas de comando, ya que, si no tienes cuidado, terminarás dejándolo abierto al uso de herramientas como ps.


La forma más segura de hacer esto sería crear un nuevo archivo de configuración y pasarlo a mysqlusar ya sea el --defaults-file=o la --defaults-extra-file=opción de línea de comandos.

La diferencia entre los dos es que este último se lee además de los archivos de configuración por defecto, mientras que se utiliza con el anterior, sólo el archivo de un pasado como argumento.

Su archivo de configuración adicional debe contener algo similar a:

[client]
user=foo
password=P@55w0rd

Asegúrese de que se asegure este archivo.

Entonces corre:

mysql --defaults-extra-file=<path to the new config file> [all my other options]
garethTheRed
fuente
2
MySQL modificará su argvpara sobrescribir los parámetros dados a la -pbandera. Al menos eso es lo que se llegó a la conclusión aquí, junto con otra información relevante: unix.stackexchange.com/questions/78757/...
Kusalananda
Esta es la mejor solución, ya que proporciona una medida de seguridad. Es necesario que chmod go-rwx, y asegúrese de que este argumento precede a todos los demás argumentos.
ChuckCottrill
1
@Kusalananda, sí, pero según los comentarios en unix.stackexchange.com/q/385339/135943 , ¡eso no significa que sea seguro!
Comodín el
Podría valer la pena agregar una nota sobre --login-pathahora que es compatible. No es mucho mejor que esto, pero es un poco menos de texto sin formato (aunque la barrera para convertir el contenido a texto sin formato es baja).
Geoffrey Wiseman
66
MYSQL_PWD conjunto en el medio ambiente ( export MYSQL_PWD=muhpassword) y ejecutar el comando sin el -p. Ver Variables de entorno del programa MySQL . A pesar de las terribles advertencias del manual , esto es bastante seguro . A menos que comience warez extraño en el mismo caparazón más tarde. Así que nos encontramos:MYSQL_PWD=$(cat foo.php etc) mysql -u foouser -h barhost
David Tonhofer
12

La mysqlutilidad de cliente puede tener una contraseña en la línea de comandos, ya sea con la -po --password=las opciones.

Si usa -p, no debe haber ningún espacio en blanco después de la letra de opción:

$ mysql -pmypassword

Prefiero las opciones largas en los scripts, ya que se auto documentan:

mysql --password=mypassword --user=me --host=etc
Kusalananda
fuente
3
Esto es inseguro porque cualquier usuario puede ver la contraseña, ya sea directamente a /proc/$pid/cmdlinetravés del pscomando. Es cierto que mysql sobrescribe la contraseña en argv durante el inicio, pero siempre hay una ventana de tiempo en la que otro usuario puede observar la contraseña. También, en algunos sistemas el sobreescribiendo argv no podría funcionar.
maxschlepzig
3

Si desea comenzar mysqlcon una contraseña siempre que primero tenga que buscar la contraseña en una variable:

MYSQLPASS=`cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2`

Entonces puede comenzar su mysqlcomando con:

mysql -U root -p ${MYSQLPASS} mydb -h friendserver
Lambert
fuente
1
Esto también pone en peligro la seguridad de su contraseña . Tenga en cuenta que existe la MYSQL_PWDvariable de entorno que se lee mysqlsi no especifica -p. Y en Linux esto es un método seguro, ya que el entorno de un usuario no pueda ser leída por otros usuarios unprivilleged - en contraste con el vector argumento.
maxschlepzig