Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP i SSH2 Extension
Forum PHP.pl > Forum > PHP
patlysy
Witam,

Pracuję na systemie Windows 7 z zainstalowaną paczką XAMPP. Próbuję załadować dodatkowy moduł SSH2. W tym celu ściągnąłem bibliotekę php_ssh2.dll i umieściłem w katalogu php/ext. W pliku konfiguracyjnym php.ini dodałem wpis extension=php_ssh2.dll. Niestety po restarcie serwera moduł nie jest ładowany. Ręcznie przez PECL też próbowałem zainstalować. Czy ktoś spotkał się kiedyś z takim problemem? Jest sporo tutoriali w necie jak to naprawić ale pod linuksa. Ja na obecną chwilę pracuje na Windowsie.

Inna sprawa, nie mogąc zainstalować modułu php_ssh2.dll postanowiłem korzystać z gotowych rozwiązań typu SSH in PHP albo PHPseclib. Dodam jeszcze, że modułu SSH potrzebuję do łączenia się z routerem CISCO. I niby wszystko wygląda dobrze. Nawiązuje połączenie ale żaden skrypt nie odpowiada na próbę czytania czy zapisania danych. Czy router CISCO ma jakiś specyficzny rodzaj komunikacji? Tym samym skryptem łączyłem się z moim serwer z postawionym Linuksem. Połączenie działa doskonale, Mogę wydawać komendy i otrzymywać odpowiedź. Czemu skrypt komunikując się z routerem nie może zbudować sobie kanału komunikacyjnego? Na tą chwile działa mi jedynie komunikacja Telnet a ona jednak nie jest zbyt bezpieczna sad.gif

Proszę o odpowiedź.
Pozdrawiam
wookieb
Wejdź do konsoli
Wpisz
Kod
php -v

I powiedz co Ci wypluje. Podaj także adres z którego pobierałeś php_ssh2.dll
patlysy
Hmm. Co do php_ssh2.dll to powiem szczerze, że linku nie pamiętam. Ale z tego co pamiętam pobrany z jakiegoś prywatnego źródła od użytkowników wypowiadających się na php.net.

Wydając polecenie php-v widzę, że są jakieś błedy:

Cytat
PHP Warning: PHP Startup: ssh2: Unable to initialize module
Module compiled with module API=20060613
PHP compiled with module API=20090623
These options need to match
in Unknow on line 0

Warning: PHP Startup: ssh2: Unable to initialize module
Module compiled with module API=20060613
PHP compiled with module API=20090623
These options need to match
in Unknow on line 0


Czy to jest błąd związany z php_ssh2.dll? Czy znacie jakieś zaufane źródło gdzie można ową bibliotekę pobrać?
wookieb
Wyłącz narazie ten moduł i uruchom php -v jeszcze raz.
patlysy
Wyłączyłem i dostałem odpowiedź o następującej treści:

Cytat
PHP 5.3.0 (cli) (built: Jul 2 2009 21:08:11)
Copyright © 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright © 1998-2009 Zend Technologies


Co teraz powinienem zrobić?
wookieb
Kurcze głupi jestem :/ Przepraszam.
Utwórz plik
i uruchom go w przeglądarce.
Potrzebne dla nas informacje to PHP Extension Build
patlysy
Phpinfo() zwraca następujące (podstawowe) dane:

Cytat
PHP Version 5.3.0

System Windows NT LYSY-PC 6.1 build 7600 ((null)) i586
Build Date Jul 2 2009 21:02:53
Compiler MSVC6 (Visual C++ 6.0)
Architecture x86
Configure Command cscript /nologo configure.js
Server API Apache 2.0 Handler
Virtual Directory Support enabled
Configuration File (php.ini) Path no value
Loaded Configuration File D:\serwerPHP\xampp\php\php.ini
Scan this dir for additional .ini files (none)
Additional .ini files parsed (none)
PHP API 20090626
PHP Extension 20090626
Zend Extension 220090626
Zend Extension Build API220090626,TS,VC6
PHP Extension Build API20090626,TS,VC6
Debug Build no
Thread Safety enabled
Zend Memory Manager enabled
Zend Multibyte Support disabled
IPv6 Support enabled
Registered PHP Streams https, ftps, php, file, glob, data, http, ftp, compress.zlib, compress.bzip2, phar, zip
Registered Stream Socket Transports tcp, udp, ssl, sslv3, sslv2, tls
Registered Stream Filters convert.iconv.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk, zlib.*, bzip2.*

