Se eu entrar com a senha root na minha caixa, posso simplesmente digitar
mysqldump --all-database e eu receberei o esperado "Dump".
Eu configurei um trabalho no cron.daily para executar e despejar isso em uma unidade de backup. O problema que tenho é que, embora o usuário esteja executando como root, recebo a seguinte mensagem
mysqldump: Erro: 1045: Acesso negado para o usuário 'root' @ 'localhost' (usando a senha: NO)
ao tentar se conectar. Eu não quero codificar a senha raiz do banco de dados mysql no script (quem o faria).
Considerando que eu posso apenas digitar "mysqldump" na linha de comando no meu shell do bash, deve haver alguma maneira de contornar o parâmetro -u. Eu já tenho #! / Bin / bash na parte superior do script.
O que estou faltando aqui para fazer com que isso não solicite a senha root ao banco de dados?
A segurança não deve ser feita através da obscuridade. Se você tem medo de que alguém tenha acesso à sua conta root, não importa se a senha mysql do root está armazenada no script, pois você tem todos os seus dados disponíveis em despejos do mysql ou arquivos de banco de dados. Então, a verdadeira questão é o que você está tentando proteger?
Se você não quiser que outras pessoas obtenham uma senha que permita alterar dados no seu banco de dados, será necessário criar um usuário com as permissões apropriadas .
Se você não deseja que essa senha do mysql seja vista por qualquer conta local, exceto as permissões de arquivo do conjunto raiz nesse script, para 0700 e o proprietário para raiz.
fonte
Seu uso de shell pode fazer isso porque você tem um shell para executá-lo, ou seja, quando você faz logon, todos os seus scripts de shell no seu perfil são executados.
Cron não tem esses luxos. Quando ele faz logon (como root), ele faz logon com um shell padrão. Isso impede que alguém faça logon remotamente, mas também significa que não há scripts de logon automático executados.
Você pode configurar um shell para o cron rodar, editar o crontab e adicionar as variáveis SHELL e HOME, por exemplo.
se estes não estiverem definidos, o cron será executado com o diretório shell e home especificado em / etc / passwd (que provavelmente não são nada, possivelmente / bin / sh).
Se você quiser ver o ambiente em que o cron está sendo executado, adicione um trabalho cron que exporte env para um arquivo, por exemplo:
fonte
Se o script for executado pela raiz, você poderá criar um arquivo /root/.my.cnf com permissões 600 e o seguinte conteúdo:
(onde você digita seu nome de usuário e senha do MySQL, é claro).
Este arquivo será lido automaticamente por qualquer ferramenta de linha de comando do mysql, se for executado como root. Não há mais necessidade de fornecê-lo na linha de comando. As 600 permissões protegem contra olhares indiscretos.
fonte
Cron pode ser muito frustrante para depurar. Quando os trabalhos do cron são executados, eles não têm um ambiente definido como você considera garantido com um shell.
Dicas para cron:
Se o seu usuário root puder fazer isso a partir do shell, o cron poderá fazê-lo. Certifique-se de especificar explicitamente o arquivo de configuração a ser usado na linha de comando.
fonte
Embora várias dessas respostas sejam úteis, várias são confusas, pois o usuário root do unix e o usuário root do mysql não são os mesmos e basicamente não têm nenhum relacionamento além de ambos usarem o nome de login 'root'. Talvez isso seja óbvio, mas parece que algumas respostas conflitam as duas.
O que poderia ser uma opção útil (talvez exista?) Para o mysqld seria permitir que programas clientes como mysql ou mysqldump etc executando como raiz unix acessassem o root @ localhost do mysqld sem uma senha sem ter que armazenar a senha do root @ localhost (mysql) em um arquivo my.cnf ou similar.
Eu sei que isso fica um pouco nervoso, mas o raciocínio é que qualquer um que esteja executando como raiz unix local (para o servidor mysqld) pode ignorar a segurança do mysqld de qualquer maneira, com bastante facilidade. E ter um my.cnf com a senha root mysqld 7x24 ou até criar / excluir um my.cnf com a senha root mysql (de onde vem essa senha?) Em tempo real (por exemplo, para executar um mysqldump) me deixa nervoso.
Isso exigiria alguma infraestrutura e pensamento, porque seria necessário confiar no mysql / mysqldump / etc para transmitir ao mysqld que ele realmente acredita que está sendo executado por uma conta raiz local do unix.
Mas, por exemplo, limitar apenas o soquete unix do mysqld, sem TCP, poderia ajudar, pelo menos como uma opção fortemente recomendada dessa opção. Isso pode estabelecer que o cliente está sendo executado localmente, o que provavelmente não é suficiente. Mas poderia ser o começo de uma ideia. Talvez o envio de um descritor de arquivo por um soquete unix possa ser outra peça (pesquise no Google se isso soa como uma loucura).
PS Não, não vou tentar discutir aqui como isso pode funcionar em um sistema operacional não-unix, embora a ideia provavelmente se traduza em outros sistemas operacionais.
fonte
/root/.my.cnf
com as permissões apropriadas resolve o problema.