Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Php współpraca z c++
Forum PHP.pl > Forum > PHP
buker
Witam,

Tworze panel administracyjny linuxa (webowy). I napotkałem się z pewnym problemem.
Przez PHP uruchamiam program napisany w c++ i chciał bym przekazac zmienna z PHP do tego programu i w drogą strone.
Wytłumaczę na przykładzie

PhP uruchamia program C++ który w powłoce shellowej wykonuje polecenie tworzące użytkownika "adduser". Musze teraz po przez php przekazać do c++ login tego użytkownika. Gdy już to się zrobi c++ powinien wysłać odpowiedz serwera z żądaniem hasła, php wysyła hasło.

To co już napisałem

PHP:
  1. <?php
  2. shell_exec('cd /home/buker/programy && ./adduser');
  3. ?>


Program C++:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string>
  4. int main(){
  5.  
  6.  
  7. system("adduser test");
  8. };
  9.  
  10.  


mortus
Proponowałbym od razu przekazać login i hasło (pochodzące np. z formularza). Programowi napisanemu w C++ można przekazać parametry:
Kod
#include <stdio.h>
#include <stdlib.h>
#include <string>
int main(int argc, char *argv[]) {
// w argv[0] znajduje się nazwa programu, czyli w tym przypadku adduser
char *username = argv[1];
char *password = argv[2];
char *command = "adduser " + username + " " + password;
system(command);
return 1;
}

Skrypt PHP:
  1. <?php
  2. $command = 'cd /home/buker/programy && ./adduser '.$username.' '.$password;
  3. $result = shell_exec($command);
  4. ?>

Nie wiem tylko dlaczego w tworzeniu użytkownika ma pośredniczyć program w C++, tym bardziej, że wywołuje on komendę powłoki shell. Przecież to bez sensu, bo równie dobrze można to zrobić w PHP.
buker
Ponieważ php nie moze wykonca polecenia z prawami roota co jest konieczne do wykonywania niektorych polecen. To rozwiazanie jest dobre jesli chodzi o przekazanie loginu. z haslem jest gorzej. Bo system odpowie zapytaniem o haslo a nie odrazu przyjmie
Fifi209
Hmm, dalej nie rozumiem skoro przekażesz od razu, to wykonujesz adduser a system pyta a program odpowiada wcześniej podanym hasłem, gdzie problem?
buker
Dlatego nie komenda nie wyglada adduser login, a nie adduser login haslo

Kod
root@bukerVPS:/home/buker/programy# adduser test
Adding user `test' ...
Adding new group `test' (1001) ...
Adding new user `test' (1001) with group `test' ...
The home directory `/home/test' already exists.  Not copying from `/etc/skel'.
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Pokazuje jak wyglada procedura.

- adduser login
- podajesz haslo
- potwierdzasz haslo
Fifi209
PHP: Cześć mam dla Ciebie login i hasło
C++: Ok, przekaż mi jako parametry przy uruchomieniu
PHP: Przekazuję parametry do programu

C++: Cześć system, chciałbym dodać usera o nicku: test
System: Nie ma problemu, podaj hasło:
C++: Czekaj wyciągnę je z parametru, który dostałem od PHP gdy mnie uruchamiał
C++: Przekazuję
System: Potwierdź
C++: Potwierdzam
System: Dzięki
C++: Nie ma sprawy

C++: User dodany
PHP: Dzięki za info


Tak w formie żartu, może teraz zrozumiesz o co mi chodzi.
buker
OK już rozumiem smile.gif. Tylko teraz mam następny problem.

Kod
adduser.cpp: In function 'int main(int, char**)':
adduser.cpp:8: error: invalid operands of types 'const char [9]' and 'char*' to binary 'operator+'