wookieb
Super smile.gif
Masz zainstalowanego php VC6 Thread-safe.
Nie znalazłem rozszerzenia pod tą wersję.
Na tej stronie http://downloads.php.net/pierre/ jest php_shh2 pod wersję vc9 ( http://downloads.php.net/pierre/php_ssh2-s...5.3-vc9-x86.zip ) .Gdybyś uaktualnił u siebie php pod tą wersję byłoby ok smile.gif
http://windows.php.net/download/ -> VC9 x86 Thread Safe (2010-Jul-21 20:29:51)
patlysy
Super :-)

Dziękuję bardzo :-) obecnie jadę do pracy a tego posta pisze z komórki. Wieczorem przetestuje i odpowiem jak wygląda stuacja :-) a czy znasz może odpowiedź odnośnie routera? Jaka może być tego przyczyna że za pomocą skryptu klienta ssh możliwe jest jedynie zalogowanie się na urządzenie? I router skonfigurowany jest poprawnie. Bez problemu łącze się z nim przez putty.

Pozdrawiam i dziękuję
wookieb
Nie wiem co to dokładnie za urządzenia ani też nie mam jego dokumentacji. Producent w swoim dziale pomocy powinien zawrzeć taką informację.
patlysy
Wczoraj oczywiście nie miałem już za wiele czasu by cokolwiek wieczorem zrobić. Przyznam się jednak szczerze (ze wstydem), że do tej pory korzystałem z gotowych rozwiązań typu XAMPP bądź też EasyPHP. Pierwszy raz instaluje osobno Apacha i PHP. Będę musiał jeszcze dzisiaj poszukać jak skonfigurować apacha by ładował moduł PHP. Tak czy inaczej po zainstalowaniu PHP napotkałem kolejny problem. W extension nie ma biblioteki od SNMP, którą w dużym stopniu muszę wykorzystać w projekcie. Czy masz może źródło gdzie mogę pobrać ową DLL-kę dla V9?

Pozdrawiam
wookieb
W paczkach zip (dla wersji 5.3.2 oraz 5.3.3) jest rozszerzenie snmp. Nie wiem jak w reszcie form "instalacyjnych".
patlysy
No hej,

Zainstalowałem już Apacha i PHP 5.3.3. Serwer działa poprawnie. Do katalogu ext dodałem dwie biblioteki .dll - php_ssh2.dll oraz php_snmp.dll. Zmian dokonałem także w pliku php.ini. Moduł ssh załadowało poprawnie. Sprawdziłem w kodzie i rozpoznaje funkcje typu ss2_connect(). Problem tym razem dotyczy omawianej już wcześniej biblioteki dla SNMP. Wziąłem ją z wersji binarnej php-5.3.3-Win32-VC9-x86. PHP wraz z serwer mam na dysku D (D:\php). W katalogu D:\usr umieściłem miby z pakietu net-snmp. Wyczytałem, że właśnie tam powinny się znajdować. Jednak po wydaniu polecenia z wiersza poleceń php-v zwraca mi następujące błędy:

