Я пытаюсь написать простой скрипт 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
в одиночных и двойных кавычках, без изменений.
Там, вероятно, символ новой строки после пароля. 'chomp' - переменная для ее удаления. –