Portaal Portaal Pingviini veeb foorumi pealeht
  Viki  |  IRC  |  Otsing  |  Küsimused ja vastused  |  Profiil  |  Privaatsõnumite vaatamiseks logi sisse  | Logi sisse või Registreeru
<empty>
Vaata järgmist teemat
Vaata eelmist teemat

Postita uus teemaVasta teemale
Autor Sõnum
v6lur
Vana Pingviin
Vana Pingviin


Vanus: 37
Liitunud: 08.07.2005
Postitused: 667
Asukoht: Kopenhaagen/Tartu
Distributsioon: Arch
blank.gif
postituspostitatud: 07.03.2008, 18:30  postituse pealkiri:  Skript Bluetoothi sisse/välja lülitamiseks  

Tekkis mõte proovida valmis saada väike skript/shelli käsk, mille abil Bluetoothi sisse-välja lülitada. Eesmärk on ühe globaalse kiirklahvi kaudu lülitada välja, kui on parajasti sisselülitatud, ja vastupidi. (Eraldi kiirklahve sisse- ja väljalülitamiseks ei taha, oleks liiga lihtne Very Happy )

See töötab:
Kood:
$ if [ `cat /sys/devices/platform/asus-laptop/bluetooth` -eq 1 ]; then echo 0; else echo 1; fi > /home/mihkel/bluetooth

See ei tööta:
Kood:
$ sudo if [ `cat /sys/devices/platform/asus-laptop/bluetooth` -eq 1 ]; then echo 0; else echo 1; fi > /home/mihkel/bluetooth
(annab veateate "bash: syntax error near unexpected token `then' ")
("/home/mihkel/bluetooth" on hetkel "/sys/devices/platform/asus-laptop/bluetooth" ohutu asendus.)
Proovisin ka nii:
Kood:
sudo "if [ `cat /sys/devices/platform/asus-laptop/bluetooth` -eq 1 ]; then echo 0; else echo 1; fi > /home/mihkel/bluetooth"

Selle peale sain veateate "sudo: if [ 0 -eq 1 ]; then echo 0; else echo 1; fi > /home/mihkel/bluetooth: command not found"

Mida ma valesti teen?

_________________
"Sleep, she is for the weak."

johnsmith
Vana Pingviin
Vana Pingviin


Vanus: 50
Liitunud: 24.07.2006
Postitused: 714
Asukoht: Universum
Distributsioon: Ubuntu/Gentoo/FreeBSD
finland.gif
postituspostitatud: 07.03.2008, 20:12  postituse pealkiri:  (teema puudub)  

Ma arvan , et see mida sa tahad saavutada tuleks teha hoopis nii
Kood:

#!/bin/bash

if [ `cat /sys/devices/platform/asus-laptop/bluetooth` -eq 1  ]
 then echo 0 > /sys/devices/platform/asus-laptop/bluetooth
 else echo 1 > /sys/devices/platform/asus-laptop/bluetooth
 fi

#end


Bash on päris lõdva süntaksiga seal pole vaja neid semikooloneid kuigi see on hea programmeerimise tava. Muidugi üheski programmeerimiskeeles pole if testi järgi semikoolonit see on ikka lause lõpus. Ülimääraseid lauseid tuleks vältida, et säilitada koodi loetavus.

EDIT: Siis peaks töötama nii. Kas see sudo tahab salasõna ka ?

_________________
"Thinking is the hardest work there is, which is probably the reason why so few engage in it" - Henry Ford



Viimati muutis johnsmith 07.03.2008, 20:44; muudetud 1 kord
v6lur
Vana Pingviin
Vana Pingviin


Vanus: 37
Liitunud: 08.07.2005
Postitused: 667
Asukoht: Kopenhaagen/Tartu
Distributsioon: Arch
blank.gif
postituspostitatud: 07.03.2008, 20:36  postituse pealkiri:  (teema puudub)  

Ilma mõneta neist semikoolonitest ei tee ka esimene rida (mis koos nendega töötab) midagi, sellepärast nad sinna said/jäid...

Miks too esimene rida sudo'ga ei tööta, jääb mulle arusaamatuks.

