Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z ssh2
Forum PHP.pl > Forum > PHP
bagsiur
Witam. Zacząłem pisać skrypt który umożliwiałby połączenie się z kontem ssh ze strony, taki jakby putty. Zalążek skryptu działa, z małym aczkolwiek dla mnie dość istotnym wyjątkiem, mianowicie programy konsolowe jak np. mutt, ekg nie zwracają żadnych wyników. Skrypt wykonuje się ale efektów nie ma sad.gif

Możliwe jest napisanie takiego jakby putty w php??

  1. <?php
  2. $connection = ssh2_connect('127.0.0.1', 22);
  3. if(ssh2_auth_password($connection, 'login', 'haslo')){
  4. $a=ssh2_exec($connection,"ps -A");
  5. $dane=fread($a,4096);
  6.  
  7. while(!feof($a)){
  8. $dane.=fgets($a);
  9. }
  10.  
  11. echo '<pre>'.$dane.'</pre><br>';
  12. }
  13. else echo("haslo zle masz");
  14. ?>
bim2
Odpowiadając na twoje pytanie, da się.

Zadaj odpowiednie pytanie smile.gif
bagsiur
hehe.... fakt źle się wyraziłem zmęczenie daje o sobie znać haha.gif A więc: Jak zrobić aby programy konsolowe zwracały wyniki w formie tekstowej? (czyli żeby mój skrypt zwrócił wynik uruchomienia np. mutt-a ). w sieci w języku polskim jest naprawdę mało na temat ssh2...
bim2
Komentarz w manualu php
  1. <?php
  2. $stream = ssh2_exec($connection, 'ps ax');
  3.  stream_set_blocking($stream, true);
  4.  
  5.  // The command may not finish properly if the stream is not read to end
  6.  $output = stream_get_contents($stream);
  7. ?>

smile.gif
bagsiur
bim2 ty chyba nie masz pojęcia o czym piszesz... Programy konsolowe typu ekg,irssi mutt korzystają z bibliotek ncurses, więc jak już zdążyłem się dowiedzieć potrzebują dostępu do powłoki. A to na potwierdzenie moich słów:

  1. <?php
  2.  
  3. $lala = ssh2_connect('127.0.0.1', 22);
  4. if(ssh2_auth_password($lala, 'bagsiur', 'polaris')){
  5.  
  6. $a=ssh2_exec($lala,'ekg');
  7. if($q = ssh2_fetch_stream($a, SSH2_STREAM_STDERR)){
  8. $result_err = stream_get_contents($q);
  9. }
  10. if ($result_err) echo '<pre>'.$result_err.'</pre><br>';
  11. }
  12. else echo("haslo zle masz");
  13. ?>


Otwarłem więc powłokę i udało mi się uruchomić nawet ekg, niestety jest jakaś kolizja kodowania... sad.gif no ale cała noc przedemną na googlowanie haha.gif
Chyba że ktoś coś podpowie lub nakieruje? Oto skrypt: (sorki że taki chaotyczny, ale jeszcze na dobrą sprawę nie zacząłem go pisac)

  1. <?php
  2. $lala = ssh2_connect('127.0.0.1', 22);
  3. if(ssh2_auth_password($lala, 'login', 'haslo')){
  4.  
  5. $stdio = ssh2_shell($lala,"xterm");
  6. fwrite($stdio,'ekg'.PHP_EOL);
  7. sleep(1);
  8.  
  9. while($line = fgets($stdio)) {
  10. echo $line."<br />";
  11. }
  12. fclose($stdio);
  13. }
  14. else echo("haslo zle masz");
  15. ?>


Szkoda że na temat ssh2 w php jest tak mało na necie w języku polskim... Nie narzekam na znajomość angielskiego ale jakiś doświadczony programista mógłby wszystko ładnie nam opisać i wrzucić na php.pl tongue.gif

Znalazłem biggrin.gif wystarczy zmienić na domyślny "term_type" (kto by to wiedział haha.gif):
  1. <?php
  2. $stdio = ssh2_shell($lala, 'vanilla', null, 80, 24, SSH2_TERM_UNIT_CHARS);
  3. ?>
