Como adicionar uma senha a um script BASH

3

Eu quero criar um script para executar o seguinte comando BASH:

mysqldump -u [username] -p [db_name] > [path to backup file]

O que resulta em um arquivo de backup. Ao executar isso no BASH, ele solicita uma senha antes de continuar.

Como posso criar isso em um script BASH para que a senha seja inserida automaticamente?

Isso pode ser feito com segurança?

    
por Roy Hinkley 03.08.2015 / 23:11

5 respostas

13

O melhor tipo de abordagem aqui é fazer algo como:

mysqldump --defaults-extra-file=/path/to/auth.cnf ...

Onde auth.cnf se parece com:

[client]
user=the-user
password=the-password

Em seguida, verifique se o arquivo é legível apenas por quem quer que seja destinado a executar esse script. O script em si pode ser legível pelo mundo.

    
por 03.08.2015 / 23:16
3

Deixar uma senha de texto simples em qualquer arquivo é sempre uma má idéia, caso seu sistema esteja comprometido. Às vezes é inevitável. Para tornar isso "seguro", você deve limitar essa atividade a um usuário muito limitado e também deixar essas opções confidenciais em um arquivo padrão.

Para resolver seu problema especificamente, na página mysql man:

If you use the short option form (-p), you cannot have a space 
between the option and the password. If you omit the password 
value following the --password or -p option on the command line, 
mysql prompts for one.

para corrigir isso, você precisa executar:

mysqldump -u [username] -p[password] [db_name] > [path to backup file]

ou

mysqldump -u [username] -password=[password] [db_name] > [path to backup file]
    
por 03.08.2015 / 23:19
0

Se as opções forem as mesmas que eu me lembro, você deve ser capaz de fazer o seguinte:

mysqldump -opt [db_name] -u [nome do usuário] -p [senha] > [caminho para o arquivo de backup]

Não coloque um espaço entre o -p e a senha real.

    
por 03.08.2015 / 23:17
0

Esta é apenas uma resposta suplementar para os outros. Eu adicionaria isso como um comentário se eu fosse permitido.

Também não é uma prática muito boa, porque coloca a senha em texto simples que você nunca deve fazer se puder evitá-la. Um arquivo de configuração mysql é pelo menos mais facilmente protegido que um script.

A resposta que estou evitando é: esperar scripts. Usando o script Expect, o seu script bash é executado dentro do Expect, que espera pela entrada (Expected) correspondente à sua regra e, em seguida, responde com a saída (desejada).

É realmente apenas Esperando 'password:' e respondendo com "myplaintextpassword \ r". Ele foi projetado para permitir que scripts em um servidor executem sessões ssh interativas em um servidor diferente.

Aqui está uma pergunta que cobre o tópico: Esperar Scripting .

O Expect é facilmente instalado em qualquer distribuição Linux.

    
por 04.08.2015 / 03:36
0

A resposta de Stephane é a melhor maneira de fazer isso no caso do mysql. E na maioria dos casos, usar o modo "próprio" do programa é o melhor.

No entanto, para responder à parte do Bash da sua pergunta:

mysqldump -u joe -p <<<"joe's pasword" > /path/to/backup/file

ou (menos inseguro)

mysqldump -u joe -p </path/to/file/with/joes/password > /path/to/backup/file

Essa abordagem simplesmente passará a string para o processo mysqldump. Ele funcionará, desde que:

  • a senha é a única coisa que pergunta,

    ie. não há outro prompt (a maioria dos comandos é bastante previsível);

  • aceitará a senha do STDIN, mesmo que não seja interativa,

    ie. o programa pode deliberadamente verificar se o arquivo na entrada é um  terminal interativo e abortar.

por 04.08.2015 / 03:13