thek
Sam komunikat mówi wprost... Zrąbałeś kod w C++, a że go nie znamy to o czym my teraz mamy rozmawiać? wink.gif Są tutaj ludzie w C++ piszący więc zapewne błąd też się wyłapie smile.gif
buker
Kod
#include <stdio.h>
#include <stdlib.h>
#include <string>
int main(int argc, char *argv[]) {
// w argv[0] znajduje się nazwa programu, czyli w tym przypadku adduser
char *username = argv[1];
char *password = argv[2];
char *command = "adduser " + username + " " + password;
system(command);
return 1;
}


To jest ten sam kod co kilka postów wyżej. Chciałem go sprawdzić
Bags_Bunny
Konkatenować plusem to Ty możesz stringi, a nie tablice znaków*. Jak się upierasz na chary, to sobie znajdz funkcje łączącą tablice znaków. strcat chyba.

Kod
#include <stdio.h>
#include <stdlib.h>
#include <string>
using namespace std;
int main(int argc, char *argv[]) {
// w argv[0] znajduje się nazwa programu, czyli w tym przypadku adduser
string username = argv[1];
string password = argv[2];
string command = "adduser " + username + " " + password;
system(command.c_str());
return 1;
}



* - chyba, że o czymś nie wiem wink.gif
mortus
No cóż, dawno nie siedziałem przy C++ i mógł się wkraść błąd.
buker
Kod
#include <stdio.h>
#include <stdlib.h>
#include <string>
using namespace std;
int main(int argc, char *argv[]) {
// w argv[0] znajduje się nazwa programu, czyli w tym przypadku adduser
string username = argv[1];
string password = argv[2];
string command = "adduser " + username;
system(command.c_str());
system(password.c_str());
system(password.c_str());
return 1;
}


No i jest lipa. Jak wykonam program.

To jest fragment z działania programu:

Kod
./adduser test qaz123
Adding user `test' ...
Adding new group `test' (1001) ...
Adding new user `test' (1001) with group `test' ...
The home directory `/home/test' already exists.  Not copying from `/etc/skel'.
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for test
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] y
sh: qaz123: not found
sh: qaz123: not found


I tak prosi o hasła. Jak wpisze wszystko tak żeby poszło dalej dopiero się wywołuje funkcja system z hasłem
Bags_Bunny
Nie wiem jak to rozwiązać zgodnie z tym, co powiedzieli poprzednicy, ale wiem, że:
  1. Zgodnie z dokumentacja adduser może przyjąć hasło jako argument (Google: man adduser).
  2. Adduser jest interaktywną nakładką na nieinteraktywny useradd (Google: man useradd).