Cytat
Cannot find modue (IP-MIB): At line 0 in (none)
Cannot find modue (IF-MIB): At line 0 in (none)
Cannot find modue (TCP-MIB): At line 0 in (none)
Cannot find modue (UDP-MIB): At line 0 in (none)
Cannot find modue (SNMPv2-MIB): At line 0 in (none)
Cannot find modue (SNMPv2-SMI): At line 0 in (none)
Cannot find modue (UCD-SNMP-MIB): At line 0 in (none)
Cannot find modue (UCD-DEMO-MIB): At line 0 in (none)
Cannot find modue (SNMP-VIEW-BASED-ACM-MIB): At line 0 in (none)
Cannot find modue (SNMP-COMMUNITY-MIB): At line 0 in (none)
Cannot find modue (UCD-DLMOD-MIB): At line 0 in (none)
Cannot find modue (SNMP-FRAMEWORK-MIB): At line 0 in (none)
Cannot find modue (SNMP-MPD-MIB): At line 0 in (none)
Cannot find modue (SNMP-USER-BASED-SM-MIB): At line 0 in (none)
Cannot find modue (SNMP-NOTIFICATION-MIB): At line 0 in (none)
Cannot find modue (SNMP-TARGET-MIB): At line 0 in (none)
Cannot find modue (SNMPv2-TM): At line 0 in (none)


Wookieb czy i tym razem pomógłbyś mi rozwiązać ten problem?

Pozdrawiam

P.S. Zaraz przetestuje czy wykorzystując bibliotekę ssh2.dll uda mi się nawiązać połączenie z routerem.

Przetestowałem moduł ssh na podstawie następującego skryptu:

  1. if(!($con = ssh2_connect("192.168.2.1", 22))){
  2. echo "fail: unable to establish connection\n";
  3. } else {
  4. // try to authenticate with username root, password secretpassword
  5. if(!ssh2_auth_password($con, "user", "password")) {
  6. echo "fail: unable to authenticate\n";
  7. } else {
  8. // allright, we're in!
  9. echo "okay: logged in...\n";
  10.  
  11. // execute a command
  12. if (!($stream = ssh2_exec($con, "sh version\n" ))) {
  13. echo "fail: unable to execute command\n";
  14. } else {
  15. // collect returning data from command
  16. stream_set_blocking($stream, true);
  17. $data = "";
  18. while ($buf = fread($stream,4096)) {
  19. $data .= $buf;
  20. }
  21. fclose($stream);
  22. }
  23. }
  24. }


Niestety komunikacja z routerem dalej nie działa. Wnioskuje, że może być to problem z końcem linii. Przeglądarka czeka na odpowiedź ale jej nie uzyskuje gdyż router nie może zatwierdzić polecenia. I tak się zawiesza cała aplikacja. Próbowałem różnych kombinacji - \n, \n\r, \r\n. Niestety żaden znacznik nie jest odpowiedni (chyba, że problem tkwi w czymś innym). Znacie może jeszcze jakieś możliwości jak SSH może oznaczać koniec linii?
wookieb
Teraz to nie wiem czy już pracujesz na xammpie czy na samym apache-u smile.gif
Moja instalacja jest najczystszą z możliwych. Rozpakowany zip, troche ustawień i koniec. Nie wiem skąd i gdzie kopiowałeś swoje dll-e bo powinno być w jednym miejscu.
Sprawdziłem jak mi pójdzie instalacja.
Rozpoczęła się odblokowaniem rozszerzenia php_snmp.dll z php.ini i... w phpinfo jest pokazane, że jest zainstalowane. Tylko tyle.
Szczerze mówiąc nie wiem jak wygląda teraz twoja instalacja serwera ale jeżeli mógłbym doradzić to nigdy nie instaluj xammp-a ani innych.
Bazuj na czystej instalacji ponieważ o wiele łatwiej z aktualizacjami. Tutoriale jak zainstalować apache, php, mysql są dostępne w internecie.
patlysy
Ok ok. Będę próbował. Co do Xamppa, nie korzystam już z niego. Teraz mam zainstalowany czysty serwer Apacha z PHP. Jutro będę kombinował. A z tym ssh nie masz pomysłów?
wookieb
A do jakiego momentu dochodzi skrypt? Z tego co się spotykałem znaków nowej linii nie wysyła się poprzez tą funkcję.
patlysy
Funkcja nawiązuje połączenie. Dostaję komunikat, że zostałem zalogowany i do tej pory jest wszystko ok. W momencie kiedy wywołuję metodę ssh2_exec przeglądarka zapętla się i nie zwraca odpowiedzi. Wczoraj przeprowadzałem też testy skryptem napisanym w JAVIE. Z pod konsoli odpaliłem mały programik, który również nawiązał połączenie ale niestety odpowiedzi nie otrzymał.

