Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2012-05-02 19:46:12

  torpeda80 - Użytkownik

torpeda80
Użytkownik
Zarejestrowany: 2007-03-28

[+] skrypt terminal-wget

Witam
Mam pytanie jak można zrobić skrypt (czy jest to w ogóle możliwe)  który odpali mi np od 1 do 5 terminali (petla for) i uruchomi w nich program wget który pobierze z pliku zewnętrznego o nazwie np lista.txt 5 adresów stron internetowych (znajdujących się w tym pliku) i odpali je osobno w odpowiadających mu otwartych 5 terminalach.

Nie wiem za bardzo czy jest możliwości odpalenie terminala z opcją odpalenia wget?

początek bym zaczął tak:

Kod:

#!/bin/bash
a=roxterm;
b=wget --recursive --server-response <lista.txt;
for a in ' seq 1 5';
do a;
for b in' seq 1 5';  
do b;
done;
done;

Tylko, że mi tak na prawdę nie łączy wgeta z terminalami. Proszę ewentualnie o pomoc albo wskazówkę gdzie szukać.

Ostatnio edytowany przez torpeda80 (2012-05-04 19:49:41)

Offline

 

#2  2012-05-02 20:40:00

  kondziu jah - Użytkownik

kondziu jah
Użytkownik
Skąd: Zgorzelec
Zarejestrowany: 2011-05-04

Re: [+] skrypt terminal-wget

Kod:

lista=$(cat ~/pirackie_programy/linki.txt)
for adres in lista
do
nazwa_terminala -e wget [opcje] adres
done

Sprawdź manual swojego terminala - zazwyczaj otwiera się nowe okno opcją '-e'.

Jeśli lista jest dłuższa niż 5 pozycji, to można ograniczyć terminale/wgety do wymaganych 5, np. tak:

Kod:

licznik=0
lista=$(cat ~/pirackie_programy/linki.txt)
until [ "$licznik" = "5" ]
do
for adres in lista
do
nazwa_terminala -e wget [opcje] adres
licznik=$(licznik+1)
done
done

Ostatnio edytowany przez kondziu jah (2012-05-02 20:47:51)