Adagio
Możesz zamiast ssh2 użyć jeszcze expect" title="Zobacz w manualu PHP" target="_manual
Powiem szczerze, że używałem ssh2 i ma jeszcze kilka niedociągnięć (m.in. problemy z kluczami do autoryzacji).
Polecam expecta, gdyż daje trochę więcej możliwości smile.gif
bagsiur
ehh nie przemyślałem wszystkiego wyglada na to że jednak z wykorzystaniem ssh2 nie napisze klienta ssh ze strony... Problem tkwi w tym że sesja w php nie może przechowywać zasobów.
  1. <?php
  2. $_SESSION['polaczenie']=ssh2_connect('127.0.0.1', 22);
  3. ?>

Po odświeżeniu strony z zasobów robi nam sie int.
Czy można według was to jakoś ominąć??( wiem że nie, ale pytam ) W php4 sesja bodajże mogła przechowywać zasoby.
A co do expect, to nie znam tej bibliotek ale wygląda na to że trzeba będzie o niej poczytać... I nie wiem czy po przeczytaniu manuala osiagnę wymarzony efekt putty przez stronę. Więc teraz moje pytanie, czy ktoś próbował pisać coś takiego?? Jak tak to jakimi metodami osiągnął efekt??
bim2
Mógłbyś co polecenie łączyś się od nowa z ssh smile.gif
bagsiur
bim2 genialna myśl... pomyśl jak pogadasz z kumplem przez ekg jeśli cały czas otwierałbyś go na nowo?? Naprawdę nikt z użytkowników nie pisał czegoś takiego?? Za każdą pomoc byłbym wdzięczny... <help me>
bim2
Bagsiur, nie wiedziałem co kombinujesz. Jedyne wyjście to przy rozpoczęciu skryptu robisz exec('php.exe -i connect.php'); (jakoś tak, nie pamiętam tongue.gif). W connect.php łączysz się z kolegą i odbierasz tylko wiadomości. Po odebraniu wiadomości sprawdzasz w bazie czy nie ma jakiejś wiadomości w kolejce (którą dodajesz np ajaxem innym skryptem) i ją wysyłasz. Wtedy możesz odbierać wiadomości na okrągło i wysyłać, nie ma zastoju wyslanie -> odebranie -> wysłanie i ciągle jest połączenie z serwerem. Robisz też ajaxem jakby ping to bazy (np ustawieasz nowy time() ) i w connect.php sprawdzasz czy nie mineło 10sec od ostatniego pingu. Jeśli minęło to kończysz skrypt smile.gif
bagsiur
"Bagsiur, nie wiedziałem co kombinujesz." - i dalej nie wiesz... tworze klienta ssh. dla aplikacji korzystających z bibliotek ncurses (między innymi). Ale już raczej znalazłem rozwiązanie, jak skończę to wrzucę to na forum...

Ps. bim2 za bardzo ci zależy na nabijaniu postów. Starasz się pomagać rozumiem, ale kiedy nie jesteś w stanie pomóc, nie pisz... I zapoznaj się z jakims klientem ssh choćby konsolowym, to dowiesz się co chcę osiągnąć. Jedno jest pewne w php sie czegos takiego napisać nie da... nie przemyślałem tych zasobów w sesji (czuję się jak noob)
erix
Cytat
ehh nie przemyślałem wszystkiego wyglada na to że jednak z wykorzystaniem ssh2 nie napisze klienta ssh ze strony... Problem tkwi w tym że sesja w php nie może przechowywać zasobów.

A nie możesz zostawiać ekg na screenie? I wtedy łączyć się za każdym razem od nowa i dołączać do ID screena trzymanego w sesji.