Co ciekawe próbowałem także ze znakami hex typu 0x0A (line feed) bądź też 0x0D (Carriage return) i to było dziwne. Skrypt po zastosowaniu takich poleceń końca linii zakończył się jednak odpowiedzi też nie zwrócił.

Dodam jeszcze, że SSH na routerze na pewno dobrze jest skonfigurowane. Łącze się bez problemu przez putty. Dziwna dolegliwość. Chciałbym znaleźć rozwiązanie. Buduję aplikację samo zabezpieczającą sieć jako pracę dyplomową. Jeśli zostanę przy telnecie to aplikacja sama w sobie nie będzie bezpieczne :/

Pozdro
wookieb
Faktycznie mi też wywala błąd SNMP ale tylko z linii komend. Myślałem, że wywali go też wcześniej przy odpalaniu phpinfo - niestety nie. Jak wrócę z pracy popróbuję coś z tym pokombinować.

Co do SSH2 to szczerze mówiąc nie mam z tym modułem żadnego doświadczenia ale podejrzewam, jedną rzecz, że kiedy pierwszy raz łączyłeś się przez putty do routera, nie prosiło czasem o zaakceptowania klucza? Może coś takiego powoduje problem.

Router posiada może listę wydanych poleceń. Za pomocą polecenia "history" możesz podejrzeć jakie komendy wysłał twój skrypt do routera.
Jeżeli nic nie pomoże załóż oddzielny temat dotyczący tego problemu.
patlysy
Witam ponownie,

Głowiłem się nad Twoim pomysłem z kluczem jednak sprawdziłem ewentualne problemy z tym związane i to też nie to. Na routerze (bądź też firewallu sprzętowym) włączyłem debugowanie komend. Sprawdziłem jak wygląda próba połączenia przez putty a jak przez skrypt php. I tu widać, że serwer z kompem wymieniają się kluczami i ustanawiają połączenie. Poniżej przedstawiam logi:

Odpowiedź routera dla połączenia PUTTY:
Cytat
Device ssh opened successfully.
SSH2: SSH client: IP = '192.168.1.2' interface # = 1
SSH: host key initialised
SSH2: starting SSH control process
SSH2: Exchanging versions - SSH-1.99-Cisco-1.25

SSH2: send SSH message: outdata is NULL

server version string:SSH-1.99-Cisco-1.25SSH2: receive SSH message: 83 (83)
SSH2: client version is - SSH-2.0-PuTTY_Release_0.60

client version string:SSH-2.0-PuTTY_Release_0.60SSH2: begin server key generation
SSH2: complete server key generation, elapsed time = 1600 ms

SSH2 2: SSH2_MSG_KEXINIT sent
SSH2 2: SSH2_MSG_KEXINIT received
SSH2: kex: client->server aes256-cbc hmac-sha1 none
SSH2: kex: server->client aes256-cbc hmac-sha1 none
SSH2 2: expecting SSH2_MSG_KEXDH_INIT
SSH2 2: SSH2_MSG_KEXDH_INIT received
SSH2 2: signature length 143
SSH2: kex_derive_keys complete
SSH2 2: newkeys: mode 1
SSH2 2: SSH2_MSG_NEWKEYS sent
SSH2 2: waiting for SSH2_MSG_NEWKEYS
SSH2 2: newkeys: mode 0
SSH2 2: SSH2_MSG_NEWKEYS receivedSSH(pix): user authen method is 'no AAA', aaa server group ID = 0
SSH(pix): user authen method is 'no AAA', aaa server group ID = 0

SSH2 2: authentication successful for pix
SSH2 2: channel open request
SSH2 2: pty-req request
SSH2 2: requested tty: xterm, height 24, width 80

