Como passar a senha para a linha de comando do mysql

20

Eu tenho a senha do MySQL salva em um arquivo foo.php, por exemplo P455w0rd, quando tento usá-la:

$ 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 as opções ainda solicitam senha. De que maneira correta enviar a senha stdin?

Kokizzu
fonte
3
não deve haver espaço em branco entre -pe sua senha.
Fırat KÜÇÜK
O mysql não lê a senha do stdin, não consegui descobrir do que ele lê.
Omn
A resposta correta é não colocar suas senhas na linha de comando, onde qualquer pessoa com acesso /procpode lê-las trivialmente enquanto o programa estiver em execução . É para isso que ~/.my.cnfserve, devidamente modificado para 0600
Shadur

Respostas:

25

Você precisa ter muito cuidado ao passar senhas para linhas de comando, pois, se não tomar cuidado, acabará deixando-o aberto para farejar usando ferramentas como ps.


A maneira mais segura de fazer isso seria criar um novo arquivo de configuração e passá-lo para mysqla opção de linha de comando --defaults-file=ou --defaults-extra-file=.

A diferença entre os dois é que o último é lido além dos arquivos de configuração padrão, enquanto no primeiro, apenas o arquivo passado como argumento é usado.

Seu arquivo de configuração adicional deve conter algo semelhante a:

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

Certifique-se de proteger esse arquivo.

Então corra:

mysql --defaults-extra-file=<path to the new config file> [all my other options]
garethTheRed
fonte
2
O MySQL irá modificar argvpara sobrescrever os parâmetros dados à -pflag. Pelo menos é o que está concluído aqui, junto com outras informações relevantes: unix.stackexchange.com/questions/78757/…
Kusalananda
Esta é a melhor solução, pois fornece uma medida de segurança. Você precisa chmod go-rwx e verifique se esse argumento precede todos os outros argumentos.
ChuckCottrill
1
@Kusalananda, sim, mas de acordo com os comentários em unix.stackexchange.com/q/385339/135943 , isso não significa que é seguro!
Wildcard
Pode valer a pena adicionar uma observação --login-pathagora que é suportada. Não é muito melhor que isso, mas é um pouco menos de texto sem formatação (embora a barreira para converter o conteúdo em texto sem formatação seja baixa).
Geoffrey Wiseman
6
Defina MYSQL_PWD no ambiente ( export MYSQL_PWD=muhpassword) e execute seu comando sem o -p. Veja Variáveis ​​de Ambiente do Programa MySQL . Apesar dos terríveis avisos do manual , isso é bastante seguro . A menos que você comece warez estranho no mesmo shell mais tarde. Então nós corremos:MYSQL_PWD=$(cat foo.php etc) mysql -u foouser -h barhost
David Tonhofer
12

O mysqlutilitário do cliente pode usar uma senha na linha de comando com as opções -pou --password=.

Se você usar -p, não deve haver nenhum espaço em branco após a letra da opção:

$ mysql -pmypassword

Eu prefiro as opções longas nos scripts, pois são auto-documentadas:

mysql --password=mypassword --user=me --host=etc
Kusalananda
fonte
3
Isso é inseguro porque qualquer usuário pode visualizar a senha - diretamente via /proc/$pid/cmdlineou através do pscomando. É verdade que o mysql sobrescreve a senha em argv durante a inicialização, mas sempre há uma janela de tempo em que outro usuário pode observar a senha. Além disso, em alguns sistemas, a substituição do argv pode não funcionar.
maxschlepzig 14/07
3

Se você deseja iniciar mysqlcom uma senha fornecida, é necessário buscar a senha em uma variável primeiro:

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

Então você pode iniciar seu mysqlcomando com:

mysql -U root -p ${MYSQLPASS} mydb -h friendserver
Lambert
fonte
1
Isso também compromete a segurança da senha . Observe que existe a MYSQL_PWDvariável de ambiente que é lida mysqlse você não especificar -p. E, no Linux, esse é um método seguro, porque o ambiente de um usuário não pode ser lido por outros usuários sem privilégios - em contraste com o vetor de argumento.
maxschlepzig 14/07