Mitírki bash feladvány

ÁÁÁÁ! Pedig nem vagyok kezdő shell scriptekben, de most jót szívtam vele, mire rájöttem, hogy mit nézek el. Egy távoli gépen egy nagy sed regexp kifejezéssel akartam egy fájl tartalmát átírni Persze nem akart sikerülni.


ssh pubkeysudoer@remotebox sudo bash -c "sed 's/a konkrét regexp/lényegtelen, a lényeg, hogy ronda és hosszú/g' < input > output"

Erre mit kapok:


output: Permission denied

Végül sikerült ennyire lecsupaszítanom a példát, próbáltam háromféle idézőjelezéssel is:


ssh pubkeysudoer@remotebox sudo bash -c "whoami; whoami"
ssh pubkeysudoer@remotebox sudo "bash -c whoami; whoami"
ssh pubkeysudoer@remotebox "sudo bash -c whoami; whoami"

Az eredmény mindhárom esetben ugyanaz:


root
pubkeysudoer

A harmadik esetben még érthető, de mégis miért veszti el a root jogosultságot az első kettőben?

A választ persze már tudom, azt is, hogy miért, illetve, hogy hogyan lehet elérni, hogy mindkét parancs root joggal fusson, ezáltal az eredeti fájlba írás is sikerüljön, de mivel ez egy kifejezetten gonosz fajta "mitírki" típusú példa ezért gondoltam megosztom veletek. :)

Kiváncsi vagyok kinek sikerült kiszúrnia. A profik kérem ne lőjék le a poént túl hamar, hadd gondolkodjanak rajta a többiek is.

Hozzászólások

ssh -p 443 nyos@nyos "sudo bash -c 'whoami; whoami'"
root
root

nyos@nyos:~$ ssh -p 443 nyos@nyos "sudo bash -c \"sed </var/log/nyosweb -e 's/ezt/erre/g' >/bin/ide_csak_root_irhat\""
nyos@nyos:~$ la /bin/ide_csak_root_irhat
-rw-r--r-- 1 root 567279 2009-09-21 23:44 /bin/ide_csak_root_irhat

(van par olyan program, ami szereti, ha 1 parametere van..)

szerk: lt, gt javitva..
--
Always program as if the person who will be maintaining your program is a violent psychopath that knows where you live. - Cotillion, TDWTF

Hmm végülis igaz, tkp majdhogynem helyes megfejtés, a whoami-ra jó is. Csak a sed nem szereti, hogy a teljes parancs '-be van rakva, mert a regexp-jét is abba kell rakni. Így a túloldali gépen lévő shell csak a 'sed'-et fogja '-ek között látni, illetve, a regexp utáni szakaszt, regexp pedig teljesen szabadon lesz. A lényeg, hogy ha a sed-et csinálom, akkor úgy tapasztaltam, hogy csak \"-es módszer működik, mert a túloldali shellnek kell az, hogy el tudja távolítani az '"-eket a shell regexp paramétere körülről. De tény, hogy nem próbáltam ki az összes ' " megvédési trükköt, tehát lehet, hogy van más megoldás is rá.

A magyarázat pedig az, hogy már az ssh-t hívó kliensoldali shell leírtja az első "réteg" idézőjelet, így teljesen mindegy, hogy hova rakom, a távoli gépre átmenő stringben már sehol sem lesz ott.
---
Internet Memetikai Tanszék

Ez nem igazan bash-only dolog.
Problemasabb esetben joval simabb megoldas a remote oldalra feltolni egy scriptet,es azt remote futtatni (persze kerdes, hogy hany hoston kell ugyanazt vegrehajtani).

Hát most már így találtam ki a szisztémát, valahogy nekem így szimpatikusabb, ha nem kell scp-zgetni előtte. Ezenkívül eléggé elkezdett már rájárni a kezem, hogy mindent így csináljak parancssorból kézzel is. Tulajdonképpen interaktívan alig lépek be a gépekre. Persze azt kell hozzá tudni, hogy 28 gép van egyforma konfiggal, ha kell csinálni valamit, akkor mindegyiken kell.
---
Internet Memetikai Tanszék