IP cim csere host fileban

Sziasztok!

Egy egyszeru feladatom van es nem birok vele. Van az alabbi scriptem:

#!/bin/sh
SERVER=$1;
IP="127.0.0.1";
LINFILE="/etc/hosts";

sed -i 's/'$IP'/'$SERVER'/g' $LINFILE;

exit 0

A lenyeg a host fileban a 127.0.0.1 reszt kell kicserelni a bejovo argumentummal.
Vegig bongesztem a googlet es ami volt hasonlo megoldas ra en kiprobaltam, de vagy "undefined label", "extra character at the end of h command" vagy "rename" hibt kapok, de nem ertem miert.
Valaki elmagyarazna mi a hiba?

Koszonom!

Hozzászólások

hasznalj "-t a sedben, ne '-t: "s/$IP/$SERVER/g"

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

tudom hogy nemzavar az aposztrof, de az a sor mar-mar hasonlit egy szep perl sorra :)

meg az a tapasztalatom magamon, hogy az ilyen apro bizbaszok miatt szokott golyozni az ember szeme amikor nezi miert nemmegy, es a vege egy lamerszamlalos porgetes :D

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Az a pont karakter regexben nem pontra, hanem bármire illeszkedik, ugye tudod? ;)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE


...
IP="127\.0\.0\.1"
...
sed -i "s/$IP/$SERVER/g" $LINFILE
...

pontosvesszők nem kellenek

Ha az IP értékét "kapja" valahonnan, akkor sincs baj, mert a shell megcsinálja neki a pont cseréjét backslash pont-ra (A ${var/ezt/erre} esetén a var változóban az "ezt" mintát cseréli "erre" - ha az "ezt" /-rel kezdődik, akkor valamennyi előfordulása cserére kerül. A pontot itt nem kell levédeni):


sed -i "s/${IP//./\\.}/$SERVER/g" $LINFILE

Systemd rendszeren nem akkora lábon lövés, az nss-myhostname a localhost-ot mindig 127.0.0.1-re oldja fel. (na persze ha a localhost-ot átírja egy másik címre... és az ajánlásnak megfelelően az nss-myhostname az utolsó...)

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

A szkripted furcsán van megírva (látszik, hogy az idézőjelezés szabályait nem rágtad át, és valamelyik programnyelvből áthallatszik a pontosvesszőzés és exitezés, ami itt csak a képet zavarja), de ettől függetlenül le kell futnia.
Speciális esetben a 127.0.0.1-címnél több, de azt tartalmazó sztringrészletet is lecserélhet, de azt minimum meg kell tennie.
Szintaktikai problémákhoz nem vezethet - így legalábbis nem, ahogyan most kinéz.

Hogy a próbálkozásaid során esetleg egy pontosvessző kettőspont volt, vagy sikerült a közönséges aposztróf/kötőjel helyett valami unicode-os/utf8-as finomságot belevarázsolnod (webes kopipészteknél előfordul), az megeshet. Sőt, nem tudni, nálad konkrétan mit ismer a fájlrendszer /bin/sh név alatt, de lehet, hogy dos/mac formátumban sikerült mentened a szkriptedet, és az az interpreter valamelyik hibaüzeneteddel hálálta ezt meg.

Kieg.: nem tudom, honnan jön az a "bejövő argumentum", de az okozhat meglepetést, ha nem az van benne, amit hiszel.

Nézd meg, hogy az a sed egyáltalán tudja-e a -i paramétert (és ha igen, ugyanazt jelenti-e neki, mint a gnu sednek)*, és hogy mi a búbánatos valami ott az a /bin/sh.

Egyébként nem igazán értem, hogy mit jelent az, hogy "terminálban működött, de shellből nem", viszont ha valami shellféle tényleg cserélt neked a sed 's/127.0.0.1/$SERVER/g' parancsra (így, aposztrófokkal) IP-címet IP-címre, akkor az a valami nagyon távol áll a unixos shellektől, és amíg nem sikerült kideríteni, hogy mi az, mit és miért csinál, addig neked is távol kellene állni tőle, mert időzített bomba a fájlrendszeredre nézve.

