[ dava @ 08.12.2011. 10:00 ] @
Treba da na jednoj mašini na kojoj je Debian programski izvršavam promjenu IP adrese.
Da malo pojasnim. Na toj mašini se vrti jedna aplikacijica pisana u C# koja ima neku svoju namjenu i na koju se korisnik konektuje sa drugog računara preko mreže. Potrebno mi je da korisnik može po svojoj želji da promjeni IP adresu te mašinice kako bi istu prilagodio svojoj mreži, a u isto vreme da ne mora poznavati linux i na njemu direktno mjenjati IP adresu nego jednostavno preko one svoje aplikacije za konektovanje da pošalje odgovarajuću komandu i da izvrši promjenu IP-a.

Napisao sam dio koda koji pod linuxom izvršava terminalnu komandu (probao 'mkdir aaa' i radi).
Nadjoh na netu ovakvu komandu za promjenu IP pod linuxom:

Code:
ifconfig eth0 x.x.x.x netmask x.x.x.x up


ali ne mogu izvršiti ifconfig jer nisam root. Kako da se logujem kao root u jednoj liniji i da u istoj liniji prosledim ovu komandu za promjenu IP-a?

U jednoj liniji - podrazumevam ne da kucam: su pa me pita za password pa kucam pasvord, pa tek onda komandu (to su tri linije).
[ maksvel @ 08.12.2011. 10:05 ] @
Možeš da dodaš u sudoers fajl da za komandu ifconfig NE traži password od tvog regularnog korisnika.

Otvoriš /etc/sudoers
Tamo uneseš:
tvojkorisnik ALL = NOPASSWD: /sbin/ifconfig

Tvoj korisnik onda poziva komandu preko pune putanje:
sudo /sbin/ifconfig eth0 ....

(Pošto /sbin nije u putanji regularnog korisnika. To možeš izbeći unosom /sbin u PATH promenljivu tvog korisnika.)


[Ovu poruku je menjao maksvel dana 08.12.2011. u 11:37 GMT+1]
[ dava @ 08.12.2011. 10:51 ] @
Probao i neće. Tačnije probao sam (nakon ove izmjene) rucno kucati ifconfig pod svojim userom i kaže da ne zna za tu komandu.

U onom fajlu postoje još dve ne komantarisane linije i ovako glase:

Code:
root ALL = (ALL) ALL
%sudo ALL = (ALL) ALL


liniju koju si mi preporucio dodao sam na kraj.

Gdje sam pogrešio?
[ maksvel @ 08.12.2011. 10:55 ] @
Da li si kucao sa sudo i da li si stavio /sbin/..?
sudo /sbin/ifconfig ...

(Obični korisnici nemaju /sbin u svojoj PATH varijabli, pa nije dovoljno kucati samo ifconfig, nego mora da se naglasi u kojem je direktorijumu ta komanda, jer je inače neće tamo tražiti.
Da bi kucao jednostavnije ifconfig (bez /sbin), treba dodati taj dir PATH-u. Otvori ~/.bashrc (nano ~/.bashrc) i na kraj unesi
PATH=$PATH:/sbin
export PATH
Kad se ponovo prijaviš, moći ćeš da koristiš čisto ifconfig)
[ dava @ 08.12.2011. 11:02 ] @
Predhodnu poruku sam kucao a nisam video tvoju izmjenu.
Primjenio sam tvoje izmjene i javlja mi kada kucam
sudo /sbin/ifconfig eth0

da postoji greška u fajlu /etc/sudoers na liniji 23, a to je baš ova. Da li linija počinje sa % ili bez.
[ maksvel @ 08.12.2011. 11:05 ] @
Bez %
% se stavlja da bi se grupi dalo pravo.
[ dava @ 08.12.2011. 11:21 ] @
Nece. Evo kako sad izgleda fajl:

Code:

i# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults        env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL) ALL

