[ dava @ 13.12.2011. 11:03 ] @
Na jednom linux sistemu imam instaliran MonoDevelop i tu razvijam jednu aplikaciju.
Potrebno mi je da ta aplikacija može da promjeni IP adresu računara (OS linux Debian). Zamislio sam da to radi tako što kreira fajl interfaces sa novom IP adresom na nekoj mojoj putanji i zatim pozovem terminalnu komandu koja će prekopirati fajl interfaces preko originalnog koji je na putanji /etc/network/interfaces.

Imam ovaj dio koda za izvrsavanje cmd comande:

Code:

Process p = new Process();
            p.StartInfo = new ProcessStartInfo( "mkdir", "testDir" )
                {
                    RedirectStandardOutput = true,
                    UseShellExecute = false,
                    CreateNoWindow = true
                };
            p.Start();
            string output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();
            Console.WriteLine(output)
            Console.Read();


i ovu komandu koja radi kada ručno pozovem iz terminala:

Code:
sudo /cp /home/test/interfaces /etc/network/interfaces


Komanda zahtjeva naredbu 'sudo' na početku da bi mogla da pregazi /etc/network/interfaces i to mi pravi problem. Ne mogu nikako da uglavim ovo sudo?


Code:
p.StartInfo = new ProcessStartInfo( "sudo /cp", "/home/test/interfaces /etc/network/interfaces" )


Ako pozovem ovako, buni se kaže filename unknown, ako idem bez sudo kaze access denied.

Ima li neko rešenje? Ili ako postoji neko drugo rešenje za promjenu IP adrese programski, rado ću ga prohvatiti.
[ Burgos @ 13.12.2011. 12:11 ] @
A ovako:

Code:
p.StartInfo = new ProcessStartInfo( "sudo", "/cp /home/test/interfaces /etc/network/interfaces" )


ili

Code:
p.StartInfo = new ProcessStartInfo( "/usr/bin/sudo", "/cp /home/test/interfaces /etc/network/interfaces" )


?
[ mmix @ 13.12.2011. 12:20 ] @
Zar ne mzoes ovo da resis kroz sudoers?

Ili preko setuid?

sudo chown root /home/test/interfaces
sudo chmod ug+s /home/test/interfaces



[Ovu poruku je menjao mmix dana 13.12.2011. u 13:40 GMT+1]
[ dava @ 13.12.2011. 13:02 ] @
@Burgos probao oba načina, ali ništa se ne desi, tj ne prekopira fajl, ali ne javi ni grešku. Mislim da se u ovim slučajevima uopšte i ne pozove kopiranje.

@mmix ako si pod sudoers mislio to da upišem u njega upišem

Code:
test ALL = NOPASSWD: /bin/cp 


da /cp ne bi tražio password, probao sam i nije mi pomoglo jer i u tom slučaju moram pre komande navesti sudo, a to je ono što mi se ne uklapa u komandu i poziv.
Ovo drugo tvoje rešenje nisam probao jer ne baratam dobro sa linux-om pa ako možeš malo da pojasniš.
[ Burgos @ 13.12.2011. 13:41 ] @
A da li ti se program cp nalazi u / direktorijumu? Probaj ovako:

Code:
p.StartInfo = new ProcessStartInfo( "sudo", " cp /home/test/interfaces /etc/network/interfaces" )
[ dava @ 13.12.2011. 13:51 ] @
@Burgos svaka čast, radi. Takodje hvala i @mmix-u na trudu.

Ako može samo da sumiramo na kraju zašto nije radilo sa

Code:
p.StartInfo = new ProcessStartInfo( "sudo", "/cp /home/test/interfaces /etc/network/interfaces" )


,a radi ovako:

Code:
p.StartInfo = new ProcessStartInfo( "sudo", " cp /home/test/interfaces /etc/network/interfaces" )


pošto mi nije jasno.

[ mmix @ 13.12.2011. 13:54 ] @
da, kad razmislim bolje sudoers nije bas resenje za tebe al setuid jeste

ako je tvoja aplikacija /cp

onda:

sudo chown root /cp

- postalvlja root kao ownera /cp

sudo chmod ug+s /cp

- postavlja setuid i setgid flegove na /cp fajlu

setuid znaci da kad user pokrene aplikaciju onda radi u kontekstu ownera (samim tim mzoes eventualno da zastiti ko sme da je pozove) u ovom slucaju root, vise detalja:

http://en.wikipedia.org/wiki/Setuid
http://en.wikipedia.org/wiki/Chmod
http://en.wikipedia.org/wiki/Chown

ovo sve radis samo jedanput kad setup-ujes resenje, ne svaki put kad pozivas /cp
[ Burgos @ 13.12.2011. 14:11 ] @
Program
sudo
kao prvi argument prima putanju do programa koju je potrebno izvršiti.

U prvom slučaju, adresa je glasila
/cp
što znači da se program nalazio u / direktorijumu (što obično nije slučaj). U drugom slučaju, putanja je glasila samo
cp
, pa se onda u svim direktorijumima koji su navedeni u $PATH promenljivoj tražio program
cp
(obično je u /usr/bin/cp).

Jedino što mi nije jasno je to da ti ovo zapravo radi u terminalu:

sudo /cp /home/test/interfaces /etc/network/interfaces
[ dava @ 13.12.2011. 14:29 ] @
@mmix imaću to u vidu ako mi ovo prvobitno zakaže.

@Burgos u pravu si, ovo ne radi, pogrešno sam napisao:

sudo /cp /home/test/interfaces /etc/network/interfaces


ovo sam probao iz terminala i ovo radi.

sudo /bin/cp /home/test/interfaces /etc/network/interfaces


Ljudi hvala još jednom.