Quando tentei executar o seguinte comando no MySQL a partir do Terminal:
mysql -u $user -p$password -e "statement"
A execução funciona conforme o esperado, mas sempre emite um aviso:
Aviso: O uso de uma senha na interface da linha de comandos pode ser inseguro.
No entanto, tenho que conduzir a declaração acima usando uma variável de ambiente ( $password
) que armazena minha senha, porque desejo executar o comando iterativamente no script bash a partir do Terminal e, definitivamente, não gosto da ideia de esperar um prompt aparecer e me forçando a inserir minha senha 50 ou 100 vezes em um único script. Então aqui está a minha pergunta:
É possível suprimir o aviso? O comando funciona corretamente como afirmei, mas a janela fica bastante bagunçada quando faço um loop e executo o comando 50 ou 100 vezes.
Devo obedecer à mensagem de aviso e NÃO escrevo minha senha no meu script? Se for esse o caso, tenho que digitar minha senha toda vez que o prompt me obriga a fazer isso?
Correr man mysql
não ajuda, dizendo apenas
--show-warnings
Faça com que os avisos sejam mostrados após cada instrução, se houver algum. Esta opção se aplica ao modo interativo e em lote.
e não menciona nada sobre como desativar a funcionalidade, se não estiver faltando alguma coisa.
Estou no OS X 10.9.1 Mavericks e uso o MySQL 5.6 do homebrew.
[client]
password=my_password
em~/.my.cnf
). Certamente ele tem algumas implicações de segurança também, mas pelo menos não é acessível a qualquer um que pode executarps
, e você tem controle sobre ele com permissões de arquivo.mysql -u root password root -e "statement" > /dev/null
?pexcept
. Ele pode fazer inserções de terminal e também lidar com o feedback que o comando fornece. Desta forma, você pode simplesmente ignorar que a saída detalhada e tira da saída real que você quer :)Respostas:
Se a sua versão cliente / servidor do MySQL é uma maneira 5.6.xa de evitar que a mensagem WARNING esteja usando as ferramentas mysql_config_editor :
Então você pode usar no seu shell script:
Ao invés de:
fonte
--login-path
tem que vir antes de todos os outros argumentos. Eu estava tentandomysqldump --tables --login-path=local
e recebendo o errounknown variable 'login-path=local'
.Eu uso algo como:
ou
Onde config.cnf contém:
Isso permite que você tenha vários arquivos de configuração - para diferentes servidores / funções / bancos de dados. Usar ~ / .my.cnf permitirá apenas que você tenha um conjunto de configurações (embora possa ser um conjunto útil de padrões).
Se você está em uma distro baseada no Debian e está executando como root, pode pular o acima e usar /etc/mysql/debian.cnf para entrar ...:
mysql --defaults-extra-file=/etc/mysql/debian.cnf
fonte
--defaults-extra-file
deve ser a primeira opção, caso contrário o mysql atenderámysqldump: unknown variable 'defaults-extra-file
.MYSQL_PWD
variável ....mysql --defaults-extra-file=<(printf "[client]\nuser = %s\npassword = %s" "$user" "$pwd") -e "statement"
. Como oprintf
Bash é executado diretamente, ele não apareceps
.--defaults-file
vez de--defaults-extra-file
, porque o último deu preferência às configurações em ~ / .my.cnf.Um método que é conveniente (mas igualmente inseguro) é usar:
Observe que os documentos oficiais recomendam isso.
Veja 6.1.2.1 Diretrizes do Usuário Final para Segurança de Senha (Manual Mysql para Versão 5.6) :
fonte
Access denied for user 'root'@'localhost' (using password: NO)
export MYSQL_PWD=whatever
.export
, basta colocar tudo em uma linha:MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
Se você deseja usar uma senha na linha de comando, descobri que isso funciona para filtrar a mensagem de erro específica:
É basicamente redirecionar o erro padrão para a saída padrão - e usar grep para descartar todas as linhas que correspondem a "Aviso: Usando uma senha".
Dessa forma, você pode ver qualquer outra saída, incluindo erros. Eu uso isso para vários scripts de shell, etc.
fonte
Aqui está como obtive meu script bash para meus backups diários do banco de dados mysqldump para trabalhar com mais segurança. Esta é uma expansão da grande resposta de Cristian Porta.
Primeiro, use mysql_config_editor (fornecido com o mysql 5.6+) para configurar o arquivo de senha criptografada. Suponha que seu nome de usuário seja "db_user". Executando a partir do prompt do shell:
Solicita a senha. Depois de inseri-lo, o usuário / passe é salvo criptografado em seu
home/system_username/.mylogin.cnf
Claro, mude "system_username" para o seu nome de usuário no servidor.
Mude seu script bash para isso:
para isso:
Não há mais senhas expostas.
fonte
A maneira mais fácil é
fonte
2>/dev/null | grep -v "mysql: [Warning] Using a password on the command line interface can be insecure."
para suprimir apenas o aviso em questãoVocê também pode executar o mysql_config_editor no seu script para passar a senha ao especificar o caminho de login
Isso inicia uma sessão de espera que pode ser usada em scripts para interagir com prompts
Veja este post
fonte
ok, solução sem arquivos temporários ou qualquer coisa:
é semelhante ao que os outros mencionaram, mas aqui você não precisa de um arquivo real, esta parte do comando falsifica o arquivo:
<(echo ...)
(observe que não há espaço no meio de<(
fonte
.my.cnf
arquivo em seu~/.
com uma entrada de senhaPara ver o que o mysql_config_editor escreveu no arquivo .mylogin.cnf, use o comando print:
O comando print exibe cada caminho de logon como um conjunto de linhas começando com um cabeçalho de grupo indicando o nome do caminho de logon entre colchetes, seguido pelos valores das opções para o caminho de logon. Os valores da senha são mascarados e não aparecem como texto não criptografado.
Conforme mostrado nos exemplos anteriores, o arquivo .mylogin.cnf pode conter vários caminhos de logon. Dessa maneira, o mysql_config_editor facilita a configuração de várias “personalidades” para conectar-se a diferentes servidores MySQL. Qualquer um desses itens pode ser selecionado posteriormente, usando a opção --login-path quando você invoca um programa cliente. Por exemplo, para conectar-se ao servidor local, use este comando:
Para conectar-se ao servidor remoto, use este comando:
fonte
De https://gist.github.com/nestoru/4f684f206c399894952d
fonte
Outra alternativa é usar o sshpass para chamar o mysql, por exemplo:
fonte
Um script de solução alternativa simples. Nomeie esse "mysql" e coloque-o no seu caminho antes de "/ usr / bin". Variantes óbvias para outros comandos ou se o texto do aviso for diferente.
fonte
Aqui está uma solução para o Docker em um script / bin / sh:
Substitua [MYSQL_CONTAINER_NAME] e verifique se a variável de ambiente MYSQL_ROOT_PASSWORD está definida no seu contêiner.
Espero que ajude você como se pudesse me ajudar!
fonte
docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client] [RETURN HERE] password=pa55" > /root/defaults'
usando a opção--defaults-file
já pega raiz também.Você também pode redirecionar a saída STDERR de erro padrão para / dev / null
Então faça:
mysql -u $user -p$password -e "statement" 2> /dev/null
fonte
Pessoalmente, eu uso o wrapper de script para capturar esse erro. Aqui está um exemplo de código:
fonte
Para o PowerShell (
pwsh
, nãobash
), essa foi uma solução bastante complexa ... Minha primeira tentativa foi encerrar as chamadasmysql
em umatry/catch
função, mas devido a algum comportamento estranho no tratamento de erros do PowerShell , isso não era viável.A solução foi substituir o
$ErrorActionPreference
apenas o tempo suficiente para combinar e capturaSTDERR
eSTDOUT
e analisar para a palavraERROR
e re-lance conforme necessário. O motivo pelo qual não conseguimos capturar e liberar"^mysql.*Warning.*password"
é porque o PowerShell manipula e gera o erro como um fluxo, portanto, você deve capturar tudo para filtrar e lançar novamente. : /Nota: O PowerShell está disponível para Unix, portanto, esta solução é multiplataforma. Pode ser adaptado a
bash
algumas pequenas modificações de sintaxe.Aviso: Existem dezenas de casos extremos nos quais isso não funcionará, como mensagens de erro ou instruções que não sejam do inglês que retornam a palavra para
ERROR
qualquer lugar da saída, mas foi o suficiente para engolir o aviso de uma chamada básicamysql
sem bombardear o script inteiro. Espero que outros achem isso útil.Seria bom se
mysql
simplesmente adicionasse uma opção para suprimir esse aviso.fonte
Se você usa o Rundeck para agendar suas tarefas ou qualquer outra plataforma em que solicita um
mylogin.cnf
arquivo, usei com êxito o seguinte código de shell para fornecer um novo local para o arquivo antes de prosseguir com as chamadas sql:Onde
MYSQL_TEST_LOGIN_FILE
é uma variável de ambiente que pode ser configurada para um caminho de arquivo diferente do padrão.Isso é especialmente útil se você estiver executando um processo bifurcado e não puder mover ou copiar arquivos para o
$HOME
diretório.Veja a documentação aqui.
fonte
a melhor solução é usar o alias:
Por exemplo, coloque isso em seu script:
depois, no seu script, para carregar um banco de dados:
para executar uma instrução:
fonte
Defina o ajudante:
Use-o:
Tachaan! Seu código é limpo e agradável de ler
(testado com bash)
fonte
Outra solução (de um script, por exemplo):
A
-i''
opção está aqui para compatibilidade com o Mac OS X. Os sistemas operacionais UNIX padrão podem usar-i
fonte
O problema que tive foi usar a saída de forma condicional em um script bash.
Isso não é elegante, mas em uma janela de encaixe isso realmente não deve importar. Basicamente, tudo o que isso faz é ignorar a saída que não está na última linha. Você pode fazer o mesmo com o awk e alterar para retornar todos, exceto a primeira linha, etc.
Isso retorna apenas a última linha
Não suprimirá o erro, mas garantirá que você possa usar a saída de uma consulta em um script bash.
fonte
A maneira mais fácil:
Digite isso e você precisará digitar sua senha.
Nota: Sim, sem ponto e vírgula.
fonte
Você pode executar o mySQL e suprimir mensagens de aviso e erro usando / dev / null, por exemplo:
Onde:
desfrutar!
fonte
Funcionou para mim - apenas adicionado
2> null
após o$(mysql_command)
e suprimirá apenas as mensagens de erros e aviso.fonte
2>/dev/null
. Usar2> null
apenas colocaria a saída em um arquivo chamado "null" no diretório atual.