Zmiana zawarto

Potrzebujesz pomocy z C, C++, perl, python, itp.
Sniff
Posty: 26
Rejestracja: 09 kwietnia 2007, 16:12

Zmiana zawartości pliku

Post autor: Sniff »

Witam!
Jak zrobić skrypt w bashu który zmieni mi wybraną linijkę w wybranym pliku?
Planuję zrobić skrypt do szybkiej zmiany ip... ale nie wiem jak zmienić wybraną linie...:/
Druga sprawa właściwie nie dotyczy basha ale nie będe zakładał nowego tematu...ustawie nowe ip w /etc/network/interfaces i zapisuje a ciągle internet działa na starym ip dopiero po przeładowaniu kompa internet działa na nowym ip... Domyślam się że chodzi o restart wybranej usługi - jakiej dokładnie i jak to zrobić w bashu?

Z góry dzięki za odpowiedzi!
velmafia
Member
Posty: 1820
Rejestracja: 01 września 2006, 00:56
Lokalizacja: Las

Post autor: velmafia »

Sniff pisze:Druga sprawa właściwie nie dotyczy basha ale nie będe zakładał nowego tematu...ustawie nowe ip w /etc/network/interfaces i zapisuje a ciągle internet działa na starym ip dopiero po przeładowaniu kompa internet działa na nowym ip... Domyślam się że chodzi o restart wybranej usługi - jakiej dokładnie i jak to zrobić w bashu?

Kod: Zaznacz cały

/etc/init.d/networking
Sniff
Posty: 26
Rejestracja: 09 kwietnia 2007, 16:12

Post autor: Sniff »

Ok dzięki...pozostaje tylko jak zmienić zawartość pliku:/
velmafia
Member
Posty: 1820
Rejestracja: 01 września 2006, 00:56
Lokalizacja: Las

Post autor: velmafia »

zainteresuj się poleceniem tr, ale nie jestem pewien czy ono zmienia tylko pojedyńcze znaki, czy też całe ciągi znaków.

więc przeczytaj manual:

Kod: Zaznacz cały

man tr



aloha
Gość

Re: Zmiana zawartości pliku

Post autor: Gość »

Sniff pisze:Jak zrobić skrypt w bashu który zmieni mi wybraną linijkę w wybranym pliku?
Niestety podałeś zbyt mało informacji (a raczej wcale) bym mógł udzielić szczegółowej informacji.
W każdym razie zainteresuj się sedem
Tutaj : LINK
podałem rozwiązanie prawie identycznego problemu, więc myślę, że powinno Cię to bezproblemowo nakierować na właściwy kierunek.

Pozdrawiam
wojtekz_
Beginner
Posty: 337
Rejestracja: 13 marca 2007, 16:50
Lokalizacja: Warszawa

Re: Zmiana zawartości pliku

Post autor: wojtekz_ »

Sniff pisze:Witam!
Jak zrobić skrypt w bashu który zmieni mi wybraną linijkę w wybranym pliku?
(...) Z góry dzięki za odpowiedzi!
Są dwa narzędzia do obróbki tekstu w sposób, o którym myślisz (chyba, jeśli dobrze rozumiem ;-)), oba nietrywialne: nawk i sed; sporo czytania... ale się daje :-).

Pozdrawiam i życzę powodzenia
Gość

Post autor: Gość »

Jako, że @Sniff zwrócił się do mnie via PW, to pozwolę zamieścić sobie tutaj jeden ze sposobów na rozwiązanie Jego problemu - po prostu nie lubię gdy jakieś informacje nikną przesyłane poza tematem :)

Krótki cytat z Jego opisem sytuacji:
Sniff pisze:No więc mam zamiar zrobić tak:
odpalam skrypt który pyta mnie jakie ip chce sobie ustawić
wpisuje to ip po czym naciskam enter
Ip jest wpisywane w plik etc/network/interfaces w miejsce Adress

Kod: Zaznacz cały

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
	address 80.48.85.132
	netmask 255.255.255.0
	network 80.48.85.0
	broadcast 80.48.85.255
	gateway 80.48.85.1
	# dns-* options are implemented by the resolvconf package, if installed
	dns-nameservers 194.204.159.1 194.204.152.34
[/size]
Po czym restartowana jest usługa /etc/init.d/networking.

Wiem co jak zrobić tylko zostaje kwestia tego jak zmienić to ip w pliku, tego nie kumam. Jeśli możesz pomóż ale nie chciałbym żebyś po prostu napisał skrypt ale zależy mi na tym żebym wiedział o co w nim chodzi. Z góry wielkie dzięki :)
No więc z mojej strony tak na szybko:

