C++ linux edycja wskazanej lini pliku

0
 buker:$6$pNRqnnk7$hNjrhVzv6pErdjY0lgj95u0jmvf37T14DXweD94LTuc/4hKyV9oeaY7TyQbplzHhm3BjHexQEcwnjkP8efMrt.:15398:0:99999:7:::
mysql:!:15379:0:99999:7:::
proftpd:!:15385:0:99999:7:::
ftp:*:15385:0:99999:7:::
adelura:$6$ZWlUSbIr$./RwccGmCFDIQ5fRKk.S8ewuOIDQqloHl89Z4gTNRdI2KRCI09Xin7foxSWtFys0Uoc6ubaTug.22eEhC3fMp0:15387:0:99999:7:::
postfix:*:15388:0:99999:7:::
popa3d:*:15388:0:99999:7:::
dovecot:*:15388:0:99999:7:::
clamav:!:15388:0:99999:7:::
amavis:*:15388:0:99999:7:::

To powyżej jest struktura pliku. Każdy wiersz jest podzielony ":".
Pierwsza część to login a 2 (ta długa to hasło).

To co muszę uzyskać to wyszukać odpowiednia linie za pomocą loginu. po czym edytować drugi człon czyli hasło.
Szukałem już sporo na rożnych forach i Google i nigdzie nie znalazłem żadnej podpowiedzi. Oczywiście loginy i hasła mogą być rożne. Login i hasło przekazuje do aplikacji za pośrednictwem parametrów uruchomieniowych. Jest to program konsolowy wykonywany przez serwer www wiec odpadają wszelkiego rodzaju interakcje z użytkownikiem. Proszę o pomoc bo siedzę już nad tym problemem kilka dni

0

Znaczy chcesz komuś mieszać w /etc/passwd? ...
Kilka dni nad tym siedzisz? Chyba na demotach siedzisz kilka dni...
Przecież struktura pliku jest jasna, jaki problem napisać wyrażenie regularne tnące plik po znakach nowej linii i po dwukropku?

0

Chce mieszać sobie :) w etc/shadow tak dokładniej. Nie jestem programista dlatego szukam pomocy, znam tylko podstawy wiec wyrażenia regularne to dla mnie czarna magia

0

To znaczy, że pomyliłeś dział. Z czym konkretnie masz problem?

0

Musisz tam ręcznie grzebać? Czemu nie nie użyjesz passwd?

0

Program jest odpalany z uprawnieniami właściciela czyli roota (sgid i suid). Ale program passwd jest zabezpieczony przed takim uruchomieniem i nie mogę z niego korzystać, dlatego muszę robić to w taki sposób. A problem mam jak się z dobraniem do odpowiedniej miejsca w pliku żeby je zmienić. W PHP zrobił bym to za pomocą explode (zrobić z pliku tablice) znalazł bym odpowiednie pole zmienił je i cala tablice znowu zapisał do pliku czyszcząc poprzednia zawartość. Ale że C++ nie zbyt znam to nie wiem jak to zrobić. Szukałem odpowiednika explode ale chyba nie ma.

0

Nie możesz użyć passwd, ale w /etc/shadow grzebać już możesz? To co to za zabezpieczenie...

system("sed -i 's/^LOGIN:STARE_HASLO/LOGIN:NOWE_HASLO/' /etc/shadow");
0
adf88 napisał(a)

Nie możesz użyć passwd, ale w /etc/shadow grzebać już możesz? To co to za zabezpieczenie...

system("sed -i 's/^LOGIN:STARE_HASLO/LOGIN:NOWE_HASLO/' /etc/shadow");

Zabezpieczona jest aplikacja passwd ze można ja uruchomić tylko jako root (jeśli chcesz zmienić hasło komuś a nie sobie).

Wszystko fajnie jest z tym kodem tylko problemem jest to ze najpierw muszę z czytać z pliku te stare hasło. Tak jak mówiłem aplikacja będzie odpalana przez apache wiec interakcja nie wchodzi w grę.

0

Nie masz uprawnień użyć passwd, ale masz uprawnienia do zapisu /etc/shadow ? Coś mi tu śmierdzi...

Co do ręcznej modyfikacji:
Wczytaj do vector<string> wszystkie linie (fstream, getline).
Wyszukaj w liście ten łańcuch, który zaczyna się od żądanego loginu (string::compare).
Odnajdź pozycję hasła czyli pozycję pierwszego i drugiego znaku dwukropka (string::find).
Odczytaj stare hasło (string::substr).
Podmień na nowe (string::replace).
Zapisz wszystko z powrotem do pliku.

0

fgets linia po linii, i strtokiem to załatw ;>

1 użytkowników online, w tym zalogowanych: 0, gości: 1