[ salec @ 02.06.2005. 08:58 ] @
Hocu da konfigurisem Konsole da mi automatski otvara novi session sa pokrenutim telnetom koji se odmah i loguje na target masinu (treba mi tipicno jedno 3-6 telnet komandnih linija po svakoj seansi, a bas bih rado izbegao da svaki put ponavljam logovanje) .

Konsole dozvoljava da kreiras novi tip sesije pod imenom koji joj das, s tim da mozes da specificiras komandnu liniju koja ce da se izvrsi tom prilikom. Tako je moj prvi pokusaj izgledao ovako:
Code:
[[email protected] user]$ telnet -l root  192.180.1.101 

posle cega preostaje "samo" da odgovorim na "Password:" prompt. Medjutim, hteo bih i to da izbegnem i da dobijem root prompt na udaljenoj masini "na dugme" ( e, da ... lenjost! ).


Najblize sto sam isceprkao Googlovanjem (drugi su pre mene cesto postavljali isto pitanje) je:
Code:
[[email protected] user]$ { sleep 1; echo password; sleep 1; } | telnet -l root  192.180.1.101


Drugi cesti odgovori su bili "ne radi to, to je glupo jer je opasno", "koristi expect" ili neki GUI multiterminal.


Ovo gore ne radi posao jer posto se izvrse sve komande na levoj strani pajpa, telnetu bude prosledjen EOF i ovaj lepo vrati kontrolu bash-u ("Connection closed by foreign host."). Ovo je mozda nacin da se automatski urade neke fiksne stvari na udaljenoj masini, da se pojedinacna komanda ili grupa komandi izvrse, a zatim zatvori konekcija, ali za trajni prompt ne pomaze.
npr.:
Code:
[[email protected] user]$ { sleep 1; echo password; sleep 1; echo ps -A; sleep 2; } | telnet -l root  192.180.1.101
ce izlistati sve aktivne procese na targetu, a zatim ce se odmah "otkaciti" od njega.


Cini mi se da je ovaj problem interesantan (ako se generalizuje) i resenje bi imalo potencijalno vecu primenu u scriptingu od prostog zaobilazenja logina: generalno kako izlaz vise procesa konkurentno vezati na ulaz jednog procesa (i/ili mozda kako izbeci da pojedinacni proces koji generise ulaz prosledi EOF)?


I obrnuto: kako izlaz jednog procesa (ili grupe procesa) "racvati" odnosno proslediti kopije na ulaze vise procesa, sto bi bilo interesantno za na primer prevodioce, parsere i slicno, odnosno omogucilo bi da graf izvrsavanja slozene obrade bude ... proizvoljno razgranat, mozda cak i ciklican.

Prosto mi je neverovatno da je ovako nesto bilo nepotrebno od nastanka Unixa do danas (da nije neko patentirao fork i join za strimove ili za skriptove pa nisu smeli da ih implementiraju? ).

Posto sam se nalupao kao nikad, ako neko zna da li ovo sto trazim sve vreme postoji u bash-u, molim vas da me uputite na info.
[ Vanja Petreski @ 02.06.2005. 09:46 ] @
E sad samo jedno pitanje: da li su svih 3-6 target-a ustvari samo jedna mašina?

Ako je to tako (a verovatno jeste) zar ti ne bi bilo lakše da koristiš screen umesto da se patiš sa tim?

Onda samo jednom imaš telnetovanje.
[ random @ 02.06.2005. 10:09 ] @
Prvo i pod jedan: zar nije lakše (i kudikamo elegantnije) za "one-click login" da koristiš rsh ili ssh sa host-based autentifikacijom (ili putem javnog ključa u slučaju ssh-a) umesto da se petljaš sa glupavim telnetom?

A što se tiče ove tvoje ideje, jel si probao nešto tipa

$ ( sleep 1; echo password; sleep 1; cat ) | telnet -l root 192.180.1.101


Nemam telnet ovde, ali to je prvo što mi pada na pamet. Eventualno ćeš možda morati da se osiguraš da će ti telnet login startovati interaktivni shell odakle god da dolazi input (*sh -i).

A što se pitanja tiče, odgovor na prvo (i na pitanje iz naslova) bi možda bio named pipe, a na drugo opet neka mutljavina sa nejmd pajpom i eventualno tee(1).

Videću kasnije da ti odgovorim detaljnije.
[ salec @ 02.06.2005. 10:32 ] @
@Vanja: U ovom slucaju jesu. Da li screen mora da se pokrene na targetu?

@random: target je embedded, non-x86. Iz nekog razloga (stednja Flash-a ?) nema gomilu stvari, pa ni ssh...

na grupu komandi koja se zavrsi sa 'cat', ispise "cat: -: Resource temporarily unavailable" (ocigledno, to mi vraca targetov bash), a zatim ugine ("Connection closed by foreign host.")

Ovo ostalo te nisam razumeo...

" *sh -i " je npr. " bash -i " ?