# Allow members of group sudo to execute any command
# (Note that later entries override this, so you might need to move
# it further down)
%sudo ALL=(ALL) ALL
test ALL = NOPASSWD: /sbin/ifconfig
includedir /etc/sudoers.d
~                                                                                  
~                                                                                  
~                                                                                  
~                                                                                  
~                                                                                  
~                                                                                  
~                                                                                  
~                                                                                  
~                                                                                  
~                                                                                  
Type  :quit<Enter>  to exit Vim                                  1,1           All




Moj user se zove test.
Evo greske:
Code:

test@localhost:~$ sudo /sbin/ifconfig eth0
>>> /etc/sudoers: syntax error near line 1 <<<
>>> /etc/sudoers: syntax error near line 23 <<<
sudo: parse error in /etc/sudoers near line 1
sudo: no valid sudoers sources found, quitting
test@localhost:~$ 



[ maksvel @ 08.12.2011. 11:30 ] @
Imaš "i" u prvoj liniji!!!
i# /etc/sudoers
Koristi nano editor, lakši je.
[ dava @ 08.12.2011. 12:32 ] @
Obrisao i ali ista greska, linija 23.
[ maksvel @ 08.12.2011. 12:41 ] @
cat /etc/sudoers > ~/fajl
pa okači fajl ili pejstuj sadržaj
Verovatno si ostavio neki nedozvoljen karakter.
[ dava @ 08.12.2011. 13:03 ] @
Evo fajla.
[ Miroslav Strugarevic @ 08.12.2011. 13:07 ] @
Code:
test ALL=(ALL) NOPASSWD: /sbin/ifconfig


