2009-12-12 17 views
8

Próbuję połączyć się z serwerem mysql na dreamhostu ze skryptu php znajdującego się na serwerze w slicehost (dwie różne firmy hostingowe). Muszę to zrobić, abym mógł przesłać nowe dane w slicehost do Dreamhosta. Używanie zrzutu nie jest opcją, ponieważ struktury tabel są różne i muszę tylko przesłać niewielki podzbiór danych (100-200 dziennych rekordów). Problem polega na tym, że używam nowej metody haszyszowania MySQL przy slicehost, i Dreamhost używa starego, więc ja dostaćMetoda hashowania hashla starego i nowego

$link = mysql_connect($mysqlHost, $mysqlUser, $mysqlPass, FALSE); 

Warning: mysql_connect() [function.mysql-connect]: OK packet 6 bytes shorter than expected 
Warning: mysql_connect() [function.mysql-connect]: mysqlnd cannot connect to MySQL 4.1+ using old authentication 
Warning: mysql_query() [function.mysql-query]: Access denied for user 'nodari'@'localhost' (using password: NO) 

fakty:

  • muszę kontynuować za pomocą nowej metody w Slicehost i nie mogę używać starszej wersji PHP/bibliotekę
  • The baza danych jest zbyt duża, aby przesłać ją codziennie ze zrzutem
  • Nawet gdybym to zrobił, stoły mają różne struktury
  • muszę skopiować tylko niewielki podzbiór tego, w codziennie (tylko zmiany w ciągu dnia, 100-200 Records)
  • Od tabelach są tak różne, trzeba użyć php jako pomost do normalizacji danych
  • już google go
  • już rozmawiałem z obu stafs wsparcia

Im bardziej oczywista opcja dla mnie byłoby, aby rozpocząć korzystanie z nowego MySQL Password Hashing method na dreamhost, ale nie zmienią tego i nie jestem roo t, więc nie mogę tego zrobić sam.

Jakiś szalony pomysł?

Przez VolkerK sugestion:

mysql> SET SESSION old_passwords=0; 
Query OK, 0 rows affected (0.01 sec) 

mysql> SELECT @@global.old_passwords,@@session.old_passwords, Length(PASSWORD('abc')); 
+------------------------+-------------------------+-------------------------+ 
| @@global.old_passwords | @@session.old_passwords | Length(PASSWORD('abc')) | 
+------------------------+-------------------------+-------------------------+ 
|      1 |      0 |      41 | 
+------------------------+-------------------------+-------------------------+ 
1 row in set (0.00 sec) 

Oczywistą rzeczą teraz będzie prowadzony do mysql> SET GLOBAL old_passwords = 0; ale muszę SUPER przywilej, aby to zrobić, a oni wont mi go dać

gdybym uruchomić kwerendę

SET PASSWORD FOR 'nodari'@'HOSTNAME' = PASSWORD('new password'); 

pojawia się błąd

ERROR 1044 (42000): Access denied for user 'nodari'@'67.205.0.0/255.255.192.0' to database 'mysql' 

Nie jestem korzeń ..

Facet ze wsparcia dla dreamhostów twierdzi, że problem leży po mojej stronie. Ale powiedział, że uruchomi każde zapytanie, które mu powiem, ponieważ jest to prywatny serwer. Muszę powiedzieć temu facetowi, DOKŁADNIE, o co chodzi. Więc, powiedz mu, aby uruchomić

SET SESSION old_passwords=0; 
SET GLOBAL old_passwords=0; 
SET PASSWORD FOR 'nodari'@'HOSTNAME' = PASSWORD('new password'); 
grant all privileges on *.* to [email protected] identified by 'new password'; 
byłby dobry początek?

+1

'SET old_passwords session = 0' powinno wystarczyć, nie ma potrzeby, aby zmienić ustawienie globalne to rozwiązanie jednorazowe (w przeciwnym razie mogą one po prostu ponownie uruchomić mysqld bez tej opcji). Przetestowałem to na moim lokalnym serwerze 5.1.37. Aby potwierdzić, że nowy hash jest naprawdę "nowy", niech pomocnik uruchomi zapytanie 'SELECT \' Host \ ', Length (\' PASSWORD \ ') FROM mysql.user WHERE \' User \ '= 'nodari''. Pamiętaj: 41 jest dobre, 16 jest stare = złe ;-) – VolkerK

+0

Aha, i spróbowałbym tego bez pierwszej pomocy. Nie powinno być konieczne dla istniejącego konta. Prawdopodobnie to też nie boli, ale wprowadza nowe pytanie: "Czy" identyfikowane przez "przestrzegaj dokładnie tych samych reguł co PASSWORD()?" Najprawdopodobniej, ale nigdy się nie dowiesz ;-) – VolkerK

+0

to nie jest jednorazowa sprawa, będę musiał to robić codziennie w czasie ... I przypuszczam, że przy następnym restarcie to stare hasło powróci do ugryź mnie w tyłek –

Odpowiedz

2

Tak, to wygląda na twardziela. Bez współpracy z hostami lub możliwości zmiany formatów haseł lub bibliotek klienckich, nie masz wielu opcji.

Szczerze mówiąc, moim pierwszym wyborem byłoby wyrzucić Dreamhosta. To prawdopodobnie dużo pracy, ale jeśli utkną przy użyciu starych niekompatybilnych rzeczy, będzie to nadal problematyczne.

Jeśli to nie jest opcja, co ze wspólnym zautomatyzowanym procesem? Możesz wyeksportować dane ze strony Slicehost do pliku CSV i pomasować go w dowolnym formacie niezbędnym do Dreamhost, a następnie przesłać go na serwer Dreamhost. Możesz mieć skrypt crona na serwerze Dreamhost, który okresowo sprawdza przesyłany plik i przetwarza go (upewniając się, czy go przenieść lub usunąć po pomyślnym przetworzeniu).

