Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: d91 en 1 Junio 2018, 01:42 am



Título: Como parsear los distintos permisos chmod() c / c++
Publicado por: d91 en 1 Junio 2018, 01:42 am
Hola, tengo una tarea de quitar / poner permisos a archivos asi como lo hace chmod(), pero el usuario me dira cuales quitara / pondra, entonces estoy buscando una forma de almacenar los diversos codigos para pasarselo a chmod() segun me los diga el usuario (ya intente meter los codigos en un arreglo pero me lanza errores y como cadena no funciona), alguien me puede brindar una idea o tenga algun algoritmo
Código
  1. #include <stdio.h>
  2. #include <sys/stat.h>
  3. #include <iostream>
  4. #include <sys/types.h>
  5.  
  6. using namespace std;
  7.  
  8. int main(int argc, char *argv[]){
  9.  
  10. int resultado;
  11.  
  12. char archivo[100];
  13.  
  14. //char permisos[100] = "S_IWOTH | S_IROTH";
  15.  
  16. cout<<"\nIngrese nombre del archivo: ";
  17. cin>>archivo;
  18.  
  19. //resultado = chmod(archivo, permisos);
  20.  
  21. resultado = chmod(archivo, S_IWOTH | S_IROTH);
  22.  
  23. cout<<"\nResultado: "<<resultado<<"\n";
  24.  
  25. return 0;
  26.  
  27. }
  28.  


Título: Re: Como parsear los distintos permisos chmod() c / c++
Publicado por: SrMcLister en 2 Junio 2018, 13:58 pm
Buenas d91.

Los permisos disponibles para chmod son:
0 (cero) = Sin permisos
1 = permiso de ejecutar únicamente
2 = permiso de escribir solamente
3 = escribir y ejecutar
4 = permiso de leer
5 = leer y ejecutar
6 = leer y escribir
7 = leer, escribir y ejecutar

Al usar CHMOD tienes 3 grupos de números, lo cual representa igualmente 3 grupos de usuarios:
1. Owner o User, el cual de manera general es el webmaster
2. Group, un grupo de usuarios configurado por el webmaster
3. World o Anyone, que es básicamente cualquier usuario que usa tu sitio web.

Como tu tarea será a nivel de usuario el 2 y el 3 no se toca, o le pones los mismos que al owner.

Por lo tanto yo haría un programilla tal que fuera un menú y un switch.

Código
  1. #include <stdio.h>
  2. #include <sstream>
  3. #include <stdlib.h>
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. int menuChmod(){
  8.   int eleccion;
  9.   cout << "+++++++MENU+++++++" << endl;
  10.   cout << "1 - Solo ejecutar" << endl;
  11.   cout << "2 - Solo escribir" << endl;
  12.   cout << "3 - Escribir y ejecutar" << endl;
  13.   cout << "4 - Solo leer" << endl;
  14.   cout << "5 - Leer y ejecutar" << endl;
  15.   cout << "6 - Leer y escribir" << endl;
  16.   cout << "7 - Leer, escribir y ejecutar" << endl;
  17.   cout << "Ingrese eleccion: ";
  18.   cin >> eleccion;
  19.   return eleccion;
  20. }
  21.  
  22. int main(int argc, char *argv[]){
  23.  
  24.    char archivo[100];
  25.    ostringstream oss;
  26.    oss << "chmod ";
  27.  
  28.    cout<<"\nIngrese nombre del archivo: ";
  29.    cin>>archivo;
  30.  
  31.    switch(menuChmod()){
  32.        case 1: {oss << "100 "<<archivo;
  33.                 system((oss.str()).c_str());
  34.                 break;
  35.                }
  36.        case 2: {oss << "200 "<<archivo;
  37.                system((oss.str()).c_str());
  38.                break;
  39.                }
  40.        case 3: {oss << "300 "<<archivo;
  41.                 system((oss.str()).c_str());
  42.                 break;
  43.                }
  44.        case 4: {oss << "400 "<<archivo;
  45.                system((oss.str()).c_str());
  46.                break;
  47.               }
  48.        case 5: {oss << "500 "<<archivo;
  49.                 system((oss.str()).c_str());
  50.                 break;
  51.                }
  52.        case 6: {oss << "600 "<<archivo;
  53.                 system((oss.str()).c_str());
  54.                 break;
  55.                }
  56.        case 7: {oss << "700 "<<archivo;
  57.                 system((oss.str()).c_str());
  58.                 break;
  59.                }
  60.        default:;
  61.    }
  62.  
  63.    ostringstream ls;
  64.    ls << "ls -la | grep " << archivo;
  65.    system((ls.str()).c_str());
  66.  
  67.    return 0;
  68. }

Lo hice con system porque desconozco como funciona chmod en la libreria que usaste.
La idea está en el codigo.
SI al grupo y a todo el mundo quieres asignarle los mismos permisos, en vez de 100, sería 111, y así con todos.

Espero haberme explicado bien.
Un Saludo.