Uvek kada menjas sudoers fajl koristi: visudo
[ maksvel @ 08.12.2011. 13:13 ] @
Moja greška, sori! :(
Isprobao sam lepo, ali sam napisao loše.
[ dava @ 08.12.2011. 13:26 ] @
Ma ništa za grešku, samo mi objasnite šta vam znači visudo? Kada da koristim i kako.
[ maksvel @ 08.12.2011. 13:48 ] @
A je l' ti sad radi??

Shvatio sam da ovde razmaci prave problem, mada i bez njih i bez (ALL) (što znači - bilo koji korisnik) meni radi: :~


# Uncomment to allow members of group sudo to not need a password
# (Note that later entries override this, so you might need to move
# it further down)
# %sudo ALL=NOPASSWD: ALL
marjan ALL = NOPASSWD: /sbin/fdisk
itlab:/# visudo -c
/etc/sudoers file parsed OK
itlab:/#


Detaljno o visudo možeš videti sa man visudo. U suštini, isto se koristi neki editor, ali se kontroliše konkurentan rad (da neko ne pobrlja sudoers u međuvremenu) i možeš da proveriš konfiguraciju sa visudo -c
[ dava @ 08.12.2011. 14:05 ] @
Ne radi. Izbrisao sam space-ove pa evo ponovo sadrzaj fajla:

Code:
# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults        env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL) ALL

# Allow members of group sudo to execute any command
# (Note that later entries override this, so you might need to move
# it further down)
%sudo ALL=(ALL) ALL
test ALL=NOPASSWD: /sbin/ifconfig
includedir /etc/sudoers.d
~                                                                                  
~                                                                                  
~                                                                                  
~                                                                                  
~                                                                                  
~                                                                                  
~                                                                                  
~                                                                                  
~                                                                                  
~                                                                                  
:wq!



Kada kucam:
Code:
visudo -c

Code:
root@localhost:/home/test# visudo -c
>>> /etc/sudoers: syntax error near line 23 <<<
parse error in /etc/sudoers near line 23


[ maksvel @ 08.12.2011. 14:12 ] @
Hm, baš čudno, nešto trivijalno promiče :(

[Ovu poruku je menjao maksvel dana 08.12.2011. u 15:23 GMT+1]
[ Miroslav Strugarevic @ 08.12.2011. 14:48 ] @
Ako nemas nista u /etc/sudoers.d onda slobodno ispred stavi # pa onda probaj.

#includedir /etc/sudoers.d

[ dava @ 08.12.2011. 15:02 ] @
Zakomentarisao sam tu liniju i radi. Tj. pod svojim userom mi vraca podesavanja mreze.
To je to. Hvala.
[ maksvel @ 08.12.2011. 16:15 ] @
Dva bambija za Miroslava
[ Miroslav Strugarevic @ 08.12.2011. 16:34 ] @
Miroslav je lupio i ostao ziv tako da ne treba nista :)

Ja sam mislio da je problem oko dozvola nad /etc/sudoers.d i mislio sam da dodavanjem # direktivu includedir stavlja pod komentar ali nije tako. Tek kada je # ispred onda je includedir direktiva aktivna.
[ dava @ 08.12.2011. 16:59 ] @
Hvala vama obojici, ali me sad Miroslave zbuni.
Jesi li siguran da je tek tad ta linija aktivna? Ja se ne razumem u linux, svo moje znanje je otpriline pokazano u ovoj temi, ali mi nije baš logično da # pali liniju. Ako je tako onda zašto ja nisam morao staviti # ispred one linije koju sam napisao? Zašto je # ispred ovih linija, a to očigledno nisu komande:

Code:

# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.

[ maksvel @ 08.12.2011. 17:09 ] @
L-O-L!!
Ovo je stvarno bilo dobro!
Tačno tako ispada: jeste # za komentar, OSIM u dva slučaja: za #include i #includedir (kada je direktiva, kao kod C-a npr.).
E, sad, dava, ti si izgleda to u nekom trenutku odkomentarisao (skinuo #) i tu je nastao problem. "Komentarisanjem" je u stvari direktiva vraćena u regularno stanje, na koje se sudo ne buni.
(Ovo nisam iskreno imao pojma, nego sad proverih )

Nego.. izgleda šašavo, ali ... ifconfig radi
[ Aleksandar Đokić @ 09.12.2011. 02:48 ] @
a sto direktno ne menjas /etc/network/interfaces ili gde vec bese
[ dava @ 09.12.2011. 08:35 ] @
Da se vratimo glavnom smislu teme, tj promjeni IP adrese programski preko terminalne komande.
@guslac procitaj prvi post.

Ne uspevam naći komandu koja menja IP adresu. Komandu koju sam mislio koristiti, a naveo sam je na početku teme mi ne radi:

Code:
test@localhost:~$ /sbin/ifconfig eth0 192.168.3.142 netmask 255.255.255.0 up
SIOCSIFADDR: Permission denied
SIOCSIFFLAGS: Permission denied
SIOCSIFNETMASK: Permission denied
SIOCSIFFLAGS: Permission denied



Evo kako je trenutno podesena mreza:
Code:
test@localhost:~$ /sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr 00:1b:eb:40:5a:7e  
          inet addr:192.168.3.141  Bcast:192.168.3.255  Mask:255.255.255.0
          inet6 addr: fe80::21b:ebff:fe40:5a7e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:306748 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18271 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:46225574 (44.0 MiB)  TX bytes:1678843 (1.6 MiB)
          Interrupt:7 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1360 (1.3 KiB)  TX bytes:1360 (1.3 KiB)




Kako ide komanda za promjenu IP?





[Ovu poruku je menjao dava dana 09.12.2011. u 09:49 GMT+1]
[ maksvel @ 09.12.2011. 08:58 ] @
dava, postavio si svom korisniku da preko sudo-a može da izvršava ifconfig. Znači, nije postao "skroz root", već samo tu komandu izvodi tako, ali mora da stoji sudo
Znači, moraš komandu izvesti sa sudo /sbin/ifconfig eth0 192.168.3.142 netmask 255.255.255.0 up
[ dava @ 09.12.2011. 09:46 ] @
Tako radi, hvala još jednom, samo sad malo testiram i primetio sam da nakon restarta vrati na staru IP. U fajlu /etc/network/interfaces ostaje zapisana stara adresa.
Kako da trajno promenim IP adresu iz komandne linije?
[ maksvel @ 09.12.2011. 10:28 ] @
E, to je ono što je guslac pomenuo. U stvari, tebi treba trenutna promena (sa ifconfig) + promena u fajlu (da bi preživao restart).
Kako upisati sada ovo u fajl...
Hm, teško da može bez skripta.
Sigurno može i nešto prostije za ove potrebe. Treba malo prelistati sed/awk (komande za manipulaciju stringovima). Ako imaš samo jednu karticu, onda je quick 'n' dirty da se napravi skriptić koji će da odradi trenutnu promenu i da njene parametre za address i netmask ubaci u linije fajla, umesto postojećih.
Ako stignem, pokušaću da skrpim nešto, a znam da ovde navraćaju poznavaoci, koji bi to mogli onako "iz rukava", pa ako naiđu, još bolje.

[Ovu poruku je menjao maksvel dana 09.12.2011. u 11:51 GMT+1]
[ dava @ 09.12.2011. 11:23 ] @
Izgleda da sam džaba krečio, ali nije tako, nešto se i naučilo.
Rešiću to ovako: napravicu interface fajl istog sadržaja kao /etc/network/interfaces samo na drugoj lokaciji ali sa odgovarajućom adresom i prekopirati ga preko originalnog (ovo ce u stvari program praviti ako korisnk sa tog drugog racunara posalje komandu za promjenu IP).
Probao sam to i naravno javlja grešku da moj user nema prava koristiti /bin/cp. Tu sam iskoristio novostečeno znanje i u fajl /etc/sudoers dodao liniju:

test ALL = NOPASSWD: /bin/cp

Nakon toga iz mog usera koji nije root komanda:

sudo cp /nekamojaputanja/interface /etc/network/interfaces

radi. :)

Hvala.
[ maksvel @ 09.12.2011. 13:14 ] @
Evo, skrpih jedno skriptče, izgleda da radi, ali NE PREPORUČUJEM da se pusti odmah na "prave" fajlove.
Pretpostavka je da postoji samo jedan interfejs (eth0), znači skroz je quick and dirty.

Code (bash):

#! /bin/bash
ADDRESS=$1
NETMASK=$2
FILE=~/etc/network/interfaces
#postavljam adresu i masku
/sbin/ifconfig eth0 $ADDRESS netmask $NETMASK
# a onda upisujem u fajl interfaces iste te vrednosti
sed  "s/^address.*/address ${ADDRESS}/g;s/^netmask.*/netmask ${NETMASK}/g"  -i $FILE
 


Ako skript nazoveš netconfig.sh i sačuvaš ga u /home/test i daš mu da bude executable, onda ga treba i uneti u sudo, slično kao u prethodnim primerima.
Poziva se sa sudo ~/netconf.sh 192.168.1.100 255.255.255.0
(slično kao ifconfig, samo bez netmask) - to je za osnovnu postavku adresa/maska

Površno sam isprobao i radi na kopiji fajla interfaces.
[ newtesla @ 09.12.2011. 13:45 ] @
@ nekih 12-tak postova gore, ili možda i prethodna strana:

Ja se izvinjavam ali:
Code:
includedir    /etc/sudoers.d


na srpskom: Takođe dodaj i direktorijum = a onda napišeš ime fajla a ne direktorijuma!

Možda ti je direktorijum /etc/sudoers - mislim da ne treba trailing slash, tj / ..... ustvari, sad gledam na Debianu, a i na Ubuntetu : i sudoers, i sudoers.d su fajlovi, dakle neće da može includedir.

@postavljač teme: Šta praviš kad ti treba promena IP adrese interfejsa - i to od strane korisnika??? Ubeđen sam da bilo kakvo prilagođavanje može da se odradi na neki mnogo civilizovaniji način.
[ dava @ 09.12.2011. 18:14 ] @
@maksvel nisam probao skriptu jer mislim da ću uspjeti tako što ću prekopirati interfaces fajl preko pravog.

@newtesla ta linija je tu stajala, ja je nisam upisao.
Imamo slične računare kao na slici. To su low cost/tiny client racunari od 300 MHz do 1000 MHz, RAM 256MB do 512MB. Oni se kače preko serijskog porta na određene uređaje, a mrežom su spojeni na korisnički računar tako da bi bilo zgodno da korisnik može ovaj tiny client prilagoditi svojoj mreži, a da ne mora to raditi u linuxu (mjenjati /etc/network/intwefaces). U stvari ideja je da korisnik zakači tu "kutiju", bez da mora znati šta je to, šta je instalirano u njoj i slično. Na svom računaru će imati program za kontrolu software-a na tiny client računaru, a ovim egzibicijama pokušavam tom software-u dodati mogućnost promjene IP adrese.

Ako postoji neko drugo rješenje, rado ću ga čuti.



Pozdrav


[Ovu poruku je menjao dava dana 09.12.2011. u 20:30 GMT+1]
[ newtesla @ 10.12.2011. 10:44 ] @
Možda ja nisam dobro shvatio - ali: DHCP???
[ dava @ 10.12.2011. 12:14 ] @
Šta kad dobije neku IP adresu od DHCP-a, kako korisnik da sazna koja je, neće valjda skenirati mrežu?
[ newtesla @ 11.12.2011. 09:23 ] @
Mislio sam - taj thin client bude DHCP server, i uvek kad ga ubadaš jedan-na-jedan sa bilo kojim OS-om, znaš mu adresu, jer je on DHCP server - nema cimanja sa ručnim podešavanjem adresa na kompu za kojim radiš. Još ako mu dodeliš da bude i DNS resolver - onda pristupanje možeš da vršiš i sa "dava.megauređaj" umesto IP :)