*Amit talán nem tudsz, a shellek és az azokban használt programkák UGYANAZON névvel oprendszerről oprendszerre, olykor disztribről disztribre vagy verzióról verzióra változhatnak nüansznyit vagy jelentősen a viselkedésükben.
Azt neked kell belőni, hogy mivel van dolgod, és a tapasztalataid alapján alkalmazkodni vagy váltani (szokni v. szökni).


#!/bin/sh
SERVER=$1;
IP="127.0.0.1";
LINFILE="./1.txt";

sed -i 's/'${IP}'/'${SERVER}'/g' $LINFILE;

exit 0

1.txt előtte:


127.0.0.1
192.168.122.1

utána (1.sh 192.168.10.10):


192.168.10.10
192.168.122.1

Hátőőőőőő. Próbáltad már Linuxon futtatni? :D
Nem ismerem a Win lelki világát, Cygwines megoldásokról tudok, de ez a network shell dolog számomra ismeretlen.
Van valami leírásod erre, hogy ez miképp működik? Google nem valami beszédes erre a kulcsra.
Ha ez valami hakkolt megoldás arra, hogy a winen is tudj bash-t futtatni, akkor gyanúsan az implementáció lesz a hibás, nem a scripted.
Itt most linuxos masinákat akarsz elérni, vagy a winen lévő hosts fájlt akarod túrni?

Ergo akkor megkérlek ismét, írj a környezetről egy kicsit :)
(és mindenki integessen a kamerának, tuti kandiznak és a retek klubon leszünk 2 nap múlva)

Nem hackelt megoldas, hanem hivatalos forras.
Akar, hogy probaltam nem jott ossze csak igy:

cat $LINFILE | sed "s/$IP/$SERVER/g" > $LINFILE

Szoval koszonom mindenkinek a segitseget! Atnezem melyebben a sed rejtelmeit. :) illetve mi a diferencia a linux shell es az nsh sehll kozott. Eddig szerencsem volt, mert minden mukodott nsh-ban ami linux kodot probaltam.

Megegyszer koszonom a hozzaszolasokat!!! Sok pontra ravilagitottatok :D

Értem én, hogy véletlenül működik, de fáj, hogy eleve hibás, ami le van írva. A pont karakter továbbra is bármire illeszkedik nem csak a pontra. Ezen felül hiányzik az idézőjel, így ha a filenévben szóköz van, más file-ra fog hivatkozni, mint amire kellene.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Megoldás: (bash alatt tesztlve a sed.)
IP="127.0.1.1"
IP2="127.0.1.2"
sed -i -e "s/$IP/$IP2/" /etc/hosts

A Te esetedben ez kellene, hogy legyen:

sed -i -e "s/$IP/$SERVER/" $LINFILE

Még jó, hogy fentebb kibeszéltük, ez miért nem jó. Kezdjük elölről?

(Nem GNU sed, nincs -i kapcsoló. Filenév idézőjelbe kellene, hogy szóközök mentén ne essen szét. A regexpben a . mindenre illeszkedik, nem csak a pontra. Igaz, épp arra is. Tehát escape-elni kell backslash-sel. Fentebb erről mind esett szó.)

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Na finomítottam szóköz problémás részén:
Teszt fájl tartalma:

aaaaa 127.0.1.1
bbbbb 127a0.1.1
ccccc 12730.1.1

# Alap paraméterek
LINFILE="liter kola.txt"
IP="127.0.1.1"
IP2="127.0.1.2"
# Konvertálás
IP=`echo $IP | sed 's/\./\\\./g'`
IP2=`echo $IP2 | sed 's/\./\\\./g'`
# Csere
cp "$LINFILE" /tmp/$LINFILE".orig
cat "$LINFILE".orig | sed -e "s/$IP/$IP2/" > "${LINFILE}"
rm -f /tmp/"$LINFILE".orig

Ez így lefut szépen. Remélem ezzel közelebb kerültünk a megoldáshoz.