Autor |
Sõnum |
v6lur
Vana Pingviin
Vanus: 37
Liitunud: 08.07.2005
Postitused: 667
Asukoht: Kopenhaagen/Tartu
Distributsioon: Arch
|
|
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 )
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
Vanus: 50
Liitunud: 24.07.2006
Postitused: 714
Asukoht: Universum
Distributsioon: Ubuntu/Gentoo/FreeBSD
|
|
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
Vanus: 37
Liitunud: 08.07.2005
Postitused: 667
Asukoht: Kopenhaagen/Tartu
Distributsioon: Arch
|
|
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... (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
Vanus: 50
Liitunud: 24.07.2006
Postitused: 714
Asukoht: Universum
Distributsioon: Ubuntu/Gentoo/FreeBSD
|
|
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
Vanus: 37
Liitunud: 08.07.2005
Postitused: 667
Asukoht: Kopenhaagen/Tartu
Distributsioon: Arch
|
|
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
Vanus: 50
Liitunud: 24.07.2006
Postitused: 714
Asukoht: Universum
Distributsioon: Ubuntu/Gentoo/FreeBSD
|
|
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
|
|
|
|
_________________ "Thinking is the hardest work there is, which is probably the reason why so few engage in it" - Henry Ford
|
|
|
|
v6lur
Vana Pingviin
Vanus: 37
Liitunud: 08.07.2005
Postitused: 667
Asukoht: Kopenhaagen/Tartu
Distributsioon: Arch
|
|
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
Vanus: 50
Liitunud: 24.07.2006
Postitused: 714
Asukoht: Universum
Distributsioon: Ubuntu/Gentoo/FreeBSD
|
|
Teeb jah proovisin järgi
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
Liitunud: 24.10.2007
Postitused: 1133
Asukoht: Tallinn, vahel Vastseliina vald
Distributsioon: Debian, Kubuntu
|
|
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
Vanus: 50
Liitunud: 24.07.2006
Postitused: 714
Asukoht: Universum
Distributsioon: Ubuntu/Gentoo/FreeBSD
|
|
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
Liitunud: 24.10.2007
Postitused: 1133
Asukoht: Tallinn, vahel Vastseliina vald
Distributsioon: Debian, Kubuntu
|
|
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
Vanus: 40
Liitunud: 31.07.2007
Postitused: 126
Asukoht: Tallinn
Distributsioon: Gentoo Linux
|
|
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/
|
|
|
|
|