Poza tym, AFAIK z ekg można się komunikować przez zapisywanie do socketa w systemie plików.
bagsiur
ekg to tylko przykład... naprawdę mi na nim nie zależy.... choć fakt, ze w przypadku ekg to pomysł zacny... smile.gif
erix
No to spróbuj ze screenem. [;
bim2
Albo moim sposobem, choć screen chyba lepszy winksmiley.jpg
tompl
Moglby ktos przedstawic w sposob praktyczny jak mozna usyskac wlasnie takie podtrzymywanie 'sesji' polaczenia ssh2 questionmark.gif
W jaki sposob mozna przezkazac wskaznik do obiektu stworzonego przez ssh2_connect ?

Drugie pytanie czy ktos wie jak pozbyc sie wszystkich znacznikow kolorow np. z `ls` w strumieniu otrzymanym z ssh2_shell ?

Po trzecie, czy tez macie problemy z "stream_set_blocking($strumien, TRUE)" w polaczeniu z ssh2_shell ? Strona mi sie blokuje, dziwne bo w uzyciu z ssh2_exec dziala super
erix
Cytat
Moglby ktos przedstawic w sposob praktyczny jak mozna usyskac wlasnie takie podtrzymywanie 'sesji' polaczenia ssh2
W jaki sposob mozna przezkazac wskaznik do obiektu stworzonego przez ssh2_connect ?

W żaden. Wszystkie połączenia w PHP są podtrzymywane w ramach jednego wykonania, jeszcze nie spotkałem się z podtrzymywaniem na poziomie skryptów. Jak już, to działający proces w tle i odwoływanie się przez shm/sockety/pipe'y.

Najlepiej będzie w Twoim przypadku odpalić ekg na screenie i za każdym połączeniem po prostu się pod niego podłączać. No prościej chyba się już nie da...

Cytat
Drugie pytanie czy ktos wie jak pozbyc sie wszystkich znacznikow kolorow np. z `ls` w strumieniu otrzymanym z ssh2_shell ?

http://www.linuxquestions.org/questions/li...r-alias-278265/ - wychodzi na to, że musisz jedną zmienną środowiskową podmienić. winksmiley.jpg
tompl
Cytat(erix @ 26.05.2009, 21:11:50 ) *
http://www.linuxquestions.org/questions/li...r-alias-278265/ - wychodzi na to, że musisz jedną zmienną środowiskową podmienić.

No i znak konca wiersza bo jest tez inny. Ale mniejsza o wiekszosc.

Cytat(erix @ 26.05.2009, 21:11:50 ) *
W żaden. Wszystkie połączenia w PHP są podtrzymywane w ramach jednego wykonania, jeszcze nie spotkałem się z podtrzymywaniem na poziomie skryptów.

Nie skromnie mowiac myslalem nad wykorzystaniem w pewien sposob php-cgi, tylko jak wtedy z tym skryptem się połaczyc jakimis socketem.
Jestem ciekaw czym jest wskaznik do obiektu i czy by dalo sie go przekazac przy uzyciu np. pliku?
Czyli skrypt spawdza czy jest plik/socket, jezeli nie utworzymy nowy. Jezeli jest pobieramy wskaznik do obiektu w pamieci.
erix
Zadam Ci tylko jedno pytanie - czy wiesz, po co wymyślono screen? Po co tak kombinujesz?

Cytat
Czyli skrypt spawdza czy jest plik/socket, jezeli nie utworzymy nowy.

AFAIK musiałbyś pisać coś w stylu demona w jakimś języku nie-skryptowym...

Cytat
Jezeli jest pobieramy wskaznik do obiektu w pamieci.

Podejrzewam, że zabezpieczenia/możliwości PHP nie pozwoliłyby na coś takiego. ;]
tompl
Cytat(erix @ 26.05.2009, 23:57:10 ) *
Zadam Ci tylko jedno pytanie - czy wiesz, po co wymyślono screen? Po co tak kombinujesz?

Szczerze pierwsze slysze.

Cytat(erix @ 26.05.2009, 23:57:10 ) *
AFAIK musiałbyś pisać coś w stylu demona w jakimś języku nie-skryptowym...

Raczej by nie przeszło

Cytat(erix @ 26.05.2009, 23:57:10 ) *
Podejrzewam, że zabezpieczenia/możliwości PHP nie pozwoliłyby na coś takiego. ;]

Nie zgodze się, można do zmiennej przekazać wskaźnik do obiektu przez '&'. Pytanie czym jest taki wskaznik i jaki ma format tongue.gif
bim2
to wpisz "screen -S testowy /jakis/modulik/lol"
i później
"screen -ls"
erix
Cytat
Pytanie czym jest taki wskaznik i jaki ma format

Nie zawracaj sobie gitary, jak pisanie rozszerzenia nie wchodzi w grę.

Screen i tylko screen, uzupełnij braki.
tompl
Cytat(bim2 @ 27.05.2009, 15:55:37 ) *
to wpisz "screen -S testowy /jakis/modulik/lol"
i później
"screen -ls"


Znalazlem chwilke na ogarniecie tego problemu, zrobilem prosta metode co sprawdzenia sesji i ew. wywolywania nowej. niestety polaczenie nie moze byc nawiazane ze wzgledu ze screen wymaga polaczenie z tty.


Must be connected to a terminal.

Dodam ze probowalem utworzyc i polaczyc sie z sesja screena, przy pomocy obydwu meton screen oraz przy wykorzystnaiu PECL/ssh2

polecenia screen:
/usr/bin/screen -S konsola_sesja -md #utworzenie
/usr/bin/screen -r konsola_sesja #polaczenie
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.