Conecte-se ao MySQL através da linha de comando sem precisar de senha root


11

Estou criando um script Bash para algumas tarefas. Uma dessas tarefas é criar um banco de dados MySQL a partir do mesmo script bash. O que estou fazendo agora é criar dois vars: um para o nome de usuário da loja e o outro para a senha da loja. Esta é a parte relevante do meu script:

MYSQL_USER=root
MYSQL_PASS=mypass_goes_here

touch /tmp/$PROY.sql && echo "CREATE DATABASE $DB_NAME;" > /tmp/script.sql
mysql --user=$MYSQL_USER --password="$MYSQL_PASS" < /tmp/script.sql
rm -rf /tmp/script.sql

Mas sempre receba um erro dizendo que o acesso foi negado para o usuário root com NO PASSWORD, o que estou fazendo de errado? Eu preciso fazer o mesmo no PostgreSQL.


Faça alguma depuração (-: tente echo "$MYSQL_PASS"antes de passá-lo para a mysqllinha. Ele tem a senha correta?
KM.

Você pode fazer o login normalmente sem o script?
Qd

4
-h está faltando. Também não é uma boa ideia colocar senhas em uma linha de comando, pois elas serão visíveis para todos que estiverem ligando ps wwaux.
Nils

Respostas:


23

Tanto no MySQL quanto no PostgreSQL, você pode especificar seu usuário e senha no arquivo de configuração local. .my.cnf para MySQL e .pgpass para PostgreSQL. Esses arquivos devem estar no seu diretório pessoal (por exemplo, ~ / .my.cnf).

.my.cnf:

[mysql]
user=user
password=password

.pgpass:

host:port:database:user:password

Você pode ter uma entrada curinga aqui, substituindo qualquer campo por *******.

PS: NUNCA ESPECIFIQUE UMA SENHA NA LINHA DE COMANDO! Isso pode ser perfeitamente visível com o ps se o seu sistema não estiver configurado para não mostrar processos que pertencem a outros usuários.

@ thinice: Se você deseja criar esses arquivos realmente seguros, deve fazer:

umask 077
touch .my.new.config
umask 022 # or whatever was your default

Dessa forma, o arquivo seria criado com permissões seguras desde o início e nenhum interceptador teria a chance de leeching sua senha.

O PostgreSQL se recusará a usar o arquivo com permissões maiores que 0600 de qualquer maneira.


1
Para o mysql, o cliente mysql, você pode apontar para um arquivo de configuração específico --defaults-extra-file=filename. Isso pode ser útil se você deseja colocá-lo em algum lugar fora do padrão ou apenas criar um arquivo temporário. É suspeito que seja uma opção semelhante ao PostgreSQL, mas não estou familiarizado com isso.
precisa

1
E pelo amor dos shorts felizes de 0600
Gilmore

@kworr Vou aready tentar isso, mas o meu MySQL não começar a mudar esse parâmetro em /etc/my.cnf :( não sabia a causa Vou tentar novamente mais tarde.
ReynierPM

Não é o /etc/my.cnf. Atualizando resposta.
kworr

@kworr Eu tento sua solução, mas não funciona. O banco de dados é criado por vazio e não aparece no phpMyAdmin ou em qualquer outra ferramenta da GUI. Defino o diretório de dados em /etc/my.cnf como datadir = / data / var / lib / mysql e defino as permissões como 0755 em / data / var / lib / mysql e também o proprietário como mysql: mysql, por que o banco de dados está vazio ? Onde está o problema?
ReynierPM

2
MYSQL_USER="root"
MYSQL_PASSWORD="PASSWORD"
DBNAME="DB_NAME"

mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "CREATE DATABASE $DBNAME;" 2> /tmp/error1

STATUS=$? 
if [ $STATUS -eq 0 ];
then 
    echo -e "Database '$DBNAME' is created"
elif (grep -i "^ERROR 1007" /tmp/error1 > /dev/null);
then
    echo -e "Database '$DBNAME' already exists"
else
    echo -e "Failed to create database '$DBNAME'"
fi

rm -r /tmp/error1 

Isso fará o truque Obrigado


2
mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password

Como executo uma linha de comando com uma senha segura? use o editor de configuração !!!

No mysql 5.6.6, você pode armazenar a senha em um arquivo de configuração e executar comandos cli como este ....

mysql --login-path=storedPasswordKey ....

--login-path substitui variáveis ​​... host, usuário E senha. excelente né!



1
Obrigado por compartilhar! Há apenas uma dica dessa abordagem. O parâmetro --login-path deve ser o primeiro parâmetro da chamada ou você receberá a mensagem "variável desconhecida 'login-path = local'".
André Augusto

1
MYSQL_USER="root"
MYSQL_PASS="mypass_goes_here"

touch /tmp/$PROY.sql && echo "CREATE DATABASE $DB_NAME;" > /tmp/script.sql
mysql --user=$MYSQL_USER --password=$MYSQL_PASS < /tmp/script.sql
rm -rf /tmp/script.sql

certifique-se de como você escreve seu passe e ele não escapa

--defaults-extra-file = é uma coisa boa (tm) (c)


1

Não coloque aspas na senha, porque se você fizer as aspas, isso será considerado parte da senha.


0

Pergunta semelhante existe no StackOverflow.

Para resumir minha resposta a partir daí.

Você pode export MYSQL_PWD=yourverysecretpassword.

A vantagem desse método em relação ao uso de um arquivo de configuração é que você não precisa de um arquivo de configuração separado para manter a sincronização com seu script. Você só tem o script para manter.

Não há desvantagem nesse método.

A senha não está visível para outros usuários no sistema (seria visível se estiver na linha de comando). As variáveis ​​de ambiente são visíveis apenas para o usuário que executa o comando mysql e root.

A senha também estará visível para qualquer pessoa que possa ler o próprio script, portanto, verifique se o próprio script está protegido. Isso não é diferente de proteger um arquivo de configuração. Você ainda pode originar a senha de um arquivo separado se desejar que o script possa ser lido publicamente ( export MYSQL_PWD=$(cat /root/mysql_password)por exemplo). Ainda é mais fácil exportar uma variável do que criar um arquivo de configuração.

Por exemplo,

$ export MYSQL_PWD=xoF3mafn5Batxasdfuo
$ mysqldump -u root mysql | head
-- MySQL dump 10.13  Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost    Database: mysql
-- ------------------------------------------------------
-- Server version   5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.