Naravno, ovo važi samo za situacije kada nema već nekog DHCP servera u mreži.
[ niceness @ 12.12.2011. 15:27 ] @
@dava
malo kasno upadam u diskusiju, ali ako vec imas kontrolu nad celim sistemom sto nisi koristio npr. networkmanager ili mozda connman za podesavanje mreze.
I sa jednim i drugim se komunicira preko d-bus ipc-a sto, pretpostavljam, ne bi trebao biti problem da se izvede iz C#. Mislim da bi bilo "cistije".
[ dava @ 13.12.2011. 08:34 ] @
@niceness hteo sam sa što manje popratnog software-a da prodjem, ali ako ne rešim ovako probaću i tvoje savete.

Nego, još uvek nisam uspeo. :(


Pokušao sam tako što sam kreirao na nekoj svojoj putanji fajl interfaces sa promjenjenom IP adresom i hocu da ga prekopiram preko originalnog. Tu mi nastaje problem.
Komanda pozvana iz terminala radi:

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


ali ovu liniju nikako ne uspevam da pozovem iz C# metode, tj naredba sudo me zeza.

Koristim ovaj deo koda gdje je prvi parametar FileToExecute, a drugi je argument:

Code:
Process p = new Process();
 
p.StartInfo = new ProcessStartInfo( "mkdir", "testDir"" )


ovo sa kreiranjem foldera radi, ali ako ispred mkdir stavim sudo (kao što je u mom slučaju potrebno), onda javlja da ne može da pronadje fajl, verovatno misli na sudo-u.

Da li se može napraviti skripta koja u sebi ima onu gore naredbu za kopiranje zajedno sa sudo, a da iz koda pozivam samo nju, tj bez sudo (u njoj da bude sudo):

Code:
Process p = new Process();
 
p.StartInfo = new ProcessStartInfo( "skript", "" )



@maksvel sa onom tvojom skriptom imam istih problema kod startanja upravo zbog sudo koja ide ispred.
[ maksvel @ 13.12.2011. 16:18 ] @
Na kraju, problem resen na forumu .NET: http://www.elitesecurity.org/t...izvrsavanje-terminalne-komande