C++ edycja pliku /etc/shadow
: 19 marca 2012, 17:32
Zamieszczam mój kod, z którym mam mały problem. A mianowicie, chodzi o podmianę hasła w pliku /etc/shadow, wszystko ładnie działa ale zawsze dla pierwszej linii, więc troszkę lipa. Jak ktoś byłby wstanie pomoc dopieścić ten program. Nie mogę użyć żadnej interakcji (typu pytanie o hasła itp.).
Kod: Zaznacz cały
#include <iostream>
#include <fstream>
#include <string.h>
#include <stdexcept>
#include <stdlib.h>
using namespace std;
int main(int argc, char *argv[])
{
fstream plik;
string dane;
string login, haslo;
size_t found;
short kon;
char *buf;
if(argv[1] != NULL && argv[2] != NULL)
{
login = argv[1];
haslo = argv[2];
}
try
{
plik.open("/etc/shadow", ios::in);
if(!plik.is_open())
{
throw runtime_error("Nie mozna znalezc pliku");
}
//plik>>dane;
plik.seekg(0, ios::end);
int lenght = plik.tellg();
plik.seekg(0, ios::beg);
buf = new char[lenght + 1];
plik.read(buf, lenght);
buf[lenght] = '\0';
dane = string(buf);
delete []buf;
found = dane.find(login);
if(found == string::npos)
return -1;
//throw exception("Nie ma takiego loginu");
login += ":";
kon = login.length();
do
{
kon++;
}
while(dane[kon]!=':' && kon != dane.size());
dane.replace(login.length(),kon-login.length(),haslo);
buf = new char[dane.size() + 1];
strcpy(buf, dane.c_str());
//plik.write(&dane[0], dane.length());
plik.close();
plik.clear();
plik.open("shadow", ios: :o ut);
plik<<dane;
//plik.write(dane.c_str(), dane.size());
plik.close();
}
catch(runtime_error &ex)
{
cerr<<ex.what()<<"\n";
}
return 0;
}