2015-04-08 8 views
0

Я пытаюсь написать простой скрипт perl, чтобы вытащить полное содержимое таблицы из базы данных MySQL, используя DBI.Получение «Доступ запрещен» с perl dbi при чтении пароля из файла

Я хочу, чтобы в сценарий не вводить пароль базы данных, поэтому я хотел бы установить переменную пароля, которая читается из файла, содержащего пароль.

У меня есть сценарий, настроить так, чтобы три DBI параметры (DSN, user и pass) являются переменными. Когда я явно укажу пароль в скрипте, он работает. Когда я прочитал файл, он терпит неудачу.

Я даже построил небольшой тест, чтобы повторить переменную $pass перед вызовом DBI, и это отлично работает. Он показывает мне правильный пароль.

Я уверен, что я делаю что-то немое. Помогите?

Среда:


~/MySQL $ uname -a

Linux kbwm-radio-web 3.2.0-24-virtual #37-Ubuntu SMP Wed Apr 25 12:51:49 UTC 2012 i686 i686 i686 GNU/Linux 

~/MySQL $ Perl --version

This is perl 5, version 18, subversion 2 (v5.18.2) built for i686-linux-gnu-thread-multi-64int 
(with 41 registered patches, see perl -V for more detail) 

~/MySQL $ MySQL -u phpuser -p cat ./phpuser.auth barret_test -e "status;"

mysql Ver 14.14 Distrib 5.5.41, for debian-linux-gnu (i686) using readline 6.3 

Как вы можете видеть, используя расширение команды в операторе MySQL для пароля функционален.

Сценарий (да, его части безвкусный Это будет исправлено позже.):

#!/usr/bin/perl 

use strict; 
use warnings; 
use DBI; 

my $dsn = "dbi:mysql:barret_test:localhost:3306"; 
my $user = "phpuser"; 
my $pass = qx{cat /home/barret/mysql/phpuser.auth}; 

print "$pass\n"; 


my $dbh = DBI->connect(
    $dsn, 
    $user, 
    $pass, 
    { RaiseError => 1 }, 
) or die $DBI::errstr; 

my $all = $dbh->selectall_arrayref("select name from users;"); 

foreach my $row (@$all) { 
     my ($name) = @$row; 
     print "$name\n"; 
} 

$dbh->disconnect(); 

Запуск возвращается:

~/MySQL $ Perl user_list.pl

*redacted_password* 


DBI connect('barret_test:localhost:3306','phpuser',...) failed: Access denied for user 'phpuser'@'localhost' (using password: YES) at user_list.pl line 14. 

Если изменить линию 9 из

my $pass = qx{cat /home/barret/mysql/phpuser.auth}; 

в

my $pass = "redacted_password"; 

Это происходит:

~/MySQL $ Perl user_list.pl

*redacted_password* 

barret 

richard 

dave 

Я Googled вокруг и искал здесь, ничего не видел, что, казалось, чтобы покрыть мой использование случай. Я попробовал обернуть $pass внутри звонка DBI в одиночных и двойных кавычках, без изменений.

+4

Там, вероятно, символ новой строки после пароля. 'chomp' - переменная для ее удаления. –

ответ

1

Не делайте этого. MySQL предоставляет способ управления учетными данными подключения с использованием того, что они называют option files.Например:

[client] 
host = localhost 
database = mydb 
user = foo 
password = bar 

Убедитесь, что ваш файл не является общедоступным (разрешения 0600 на * nix). Вы можете проверить, что он работает с помощью клиента командной строки:

mysql --defaults-file=/path/to/file 

Чтобы использовать файл опций с DBI, сделайте следующее:

my $db_conf = '/path/to/file'; 
my $dsn = "DBI:mysql:;mysql_read_default_file=$db_conf"; 

my $dbh = DBI->connect($dsn, undef, undef, { RaiseError => 1 }) or 
     die $DBI::errstr; 
+0

Это на самом деле то, что я хотел сделать с паролем, находящимся в отдельном файле. Пришлось немного настроить его (в моей версии mysql это «пользователь», а не «имя пользователя»), но это * ТОЧНО * конечный результат, который я хотел. – barret

+0

Упс, хороший улов. Исправлена. – ThisSuitIsBlackNot

0

Добавление Chomp в сценарий ответил на вопрос, который я задал.

my $pass = qx{cat /home/barret/mysql/phpuser.auth}; 
chomp ($pass); 

Работает как очарование.

Однако ... решение, которое я действительно хотел, это использовать mysql options_file.

my $db_conf = '/home/barret/mysql/phpuser.mysql'; 
my $dsn = "DBI:mysql:;mysql_read_default_file=$db_conf"; 

my $dbh = DBI->connect($dsn, undef, undef, { RaiseError => 1 }) or 
    die $DBI::errstr; 

И в файле опций:

~/mysql$ cat phpuser.mysql 
[client] 
host = localhost 
database = barret_test 
user = phpuser 
password = *redacted_password* 

Результирующее в:

$ perl user_list.pl 
barret 
richard 
dave