Depois de entender o problema de usar uma senha na linha de comando , preciso encontrar uma maneira de alimentar um programa com uma senha sem que isso seja um problema (sem que a senha seja registrada em algum lugar).
Eu tenho um script bash que instala automaticamente um servidor LAMP inteiro a partir da fonte: Apache, FastCGI, PHP e MySQL. Essas instalações requerem uma senha, especialmente MySQL.
Como posso tornar o script totalmente automatizado sem revelar a senha?
Edit (9 de junho, 3:55 UTC):
Estou invocando o mysql com uma senha na linha de comando, via root:
root@dor-desktop:/home/dor# PASS=`cat /home/dor/tmpf/pass`
root@dor-desktop:/home/dor# mysql -u root -p"$PASS"
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
(PASS = "p4ssw0rd" no nosso caso)
E executo ps aux | grep mysql
via meu usuário comum (dor), que não me mostra a senha !
(Parte da) ps
saída é:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3562 0.0 0.0 34156 2864 pts/0 S+ 05:53 0:00 mysql -u root -px xxxxxx
Como isso é possível?
Respostas:
Em relação à sua atualização:
Quando um processo é iniciado, ele possui uma área dedicada da memória, na qual os argumentos são armazenados e um int que informa quantos argumentos foram passados.
O MySQL verifica se a senha foi passada na linha de comando
-p
e se foi copiada para uma nova variável que não é visível, em seguida, sobrescreva a região da memória comx
'es.Em termos simples, por exemplo:
Você pode encontrá-lo, por exemplo, no
client/mysqladmin.cc
código-fonte:Quando
ps
executado, ele lê a região de memória dos argumentos (argv[N]
) e, portanto, éxxxx
.Por um tempo muito curto, a senha fica visível, mas apenas por alguns ciclos de CPU.
Você pode atualizar a senha do MySQL usando a
--init-file
opção e procedimento especiais . C.5.4.1.2 Redefinindo a senha raiz: sistemas UnixEditar:
Como @Gilles dizer, você pode
echo
,printf
ou o usohere
de documentos a partir de um script.Você também pode adicioná-lo ao
.my.cnf
seu diretório pessoal ou em um arquivo ( temporário ) e usar a--defaults-extra-file
opção (Acredite que você deve adicionar essa opção logo no início da linha de comando.) Opcionalmente, inclua também user. Observe também o extra no nome da opção, a menos que você queira usar apenas esse arquivo como configuração:Opcionalmente, o
[client]
agrupamento fazmysqld
pular a configuração.Também é possível usar
MYSQL_PWD
variável de ambiente, mas isso nunca deve ser usado, pois você pode listar o ambiente, em muitasps
implementaçõesps -e
, no/proc/<PID>/environ
arquivo no Linux etc.Mais sobre o tópico aqui .
Você também pode querer dar uma olhada no MySQL Configuration Utility, que permite armazenar a senha em um arquivo criptografado em seu diretório pessoal -
.mylogin.cnf
.fonte
mysql-init
arquivo com a senha armazenada em uma variável bash? (sem ser revelada)echo 'password=p4ssw0rd' >>mysql.cnf
é seguro, porqueecho
é embutido, portanto a senha não aparece na linha de comando de nenhum processo. Um documento aqui também é seguro.A solução típica é ler a senha de um arquivo ou da entrada padrão (ou de outro descritor de arquivo que precisaria ser passado como parâmetro).
fonte
Alguns programas (linha de comando,
ftp
por exemplo) leem senhas/dev/tty
, o arquivo especial por processo que representa o TTY de controle do processo. Isso permite que o programa não faça eco da senha de volta à tela e tenha um pouco mais de garantia sobre a origem da senha.fonte