SSH2 2: shell request
SSH2 2: shell message received


Odpowiedź routera dla skryptu PHP:
Cytat
Device ssh opened successfully.
SSH3: SSH client: IP = '192.168.1.2' interface # = 1
SSH: host key initialised
SSH3: starting SSH control process
SSH3: Exchanging versions - SSH-1.99-Cisco-1.25

SSH3: send SSH message: outdata is NULL

server version string:SSH-1.99-Cisco-1.25SSH3: receive SSH message: 83 (83)
SSH3: client version is - SSH-2.0-libssh2_1.1 PHP

client version string:SSH-2.0-libssh2_1.1 PHPSSH3: begin server key generation

SSH3: complete server key generation, elapsed time = 2640 ms

SSH2 3: SSH2_MSG_KEXINIT sent
SSH2 3: SSH2_MSG_KEXINIT received
SSH2: kex: client->server aes256-cbc hmac-sha1 none
SSH2: kex: server->client aes256-cbc hmac-sha1 none
SSH2 3: expecting SSH2_MSG_KEXDH_INIT
SSH2 3: SSH2_MSG_KEXDH_INIT received
SSH2 3: signature length 143
SSH2: kex_derive_keys complete
SSH2 3: newkeys: mode 1
SSH2 3: SSH2_MSG_NEWKEYS sent
SSH2 3: waiting for SSH2_MSG_NEWKEYS
SSH2 3: newkeys: mode 0
SSH2 3: SSH2_MSG_NEWKEYS receivedSSH(pix): user authen method is 'no AAA', aaa server group ID = 0

SSH2 3: authentication successful for pix
SSH2 3: channel open request
SSH2 3: exec request
SSH2 3: exec message receivedSSH3: Session disconnected by SSH server - error 0x00 "Internal error"


Dostrzegłem tylko jedną różnice. Mianowicie przy próbie wysłania polecenia. Putty ustala kanał komunikacyjny a skrypt nie:

Putty:
SSH2 2: channel open request
SSH2 2: pty-req request
SSH2 2: requested tty: xterm, height 24, width 80


PHP:
SSH2 3: channel open request
SSH2 3: exec request

Czy za pomocą skrypty PHP można ustalić taki kanał? Może to tu tkwi problem:

Przepraszam jeśli temat zszedł nieco za bardzo na sprawy związane z sieciami. "Sieciowcy" jednak nie odpowiedzą mi na takie pytanie.

Pozdro
wookieb
Za pomocą ssh2_shell
Zrobisz to co chcesz, następnie spróbuj wykonywać polecenia używając zasobu zwróconego przez powyższą funkcję.
patlysy
No niestety dalej nie :/ I fakt, że debugując polecenia widzę, że ustawiło się poprawnie na kanał tak jak w przypadku Putty a jednak dalej coś nie działa. Nie chcę nadużywać Twojej cierpliwości i dobroci ale wpadłem na pewien pomysł. Powiedz czy była by taka możliwość byś w wolnej chwili spróbował się dostać do mojego firewalla ze swojego skryptu? Ja dalej coś mam z PHPem. Niby wszystko działa ale jednak przeglądarka nie wyświetla mi komunikatów błędów. A w php.ini ustawiłem na E_ALL. Tak czy inaczej muszę porządnie przygotować sobie środowisko pracy zanim zacznę pisać.

Jeśli się zgodzisz przetestować moje urządzenie przygotuję publiczny adres przez DynDNS i przekieruje cały ruch z portu 22 na firewalla. Zrozumiem jednak jeśli odmówisz. Każdy ma swoje obowiązki. Czekam jednak na odpowiedź.

Pozdro
wookieb
Tak, podaj wszystkie dane na priv.
patlysy
Na tą chwile problem rozwiązany smile.gif Muszę przyznać, że wookieb ma naprawdę potężną wiedzę w swoim fachu. Tylko pozazdrościć. Bez jego pomocy kto wie na jakim byłbym dalej etapie ze swoją pracą. Dzięki Ci za to smile.gif

Pozdro
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.