man za tee kaze da vrsi redirekciju sa stdin na stdout plus kopiranje u fajlove cija imena su navedena kao parametri. Lici kao da mu je namena da pamti sesije u nekim zurnnalima. Da li umesto imena fajlova mogu da se stave imena komandi?


[Ovu poruku je menjao salec dana 02.06.2005. u 11:59 GMT+1]
[ Vanja Petreski @ 02.06.2005. 10:45 ] @
Da.

screen - otvara ti novi screen
CTRL+A+C - otvara ti novi prozor u screen-u
CTRL+A+N - setas se kroz prozore u screen-u
CTRL+A+D - detache-ujes screen (on ostaje da radi)
screen -r - resume screen-a
CTRL+D - unistavas prozor u screen-u

Ovo je dobra stvarcica ako imas zilion prozora pa se lako setas ili ako administriras neku remote masinu pa je pustis u screen-u nesto da radi i onda se detache-ujes, ona nastavi da radi, a zatim kad se vratis ti uradis resume i vidis sta se desava ...
Interesantno je da mozemo, na primer, obojica da se zakacimo na isti screen ;)
[ salec @ 02.06.2005. 11:41 ] @
OK, to je super, narocito mi se svidja ideja da terminal ostaje u pozadini i mogu da se naknadno zakacim, odnosno da ga "izvucem" napred, samo mi nije bas zgodno da dodajem jos jednu aplikaciju na embedded sistem (ipak sam poprilicno pocetnik za ovo, neko drugi odlucuje o tome sta ide a sta ne), najradije bih izvukao koliko mogu iz najosnovnijih (ne najosnovnijih, od minimuma!) stvari koje imam na raspolaganju.
[ Vanja Petreski @ 02.06.2005. 12:27 ] @
Pa dobro, onda se igraj tako :o) Ako ne uspes, uvek mozes da probas da kompajliras screen lokalno, a onda probas tu binarnu verziju da pokrenes remote. Mozda i uspe ;)
[ random @ 02.06.2005. 13:37 ] @
Citat:
salec:
Ovo ostalo te nisam razumeo...

" *sh -i " je npr. " bash -i " ?


Da. Vidiš da si razumeo :o).

Citat:

man za tee kaze da vrsi redirekciju sa stdin na stdout plus kopiranje u fajlove cija imena su navedena kao parametri. Lici kao da mu je namena da pamti sesije u nekim zurnnalima. Da li umesto imena fajlova mogu da se stave imena komandi?


Ne, naravno. Ali mogu da se stave named pipe-ovi.

Da probam da generalizujem ono što si hteo da pitaš. Nazvaću komandu koja daje output davalac, a komandu koja prima input primalac. Želiš, znači, da n procesa piše u jedan pajp, i obrnuto, da jedan proces piše u n pajpova. U primerima ćemo staviti n == 3, radi jednostavnosti (a bez smanjenja opštosti ;o)).

Citat:
generalno kako izlaz vise procesa konkurentno vezati na ulaz jednog procesa (i/ili mozda kako izbeci da pojedinacni proces koji generise ulaz prosledi EOF)?


Sekvencijalno:

Code:
( davalac1; davalac2; davalac3 ) | primalac


Vrši se konkatenacija outputa sva tri procesa u jedan pajp. Poslednji EOF zatvara pajp.

Asinhrono1:

Code:
mkfifo /tmp/nejmdpajp
davalac1 > /tmp/nejmdpajp &
davalac2 > /tmp/nejmdpajp &
davalac3 > /tmp/nejmdpajp &
primalac < /tmp/nejmdpajp


EOF stiže2 tek kada svi procesi (davaoci) završe sa radom. Moguće je i da jedan davalac bude ulaz terminala, pri čemu se primalac izvršava u pozadini3:

Code:
mkfifo /tmp/nejmdpajp
davalac1 > /tmp/nejmdpajp &
davalac2 > /tmp/nejmdpajp &
primalac < /tmp/nejmdpajp &
cat > /tmp/nejmdpajp


Citat:
I obrnuto: kako izlaz jednog procesa (ili grupe procesa) "racvati" odnosno proslediti kopije na ulaze vise procesa, sto bi bilo interesantno za na primer prevodioce, parsere i slicno, odnosno omogucilo bi da graf izvrsavanja slozene obrade bude ... proizvoljno razgranat, mozda cak i ciklican.


Code:
for i in `seq 1 3`; do mkfifo /tmp/nejmdpajp${i}; done
davalac | tee /tmp/nejmdpajp1 | tee /tmp/nejmdpajp2 > /tmp/nejmdpajp3
primalac1 < /tmp/nejmdpajp1 &
primalac2 < /tmp/nejmdpajp2 &
primalac3 < /tmp/nejmdpajp3 &
wait


Slično i ovde može da se izvede da davalac bude ulaz sa tastature

Code:
for i in `seq 1 3`; do mkfifo /tmp/nejmdpajp${i}; done
primalac1 < /tmp/nejmdpajp1 &
primalac2 < /tmp/nejmdpajp2 &
primalac3 < /tmp/nejmdpajp3 &
cat | tee /tmp/nejmdpajp1 | tee /tmp/nejmdpajp2 > /tmp/nejmdpajp3