[center][url=http://adf.ly/Y8HMh]Dropbox: 500MB gratis[/url]
[url=http://adf.ly/?id=5385762]AdFly - zarabiaj na linkach[/url]
[url=http://adf.ly/YIOh1]UIQ3 is not dead![/url]
[url=http://eu.worldofwarplanes.com][img]https://dl.dropbox.com/u/21323278/wowpalphabareng.png[/img][/url][/center]

Offline

 

#3  2012-05-03 16:38:39

  dominbik - Członek DUG

dominbik
Członek DUG
Zarejestrowany: 2011-07-25

Re: [+] skrypt terminal-wget

[quote=torpeda80]Nie wiem za bardzo czy jest możliwości odpalenie terminala z opcją odpalenia wget?[/quote]
jak już wyżej kolega napisał. przełącznik -e


[img]http://img34.imageshack.us/img34/5092/zw9m.png[/img] [img]http://img29.imageshack.us/img29/219/pibw.png[/img]

Offline

 

#4  2012-05-03 17:08:34

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Brno, Česko
Zarejestrowany: 2007-12-22
Serwis

Re: [+] skrypt terminal-wget

[quote=torpeda80]Witam
Mam pytanie jak można zrobić skrypt (czy jest to w ogóle możliwe)  który odpali mi np od 1 do 5 terminali (petla for) i uruchomi w nich program wget który pobierze z pliku zewnętrznego o nazwie np lista.txt 5 adresów stron internetowych (znajdujących się w tym pliku) i odpali je osobno w odpowiadających mu otwartych 5 terminalach.[/quote]
Czekaj.

Po pierwsze, każdy terminal ma pobrać swój plik lista.txt zawierający 5 adresów, czy jest jeden plik lista.txt z którego każdy z 5 terminali ma wziąć jeden adres? Bo w pierwszym przypadku mówimy o 25 plikach, w drugim — o 5. Różnica dość znaczna.

Po drugie, Ty chcesz te 2?5 stron otworzyć w różnych terminalach, czy chcesz 2?5 plików pobrać na dysk?
Bo w tym drugim przypadku właściwie nie potrzeba Ci żadnego emulatora terminala, ale dla wygody możesz skorzystać z jednego. Więcej nie jest w żadnym razie potrzebne.


Spinnen Essen: [url=http://fluxboxpl.org/portal/]FluxboxPL[/url] [url=http://przepis-na-lo.pl/]Przepis na LibreOffice[/url]

Offline

 

#5  2012-05-04 00:13:11

  torpeda80 - Użytkownik

torpeda80
Użytkownik
Zarejestrowany: 2007-03-28

Re: [+] skrypt terminal-wget

Chodziło mi o to aby każdy terminal pobrał jeden adres do siebie i zaczął pobierać stronę na dysk. kazdy terminal pobiera oddzielnie jeden inny adres strony.
Dodotkowo przy opcji:

Kod:

licznik=0
lista=$(cat ~/stronyv0.txt)
until [ "$licznik" = "5" ]
do
for adres in lista
do
roxterm -e wget -recursive --serwer-response adres
licznik=$(licznik+1)
done
done

otrzymuje komunikat

Kod:

./www2.sh: line 11: licznik+1: nie znaleziono polecenia

Jak zmienie na licznik++ to też ten sam komunikat.

Ostatnio edytowany przez torpeda80 (2012-05-04 00:27:26)

Offline

 

#6  2012-05-04 00:46:56

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Brno, Česko
Zarejestrowany: 2007-12-22
Serwis

Re: [+] skrypt terminal-wget

[quote=torpeda80]Chodziło mi o to aby każdy terminal pobrał jeden adres do siebie i zaczął pobierać stronę na dysk. kazdy terminal pobiera oddzielnie jeden inny adres strony.[/quote]
OK.

Po co Ci te emulatory terminala? Chcesz pobrać X plików z X różnych stron. Zrobisz to wywołując wgeta w pętli. wget domyślnie kontynuuje pobieranie w przypadku kłopotów z łączem (zobacz dokumentację parametru [tt]--tries[/tt] i szereg opcji [tt]--timeout[/tt] — domyślne ustawienia są dość wysokie). Wyjście możesz przekierować do pliku przy pomocy opcji [tt]-o[/tt] (małe o — wielkie służy do czegoś innego).

Przypuszczam, że terminale są Ci potrzebne po to, aby móc równolegle pobierać te pliki, które pewnie są dość duże (chociaż o ile problemem nie prędkość wysyłania po stronie serwera, to nie ma większej różnicy między uruchamianiem wgetów równolegle a po kolei). Normalnie mógłbyś wgeta wysłać w tło przy pomocy & (tzw. etka, ampersand), ale akurat wget jest tak miły, że sam potrafi się sforkować przy pomocy przełącznika [tt]-b[/tt].

A może chcesz móc śledzić postęp pobierania tych równolegle pobieranych plików? Możesz to robić przy pomocy tail z przełącznikiem [tt]-f[/tt]. Możesz również skorzystać z programu [deb]multitail[/deb] albo uruchamiać kolejne wgety w osobnych oknach jednej sesji [deb]screen[/deb]a, pomiędzy którymi będziesz się przełączał.

W każdym wypadku możesz chcieć zrobić jakąś pomocniczą funkcję, która będzie śledziła zachowanie wgeta i w przypadku nieudanego pobierania wyśle Ci e-maila, zostawi gdzieś jakiś plik, zapisze coś do sysloga, wyśle powiadomienie (notify-send z pakietu [deb]libnotify-bin[/deb]), pokaże okienko (np. zenity, kdialog, xmessage) czy zrobi cokolwiek innego.

Szczerze mówiąc, nie potrafię sobie wyobrazić dlaczego mógłbyś chcieć otwierać osobne okno emulatora terminala dla każdego wgeta.

[quote=torpeda80]

Kod:

licznik=0
lista=$(cat ~/stronyv0.txt)
until [ "$licznik" = "5" ]
do
for adres in lista
do
roxterm -e wget -recursive --serwer-response adres
licznik=$(licznik+1)
done
done

otrzymuje komunikat
./www2.sh: line 11: licznik+1: nie znaleziono polecenia[/quote]
Zapomniałeś w argumencie wgeta poprzedzić „adres” znakiem dolara.
Niby mógłbym napisać, że rozwiązaniem Twojego problemu jest [tt]let[/tt] ([tt]let licznik+=1[/tt]), ale wolę pokazać, jak zrobić to dobrze:

Kod:

while read adres; do
   wgety -b "$adres"
done < ~/stronyv0.txt

Spinnen Essen: [url=http://fluxboxpl.org/portal/]FluxboxPL[/url] [url=http://przepis-na-lo.pl/]Przepis na LibreOffice[/url]

Offline

 

#7  2012-05-04 01:24:44

  torpeda80 - Użytkownik

torpeda80
Użytkownik
Zarejestrowany: 2007-03-28

Re: [+] skrypt terminal-wget

Dzięĸuję jestem pełen podziwu. Działą bezbłędnie. Chciałem otworzyć wgety w osobnych terminalach aby moc przeglądać postęp ściagania stron ale widzę, że było to zbyteczne (dziękuję za przetarcie oczu :-)).
Jeżeli mogę jeszcze prosić o małe wyjaśnienie aby w pełni zrozumieć zapis tego skryptu.

Do póki czyta adresy stron z pliku ~/stronyv0.txt ma wykonywać wgety odnosząć się do adresu?
Ale skąd on wie, że adres to jest jeden wiersz z pliku stronyv0.txt?

Offline

 

#8  2012-05-04 12:31:22

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Brno, Česko
Zarejestrowany: 2007-12-22
Serwis

Re: [+] skrypt terminal-wget

Konstrukcja

Kod:

while read nazwa_zmiennej; do ; done < /plik/wejściowy

Czyta /plik/wejściowy linia po linii i przy każdej iteracji przyporządkowuje odczytane dane do zmiennej nazwa_zmiennej. Zazwyczaj pisze się:

Kod:

while read line

co jasno wskazuje, że czytamy linia po linii, ale w tym wypadku wiemy, że /plik/wejściowy zawiera adresy stron internetowych (i tylko te adresy), więc dla czytelności możemy zmienną nazwać adres.

A tak swoją drogą — z tego co widzę, pobierasz całe strony na dysk. Być może nie znasz programu [deb]httrack[/deb], który właśnie do tego służy, a który może uznasz za lepiej odpowiadający Twoim potrzebom niż wget.

Ale wracając do pętli — chyba że pytasz o to, skąd ona wie, że ma przeczytać właśnie jedną linię, a nie np. jej część. Szczerze? Nie mam większego pojęcia. Na pewno ma to coś wspólnego ze zmienną $IFS, której zawartość powłoka wykorzystuje przy odczytywaniu poleceń (oddzielaniu komend od siebie, opcji od komend, argumentów od opcji itd.). Jakoś nigdy nie wnikałem szczegółowo w ten mechanizm. Przyjmuję jako pewnik, że tak po prostu działa polecenie read.

Swoją drogą, warto wiedzieć, że read może przyjmować jako argument więcej niż jedną zmienną. Dzięki temu zamiast męczyć się cutem czy awk, można wykorzystać samą powłokę. Taki szkolny przykład:

Kod:

$ cat /tmp/passwd.sh 
#!/bin/sh
IFS=":"
while read userlogin password userid groupid username homedir loginshell; do
        if [ "$userid" -ge 1000 ]; then
                echo "Użytkownik ${userlogin} (${userid}) mieszka w ${homedir} i loguje się przy pomocy ${loginshell}"
        fi
done < /etc/passwd
$ /tmp/passwd.sh 
Użytkownik nobody (65534) mieszka w /nonexistent i loguje się przy pomocy /bin/sh
Użytkownik minio (1000) mieszka w /home/minio i loguje się przy pomocy /bin/bash
Użytkownik test (1001) mieszka w /home/test i loguje się przy pomocy /bin/bash

Ostatnio edytowany przez Minio (2012-05-04 12:34:54)


Spinnen Essen: [url=http://fluxboxpl.org/portal/]FluxboxPL[/url] [url=http://przepis-na-lo.pl/]Przepis na LibreOffice[/url]

Offline

 

#9  2012-05-04 19:49:22

  torpeda80 - Użytkownik

torpeda80
Użytkownik
Zarejestrowany: 2007-03-28

Re: [+] skrypt terminal-wget

Dziękuję jeszcze raz za pomoc oraz za wyjaśnienie. Z programem httrack się zapoznam ale przykład skryptu wiele mnie nauczył.
Temat zamykam.
pozdrawiam

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)

[ Generated in 0.008 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00012 SET CHARSET latin2
0.00005 SET NAMES latin2
0.00098 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='13.58.200.16' WHERE u.id=1
0.00092 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '13.58.200.16', 1732761627)
0.00050 SELECT * FROM punbb_online WHERE logged<1732761327
0.00050 SELECT topic_id FROM punbb_posts WHERE id=201243
0.00010 SELECT id FROM punbb_posts WHERE topic_id=21190 ORDER BY posted
0.00059 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=21190 AND t.moved_to IS NULL
0.00007 SELECT search_for, replace_with FROM punbb_censoring
0.00101 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=21190 ORDER BY p.id LIMIT 0,25
0.00102 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=21190
Total query time: 0.00586 s