+0

cóż, teraz piszę skrypt, aby wygenerować zapytanie przy slicehost do wykonania w dreamhost. używam curl jako mojej metody transferu. To okropny hack, ale przynajmniej mogę zadzwonić do skryptu aktualizacji przez przeglądarkę lub crona ... –

2

Rozwiązałbym to przez wyrzucenie danych w Slicehost, używając SELECT ... INTO OUTFILE.

Pozwala to zaprojektować zapytanie, aby upewnić się, że dane wyjściowe mają format zgodny ze strukturą tabeli w witrynie docelowej.

Następnie prześlij plik zrzutu do Dreamhost i użyj LOAD DATA INFILE.

Na marginesie, Dreamhost jest naprawdę nadal przy użyciu MySQL 4.0? Są bardzo nieaktualne - nawet rozszerzona obsługa MySQL 4.1 jest expiring this month (grudzień 2009).

+0

fajne jest to, że używają wersji 5.0. Nie rozumiem, dlaczego nadal używają starej metody hashingowej. –

+0

Okay, to prawdopodobnie dlatego, że zmiana hasła prawdopodobnie zakłóciłaby setki (lub tysiące) aplikacji klientów działających na tym hoście. Często host sieciowy pozostawia taki serwer, jaki jest, i włącza nowe funkcje tylko na oddzielnym serwerze. Z biegiem czasu ich klienci stopniowo przechodzą na nowszy serwer, a na końcu tracą stary. Możesz poprosić swojego dostawcę o przeniesienie hostowanego konta na jeden z tych nowszych serwerów. –

+0

to prywatny serwer ... czy nie byłby to instancja mysql bez więcej użytkowników niż ja? –

1

Myślę, że powinieneś zrobić WebServices/RPC z slicehost i napisać odpowiednią usługę w celu jej obsługi.

7

W niektórych sytuacjach nadal możesz ustawić i użyć "nowego hasła algorytmu mieszania".
Serwery MySQL 4.1+ są w stanie obsłużyć oba algorytmy logowania. Który z nich jest używany jest niezależny od zmiennej starego hasła. Jeśli MySQL znajdzie skrót o długości 41 znaków, zaczynając od *, używa nowego systemu. Funkcja PASSWORD() jest również w stanie korzystać z obu algorytmów. Jeśli pole mysql.user.Password jest wystarczająco szerokie, aby pomieścić 41 znaków, a zmienna starszego hasła wynosi 0, utworzy "nowe" hasło. Urządzenie documention for old_passwords mówi Variable Scope Both, więc możesz go zmienić na swoją sesję.
Połącz się z serwerem MySQL (z klientem, który może to zrobić pomimo globalnej old_passwords = 1), np. HeidiSQL i spróbuj wykonać następujące czynności:

SET SESSION old_passwords=0; 
SELECT @@global.old_passwords,@@session.old_passwords, Length(PASSWORD('abc')); 

Jeśli drukuje 1, 0, 41 (czyli globalne old_passwords jest włączony, ale na sesję to wyłączyć i hasło() wrócił do „nowego” hasło) powinny być w stanie set a new password pomocą nowy algorytm dla twojego konta w tej samej sesji.

Ale jeśli Dreamhost naprawdę chce się wyłączyć nowy algorytm haseł pole mysql.user.Password będzie mniej niż 41 znaków i nie ma nic można zrobić (oprócz ich dokuczliwy).

+0

'mysql> SET SESSION old_passwords = 0; Zapytanie OK, dotyczy 0 wierszy (0,01 s) mysql> SELECT @@ global.old_passwords, @@ session.old_passwords, Length (PASSWORD ('abc')); + ------------------------ + ----------------------- - + ------------------------- + | @@ global.old_passwords | @@ session.old_passwords | Długość (PASSWORD ("abc")) | + ------------------------ + ----------------------- - + ------------------------- + | 1 | 0 | 41 | + ------------------------ + ----------------------- - + ------------------------- + 1 wiersz w zestawie (0,00 s) –

+0

Zaktualizowałem pytanie, pole komentarza nie pozwoli mi napisz kod –

3

Po prostu miałem ten problem i udało mi się go obejść.

Najpierw połącz się z bazą danych MySQL ze starszym klientem, który nie ma nic przeciwko starym_passwords. Połącz się z użytkownikiem, którego skrypt będzie używał.

uruchomić te pytania:

SET SESSION old_passwords=FALSE; 
SET PASSWORD = PASSWORD('[your password]'); 

w skrypcie PHP, zmienić funkcję mysql_connect zawierać flagę klienta 1:

define('CLIENT_LONG_PASSWORD', 1); 
mysql_connect('[your server]', '[your username]', '[your password]', false, CLIENT_LONG_PASSWORD); 

To pozwoliło mi połączyć się pomyślnie.

+0

tak, wiem, że możesz to zrobić w ten sposób, ale pomysł ma aktualnego klienta w slicehost. Ponadto nie mogę zmienić niczego w Dreamhost. I używają starej metody hasła, ponieważ wszystkie hasła wszystkich serwerów są przechowywane gdzie indziej, używają starej metody i mogą to zmienić już teraz ... Ten szczególny przypadek nie ma dobrego rozwiązania. Skończyłem na tworzeniu skryptów na obu końcach, które komunikują się za pomocą CURL ... –

+0

Nie wiem o Slicehost. Używam także Dreamhosta, jak się okazuje. old_passwords jest dość denerwujące. – TehShrike

0

Miałem ten sam problem. Aby go rozwiązać, zrobiłem co następuje:

SET PASSWORD = PASSWORD('[your password]'); 
+0

Gdzie wybierasz użytkownika? – Volatil3