cojack
Po cholere to wywoływać z c++ ? biggrin.gif
thek
To nie prościej to posłąć wprost jako komendę do shella wprost z poziomu php? Zamiast walić pośrednika w postaci programu w C++ od razu wywołaj polecenie, o ile masz uprawnienia. A jeśli nie to chyba prościej będzie zamiast kodu w C++ napisać skrypt bash'owy.
cojack
Nie ma sensu tego nawet z basha wywołać, przecież nie uruchomisz programu z php czy to w c++ czy w pythonie czy w czym kolwiek innym niż z uprawnieniami które posiada php. Tudzież apache.
abort
Niby tak, ale...
1. Na linuksach (i innych unixach) apache nie chodzi z uid=0, więc wykonanie skryptu się nie powiedzie, bo nie-root nie da rady dodać usera do systemu. Apache jest URUCHAMIANE przez administratora (by dopiąć się do portu <1024) i "zrzuca" swoje prawa na uid różny od zera. Nazwa usera (i zarazem nazwa grupy) to najczęściej "apache", "httpd", "www" czy "www-data". Zwykły, nieuprzywilejowany użytkownik.
2. binarka jest "niby" wygodniejsza, można dać jej SUID, czyli "sticky bit UID" - prawa uniksowe 4750, ustawić właściciela na roota, a grupę na tę grupę, do której należy Apache (np. "www"), i się wykona z prawami roota. Czterocyfrowy chmod: pierwsza cyfra "4" mówi, że program wykonuje się z prawami tego użytkownika, który jest właścicielem pliku (tu: root). A reszta klasycznie: pełne prawa dla właściciela (którym jest root), prawa "rx" dla członków grupy "www" (czyli tej grupy, której członkiem jest user, którego prawa ma Apache i żadne prawa dla innych (w samym systemie też bywają "źli ludzie").
3. Jeśli Apache jest w środowicku chrootowanym (chroot/jail), to nawet suid nie pomoże - w głównym systemie nie zrobimy nic.

Ma to wady:
- napisanie własnego programu przez niefachowca to zawsze spora szansa na zrobienie dziury, a jak jeszcze "źli ludzie" się zwiedzą, to będzie nieciekawie
Swoją drogą... mając UID=0 (czyli prawa roota) jestem w stanie trzema komendami echo (i jedną "mkdir") dodać usera do systemu i nadac mu grupę, i nie ma w tym żadnej filozofii, w pierwszych uniksach taka była JEDYNA metoda na dodanie nowego usera do systemu smile.gif - więc napisanie skryptu może odbyć się "bardzo szybko"

Proponuję metodę pośrednią:
- Apache zapisuje sobie dane userów w pliku w katalogu serwera WWW
- z crona uruchamiasz zwykłego skrypta, który już operuje z prawami dowolnego usera w systemie (czyli może także działać z prawami roota) i założy Ci tego usera... Ale to oczywiście jest wada porównywalna z binarką wystawioną w drzewie serwera WWW.

Ma to zalety:
- zadziała w środowisku chrootowanym
- możesz sobie dowolnie posprawdzać wszystkie dane "już na spokojnie".

...ale i wady:
Nie jesteś w stanie "online" poinformować usera o fakcie założenia konta, ani tym bardziej zwrócić mu informacji, że np. login jest już zajęty. Przetwarzasz plik w cronie, czyli z granulacją conajmniej minutową.

P.S.
można jeszcze korzystać z sudo, ale to też gimnastyka...
buker
Cytat(cojack @ 3.11.2011, 22:20:30 ) *
Po cholere to wywoływać z c++ ? biggrin.gif

Ten post nic nie wnosi do tematu. Nawet nie przeczytałeś co jest napisane wcześniej.


Cytat(cojack)
Nie ma sensu tego nawet z basha wywołać, przecież nie uruchomisz programu z php czy to w c++ czy w pythonie czy w czym kolwiek innym niż z uprawnieniami które posiada php. Tudzież apache.


Da się z uprawnieniami SUID/SGID ale tylko programy wykonywalne. Czyli skrypty bash/perl odpadaja wiec zostaje program w c/c++ .

Cytat
P.S.
można jeszcze korzystać z sudo, ale to też gimnastyka...


Sudo już próbowałem i w żaden sposób to nie działa www-data(apache) nawet dodany do sudo bez konieczności wpisywania hasła (NOPASSWORD) i tak chce wyświetlić prośbę o hasło czego nie może zrobić smile.gif.


Natchnęło mnie twoje stwierdzenie :
Cytat
echo (i jedną "mkdir") dodać usera do systemu i nadac mu grupę, i nie ma w tym żadnej filozofii, w pierwszych uniksach taka była JEDYNA metoda na dodanie nowego usera do systemu smile.gif - więc napisanie skryptu może odbyć się "bardzo szybko"


Program by poklei wykonywał polecenia useradd groupadd i mkdir z odpowiednimi parametrami i wtedy by nie było problemu hasła. Tak mi się zdaje... Jutro napisze to i się pochwale co wyszlo
cojack
http://www.suphp.org/Home.html i po ptokach.
starach
No i cojack pozamiatał.

Ja dodam jeszcze tylko dwie inne metody:

1. sudo
2. Konfiguracja demona ssh pozwalająca na logowanie się na localhost przez localhost do konta super użyszkodnika. Można w tym celu na przykład utworzyć dodatkowy demon ssh działający na innym porcie i poblokować dostęp w iptables z innych hostów.
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.