Napiszę pokrótce o co chodzi i jak się to robi, a Ty już sam to dopasuj do swojego skryptu ...

Jeśli w pliku /etc/network/interfaces chcesz zmienić linię: address 80.48.85.132
na zawierającą inny adres IP, to można to zrobić bardzo prosto.
Skoro nowe IP jest pobierane przez jakiś Twój skrypt, to sądzę że zostaje w nim przypisane jakiejś zmiennej - przyjmijmy tutaj że jej nazwa to "$nowe_ip"

w takim wypadku wystarczy potem tylko:

Kod: Zaznacz cały

sed '/address/{s/[[:digit:].]//g]
A teraz krótko jak to działa ...
używamy seda do pracy, więc polecenie z grubsza jest takie :
sed '<polecenia_seda>' plik_do_obróbki > nowy plik

w tym
sed '/address/{s/[[:digit:].]//g;s/address/address\ '$nowe_ip'/}'
wypadku polecenia seda robią po kolei :

[quote]sed '[color=darkred][b]/address/{s/[[:digit:].]//g[/b][/color];s/address/address\ '$nowe_ip'/}'[/quote]
znajdź linię zawierającą słowo "address" i tylko w tej linii usuń z niej wszystkie cyfry i kropki

następnie:[quote]sed '/address/{s/[[:digit:].]//g;[color=darkred][b]s/address/address\ '$nowe_ip'/[/b][/color]}'[/quote]
nadal w tej samej linii po usunięciu znaków jak wyżej zamień pozostałe słowo "address "
na "address <nowe IP>"
Jako <nowe IP> zostanie wpisana wartość zmiennej $nowe_ip.

Całość na koniec jest zapisywana do nowego pliku
>  /etc/network/interfaces.new
i w końcu stary plik  /etc/network/interfaces
jest zamieniany przez nowy.

[b][u]Uwaga:[/u][/b]
pod żadnym pozorem nie wolno od razu kierować wyniku do > /etc/network/interfaces
gdyż wykasuje Ci to jego całą zawartość przed zakończeniem operacji.

[u][b]Teraz małe info dodatkowe:[/b][/u]
Podany sposób jest dobry w przypadku gdy w pliku jest konfiguracja tylko jednego interfejsu.
W sytuacji gdy jest ich >1 należy wyszukiwanie linii oprzeć na aktualnym adresie IP, a nie na wyrazie "address"

Pozdrawiam
Sniff
Posty: 26
Rejestracja: 09 kwietnia 2007, 16:12

Post autor: Sniff »

dokładnie jak napisał Hagal skrypt podmienia w odpowiednim miejscu co trzeba i jest ok jednak ifconfig wyświetla ciągle stare ip:/ no i nie ma netu:/ skrypt wygląda tak:

Kod: Zaznacz cały

#!/bin/bash
echo "Wpisz nowe ip:"
read nowe_ip
sed '/address/{s/[[:digit:].]//g;s/address/address\ '$nowe_ip'/}' /etc/network/interfaces > /etc/network/interfaces.new
mv -f /etc/network/interfaces.new /etc/network/interfaces
/etc/init.d/networking restart
ifconfig eth0 up
echo "Ip zostało zmienione na $nowe_ip"
Czy napewno wystarczy zmienić ip w tym pliku i zrestartować tylko ta usługe? nie kumam tego bo nie mam www a ping na serwer mojej sieci leci... dopiero po restarcie śmiga jak trzeba...
mlyczek
Junior Member
Posty: 979
Rejestracja: 02 sierpnia 2006, 19:17

Post autor: mlyczek »

Spróbuj zamiast
Sniff pisze:/etc/init.d/networking restart
ifconfig eth0 up
Dać takie coś:

Kod: Zaznacz cały

ifdown eth0
ifup eth0
Robin
Posty: 8
Rejestracja: 24 maja 2007, 20:53
Lokalizacja: Sieradz

Post autor: Robin »

Odkopuję dość stary temat, ale mam pytanko a nie widzę sensu zakładać nowego.
Kombinuję z diodą led wifi w moim laptopie, zauważyłem że zmiana wartości w pliku /sys/devices/platform/asus-laptop/wlan z 0 na 1 zapala diodę.
Mam pytanie czy istnieje możliwość w network managerze powiadomienia że:

Kod: Zaznacz cały

NetworkManager is connected
poprzez opcje ,,Execute'', a program który to wykonałby skrypt zmieniający wartość z 0 na 1 i odwrotnie dla:

Kod: Zaznacz cały

NetworkManager is disconnected
ODPOWIEDZ