Eesmärki selgitasin vist natuke poolikult... Kui BT töötab, on /sys/devices/platform/asus-laptop/bluetooth sisuks 1. Kui ei tööta, siis 0. Üritan saavutada seda, et kui vajutan nt Win+B, siis:
a) kui BT on parajasti sisse lülitatud, siis lülitatakse ta välja:
b) kui BT on välja lülitatud, siis lülitatakse ta sisse;
ehk siis kui $ cat /sys/devices/platform/asus-laptop/bluetooth tagastab 1, siis $ sudo echo 0 > /sys/devices/platform/asus-laptop/bluetooth ja vastupidi.
/home/mihkel/bluetooth on testimiseks, kuna veateateid vms igaks juhuks ei tahaks "päris" kohta kirjutada.

Bash'i skript sudo'ga käima tõmmata on lihtsam jah, kuigi tore oleks, kui niisama ka töötaks...

E: sudo tahab parooli ka, jah. /etc/sudoers vast aitaks... Rolling Eyes (samas wlassistant nõudis vanas arvutis parooli ka pärast selle sudoers'isse lisamist - uues pole proovinud.)

_________________
"Sleep, she is for the weak."

johnsmith
Vana Pingviin
Vana Pingviin


Vanus: 50
Liitunud: 24.07.2006
Postitused: 714
Asukoht: Universum
Distributsioon: Ubuntu/Gentoo/FreeBSD
finland.gif
postituspostitatud: 07.03.2008, 21:10  postituse pealkiri:  (teema puudub)  

Esimesena ma siiski prooviks seal sudoersi failis anda sellele skriptile NOPASSWD parameeter. Pole ise juba tükk aega sudoersiga jamanud praegu Gentoos pole seda isegi installitud.

Kui see ei õnnestu siis võimalik kirjutada C keeles väike proge millele anda setuid ja mis käivitab siis selle skripti, see on jälle rohkem sääsest elevandi tegemine.

Ma ei tea kas on ka võimalus sööta sudoersile salasõna teisest failist näiteks......., tundub jälle mõtetu häkk olevat.

_________________
"Thinking is the hardest work there is, which is probably the reason why so few engage in it" - Henry Ford

v6lur
Vana Pingviin
Vana Pingviin


Vanus: 37
Liitunud: 08.07.2005
Postitused: 667
Asukoht: Kopenhaagen/Tartu
Distributsioon: Arch
blank.gif
postituspostitatud: 07.03.2008, 21:30  postituse pealkiri:  (teema puudub)  

Tegelikult see parooli küsimine mind ei segagi - sudo asemele sai muidugi kdesudo pandud, enne unustasin mainida.

Hetkel tegin siis eraldi faili, mis vajadusel (kde)sudo'ga käivitatakse. Kui keegi oskab öelda, miks esimeses postituses kirjeldatud variandid ei tööta, võib siiski teada anda.

_________________
"Sleep, she is for the weak."

johnsmith
Vana Pingviin
Vana Pingviin


Vanus: 50
Liitunud: 24.07.2006
Postitused: 714
Asukoht: Universum
Distributsioon: Ubuntu/Gentoo/FreeBSD
finland.gif
postituspostitatud: 07.03.2008, 22:01  postituse pealkiri:  (teema puudub)  

Esimeses postis kirjeldatud kood ei tee esiteks seda mida olid soovinud.

Kui if test on tõsi siis echo prindib standard outputi ehk ekraanile 0 kui ebatõsi siis 1.

fi ütleb bashile, et if testi järel tulevad laused on läbi:
Programmeerimiskeeltes tavaliselt tähendab seda
if (mingi test)
{
Hästi palju igast lauseid;

}
// If lõppeb ja programmi sooritus jätkub siit

Bash ei saanud ilmselt aru millal lõppeb if koodi ala kuna
fi > /home/mihkel/bluetooth on nagu eraldi lause samas kui fi lõpetab if testi laused siis jääb bashil sooritada selline lause
> /home/mihkel/bluetooth mis aga ei tee muud kui redigeerib midagi sinna faili aga puudub vasakul olev operand. Kui bash leiab koodist > siis ta teab, et see on binaarne operand ehk mõlemal pool operandi peab olema mingi muutuja kui seda pole siis bash lõpetab erroriga.

Ühesõnaga nii loogiline kui süntaksi error

Wink

_________________
"Thinking is the hardest work there is, which is probably the reason why so few engage in it" - Henry Ford

v6lur
Vana Pingviin
Vana Pingviin


Vanus: 37
Liitunud: 08.07.2005
Postitused: 667
Asukoht: Kopenhaagen/Tartu
Distributsioon: Arch
blank.gif
postituspostitatud: 07.03.2008, 22:44  postituse pealkiri:  (teema puudub)  

Kood:
$ if [ `cat /sys/devices/platform/asus-laptop/bluetooth` -eq 1 ]; then echo 0; else echo 1; fi > /home/mihkel/bluetooth
...teeb kusjuures täpselt seda, mida ma tahan (tavakasutajal pole aga õigust /sys/devices/platform/asus-laptop/bluetooth kirjutada) - ent kui sinna nüüd sudo ette panna (ja jutumärgid ümber), siis annab veateate: "sudo: if [ 0 -eq 1 ]; then echo 0; else echo 1; fi > /home/mihkel/bluetooth: command not found". Kui ette panna kdesudo, tuleb veateateks: "sudo: if: command not found". Ka "fi" ärajätmine ei näi midagi muutvat :/

_________________
"Sleep, she is for the weak."

johnsmith
Vana Pingviin
Vana Pingviin


Vanus: 50
Liitunud: 24.07.2006
Postitused: 714
Asukoht: Universum
Distributsioon: Ubuntu/Gentoo/FreeBSD
finland.gif
postituspostitatud: 07.03.2008, 23:38  postituse pealkiri:  (teema puudub)  

Teeb jah proovisin järgi Smile

Aga tegelikult sul on loogika vale seal ja ilmselt ka sellepärast se sudoga ei õnnestu. Bash on lõdva süntaksiga skriptikeel mis annab niimõnegi loogikavea andeks ja ilmselt sellepärast ta muudabki seda faili. Kui ta ütleb, et "command not found" siis ta järelikult ei saa aru süntaksist. Kuna nüüd annad sa selle testi sudo programmile parameetriks ja tema enam sellest aru ei saa.

Kui sa testid mingit asja ja see on tõsi siis sa sooritad mingid käsud
if(test)
//if testi laused algavad
{
//kui test on vale siis seda lauset ei sooritata
tee midagi kui if test on tõene;
//if testi laused lõpevad
}
// ei saa ju seda lauset panna siia
tee midagi kui if test on tõene;
//kuna see lause sooritatakse igal juhul ükskõik mis if test oli

Ma ei pretendeeri küll mingi bashi guru tiitlile aga niimoodi saan mina asjast aru kui keegi oskajam tahab seda lahti seletada siis ta võiks seda teha.

Kui sa fi ära jätad siis sudo ei tea millal testi laused lõpevad
Ainuke muutus mis võib selle sinu versiooni tööle panna oleks minu meelest selline
Kood:

$ if [ `cat /sys/devices/platform/asus-laptop/bluetooth` -eq 1 ]; then echo 0; else echo 1;  > /home/mihkel/bluetooth fi

Kuna ma eeldan, et bash lihtsalt ignoreerib semikooloneid mis tähendavad lause lõppu programmeerimis keeltes. Kui bash loeks ka semikooloneid siis antud laused oleksid absurdsed. Antud juhul lihtsalt ta parsib välja then ja elsi ning sooritab käsud vastavalt then või else järel. Aga ka siis sooritatakse echo 1 > faili ja isegi kui if test on tõsi faili ei kirjutata 0 vaid sinna jääb endiselt 1. See ei ole enam süntaksi error vaid loogiline error.

_________________
"Thinking is the hardest work there is, which is probably the reason why so few engage in it" - Henry Ford

wk
Vana Pingviin
Vana Pingviin



Liitunud: 24.10.2007
Postitused: 1133
Asukoht: Tallinn, vahel Vastseliina vald
Distributsioon: Debian, Kubuntu
estonia.gif
postituspostitatud: 10.03.2008, 11:58  postituse pealkiri:  (teema puudub)  

Tsitaat:
Kui see ei õnnestu siis võimalik kirjutada C keeles väike proge millele anda setuid ja mis käivitab siis selle skripti, see on jälle rohkem sääsest elevandi tegemine.

Miks setuidiks on vaja C-keelt?

_________________
Kõike hääd,
WK

johnsmith
Vana Pingviin
Vana Pingviin


Vanus: 50
Liitunud: 24.07.2006
Postitused: 714
Asukoht: Universum
Distributsioon: Ubuntu/Gentoo/FreeBSD
finland.gif
postituspostitatud: 10.03.2008, 14:35  postituse pealkiri:  (teema puudub)  

wk kirjutas:
Tsitaat:
Kui see ei õnnestu siis võimalik kirjutada C keeles väike proge millele anda setuid ja mis käivitab siis selle skripti, see on jälle rohkem sääsest elevandi tegemine.

Miks setuidiks on vaja C-keelt?


Küsid lihtsalt uudishimust või on sul mingi alternatiivne lahendus ?

Ei tea, C keele librades on seteuid() funktsioon millega saab võtta ja loobuda teist uid -d. Sama asi on ju näiteks passwd utiliidis, kasutaja käivitab programmi ning see kirjutab /etc/shadow faili uue rea kuhu muidu võib ainult root kirjutada.

Kui lambist anda mingile skriptile näiteks chmod chmod 6755 ma ei kujuta ette kas see siis töötaks. Kuidas see skript siis teab millal muutuda juureks ?

_________________
"Thinking is the hardest work there is, which is probably the reason why so few engage in it" - Henry Ford

wk
Vana Pingviin
Vana Pingviin



Liitunud: 24.10.2007
Postitused: 1133
Asukoht: Tallinn, vahel Vastseliina vald
Distributsioon: Debian, Kubuntu
estonia.gif
postituspostitatud: 10.03.2008, 21:21  postituse pealkiri:  (teema puudub)  

Ei ole lahendust, mul oli lihtsalt meelest läinud, et interpreteeritavale skriptile ei piisa reeglina suid/guid-ist failisüsteemi tasemel. Kuna ma ise kirjutasin teiste õigustes käivad skriptid perlis, siis mõtlesin, et saab ka bashis. Aga perlis on sellejaoks eraldi interpretaator -- suidperl.

Aga setuidi ja setgidi idee on sellest, et nad võimaldavad jooksutada programme käivitajast erinevate õigustega ning see on lahendatud failisüsteemi tasemel antud õigustest lähtuvalt. Ilmselt on need C-funktsioonid vajalikud, kui on vaja peenemalt reguleerida õiguseid eri programmi funktsioonides. Nii et ses mõttes peaks iga binaar toimima.

_________________
Kõike hääd,
WK

leio
Pingviini aktivist
Pingviini aktivist


Vanus: 40
Liitunud: 31.07.2007
Postitused: 126
Asukoht: Tallinn
Distributsioon: Gentoo Linux
estonia.gif
postituspostitatud: 13.03.2008, 03:54  postituse pealkiri:  (teema puudub)  

Paneks näiteks sulud ümber ettepoole, ehk aitab. Siis saab nii 0 kui 1 echo puhul asi suunatud kenasti kuhu vaja mu meelest. Ignoreerides kõige muid võimalikke vigu millese ma hetkel ei süvene (kui neid üldse on), näiteks nii:

Kood:
$ (if [ `cat /sys/devices/platform/asus-laptop/bluetooth` -eq 1 ]; then echo 0; else echo 1; fi) > /home/mihkel/bluetooth

Kuigi nagu tunduks, et saaks lihtsalt loogilise eituse tagasi echo'da ja mingid "-eq" värki pole ehk vaja?

setuid koha pealt - linuxil on õiguste süsteem. Tavaliste õigustegagi (mitte ACL advanced võimalused) võimalik lihtsalt anda faili omaniku õigustega käivitusõigused. Selle jaoks on setuid bitt faili õigustes. Kui antud skripti omanik on root ja failid on setuid õigus peal (chmod u+s <fail>) siis töötab ta root õigustega käimapannes. See võib küll üks hea turvaauk olla kui valesti kasutada, nii et tuleb ettevaatlik olla.

_________________
Gentoo Linux arendaja -- GNOME ja GStreamer - http://www.gentoo.org/

Näita (aja järgi):      
Postita uus teemaVasta teemale


Vaata järgmist teemat
Vaata eelmist teemat
Powered by phpBB2 Plus based on phpBB © 2001/7 phpBB Group