Sve je to lepo i krasno kada su primaoci i davaoci klasični Unix programi koji čitaju stdin, pišu stdout, i dozvoljavaju redirekciju. Međutim telnet je malo baksuzna aplikacija (sad sam ga instalirao i igrao se malo), izgleda da ne voli da se izvršava u pozadini, a takođe iz nekog razloga "otima" stdin terminala (zbog toga se cat žali da ne može da čita stdin (resource temporarily unavailable)), a ipak čeka (?) na podatke iz pajpa.


____________
1 U stručnoj terminologiji se ovo naziva "žurka traje, ritam daje".
2 Mome selu bliže.
3 Primetili ste već da ove fusnote nemaju neku smislenu svrhu osim da vas zamajavaju, zar ne?
[ salec @ 02.06.2005. 14:58 ] @
Citat:
random: Međutim telnet je malo baksuzna aplikacija (sad sam ga instalirao i igrao se malo), izgleda da ne voli da se izvršava u pozadini, a takođe iz nekog razloga "otima" stdin terminala (zbog toga se cat žali da ne može da čita stdin (resource temporarily unavailable)), a ipak čeka (?) na podatke iz pajpa.

Ahhh, security thru incompatibility ... :-) iliti (glas petla Sofronija:) "ne moze tako, a i ovaj, sta ce to uopste tebi, sinko, a?".

Uspeo sam da ipak pribavim stdin, tako sto sam na kraju dodao bash | cat , ali to je imalo nepredvidjene posledice:
Code:
[[email protected] user]$ { sleep 1; echo password; sleep 1; bash | cat } | telnet -l root  192.180.1.101

Posledice su bile da remote bash daje prompt, a "domaci" izvrsava komande, s tim da odziv komande (izvrsene u lokalnom bash-u) ide na ulaz remote bashu, koji onda jadan pokusava nesto od toga (i vraca "command not found"). Kreativno ubacivanje "echo" na razna mesta i kombinacije echo, bash i cat nije urodilo plodom (ili odmah padne ili nema odziva posto jednom ili dvaput ispise prompt), ali mi se cini da odgovor lezi tu negde...
[ random @ 04.06.2005. 16:54 ] @
Sve je to lepo i krasno, ali potpuno beskorisno, i sve dok god nabadaš slepo umesto da mućneš glavom, nigde nećeš stići.

Evo ti još jedan predlog, probaj da uputiš cat da "srče" stdin direktno sa tty device-a.

$ { sleep 1; echo password; sleep 1; cat < `tty` } | telnet -l root 192.180.1.101


Ako nemaš komandu tty, možeš nekako drugačije da dođeš do svog stdin-a... Recimo preko procfs-a...

$ { sleep 1; echo password; sleep 1; cat < /proc/$$/fd/0 } | telnet -l root 192.180.1.101


Ili na neki drugi način (who am i | cut -c 10-22, itd., doseti se sam!).

Ovo će da radi, sa tim što će ti sve što ukucaš biti ponovljeno na stdout. Takođe, na svaki program koji zahteva nešto više od "dumb" terminala možeš da zaboraviš (naravno).

P.S. Da se osvrnem na tvoj komentar iz prve poruke, sve što si kukao da ne može zapravo može (pokazao sam ti gore kako), ali i treba koristiti pravi alat. U ovom slučaju moram da branim Unix, jer nije on kriv, nego nedostatak znanja u korisnika. Ubaci samo rsh umesto telneta u taj embedded sistem i sve će da ti radi savršeno.
[ random @ 22.06.2005. 01:40 ] @
http://osnews.com/story.php?news_id=10929
[ Vladimir P. Filipovic @ 27.06.2005. 13:02 ] @
cat imefajla -


ce baciti na stdout sadrzaj fajla i onda nastaviti sa onim sto dobija na stdin, bez umetanja EOF-a. Ako to preusmeris,

cat fajl_s_mojom_sifrom - | telnet -l root 192.180.1.101


gde naravno taj fajl sadrzi jedan \n posle sifre, trebalo bi da prodje.

[Ovu poruku je menjao Vladimir P. Filipovic dana 27.06.2005. u 14:07 GMT+1]
[ random @ 27.06.2005. 13:15 ] @
Neće proći, to je samo varijacija na ono već predlagano ( sleep 1; echo password; sleep 1; cat ), i biće potpuno isto kao i tamo, prijaviće "Resource temporarily unavailable".

[Ovu poruku je menjao random dana 27.06.2005. u 14:16 GMT+1]
[ Vladimir P. Filipovic @ 27.06.2005. 13:56 ] @
Hmm, u pravu si

Pokusao sam samo da eliminisem umetanje EOF-a posle echo-a ili cat-a, sto ovo sigurno stvarno radi, ali ne resava ostatak problema.
[ random @ 27.06.2005. 15:26 ] @
Vidim šta si pokušao, ali to smo apsolvirali još u startu. Pročitaj pažljivo celu temu.