Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Feb 2010

Kommando i ett kommando?

Hej, lite rolig titel kanske men det är ett problem jag inte vet hur jag ska lösa. Vill kunna uppdatera min DNS via ett script som då behöver få tag i mitt IP.

Formatet är detta:

curl -s --user 'LOGINDETAILS' 'https://dyndns.citynetwork.se/nic/update?hostname=HOST&myip=IPGOESHERE'

Som jag förstått det ska man kunna sätta $(kommando) där IPGOESHERE är, men när jag tröck följande kod så skriker den "-bash: .*$//)": No such file or directory"

curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'

Båda kommando funkar isär, men får dom inte att fungera ihop, vad är det jag missat?

Desktop: AMD Ryzen 5 1600X / 16GB RAM / GTX 1080 / 512GB SSD
Server: Intel Pentium G4400 / 4GB RAM / 17TB HDD

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2011
Skrivet av Kattus:

Hej, lite rolig titel kanske men det är ett problem jag inte vet hur jag ska lösa. Vill kunna uppdatera min DNS via ett script som då behöver få tag i mitt IP.

Formatet är detta:

curl -s --user 'LOGINDETAILS' 'https://dyndns.citynetwork.se/nic/update?hostname=HOST&myip=IPGOESHERE'

Som jag förstått det ska man kunna sätta $(kommando) där IPGOESHERE är, men när jag tröck följande kod så skriker den "-bash: .*$//)": No such file or directory"

curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'

Båda kommando funkar isär, men får dom inte att fungera ihop, vad är det jag missat?

Om jag förstår rätt nu så vill du göra följande:

curl -s --user 'LOGINDETAILS' 'https://dyndns.citynetwork.se/nic/update?hostname=HOST&myip=$(curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//')'

Du får syntax fel eftersom du måste escape single quotes i ditt sed kommando

i5 6700K @4.5GHz -Noctua NH-U14S -Asus Geforce GTX 980 Ti Strix DirectCU III -ASUS PRO GAMING Z170 -Crucial DDR4 16 GB -Crucial MX300 750GB -Corsair RM750i - NZXT H440W Silent Ultra - ASUS VC239 -Dell Professional P1914S IPS

Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Feb 2010
Skrivet av Rickybobby:

Om jag förstår rätt nu så vill du göra följande:

curl -s --user 'LOGINDETAILS' 'https://dyndns.citynetwork.se/nic/update?hostname=HOST&myip=$(curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//')'

Du får syntax fel eftersom du måste escape single quotes i ditt sed kommando

Får samma felmeddelande med din kod.

Desktop: AMD Ryzen 5 1600X / 16GB RAM / GTX 1080 / 512GB SSD
Server: Intel Pentium G4400 / 4GB RAM / 17TB HDD

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2011

@Kattus:

Poängen var att du skulle fixa det själv när du nu vet vad felet är.

i5 6700K @4.5GHz -Noctua NH-U14S -Asus Geforce GTX 980 Ti Strix DirectCU III -ASUS PRO GAMING Z170 -Crucial DDR4 16 GB -Crucial MX300 750GB -Corsair RM750i - NZXT H440W Silent Ultra - ASUS VC239 -Dell Professional P1914S IPS

Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Feb 2010

@Rickybobby
Ah, det missade jag lite, ska väl kanske lägga till att jag inte är någon höjdare på detta utan försökt skrapa ihop något fungerande från google. Hursom så blev det inte bättre med den nya varianten, verkar som den tar texten som input.

<p>Message: Bad request syntax ('GET /nic/update?hostname=test.catpanic.eu&amp;myip=$(curl -s checkip.dyndns.org | sed -e "s/.*Current IP Address: // HTTP/1.0').

Desktop: AMD Ryzen 5 1600X / 16GB RAM / GTX 1080 / 512GB SSD
Server: Intel Pentium G4400 / 4GB RAM / 17TB HDD

Trädvy Permalänk
Medlem
Plats
Umeå
Registrerad
Mar 2002

@Kattus
Text inom enkelfnuttar/singlequote evalueras inte, så kör med vanliga dubbelfnuttar/citattecken kring din url istället så kommer saker fungera bättre.

curl -s --user 'LOGINDETAILS' "https://dyndns.citynetwork.se/nic/update?hostname=HOST&myip=$(curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//')"

The difference between stupidity and genius - the latter has limits

Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Feb 2010
Skrivet av Zevon:

@Kattus
Text inom enkelfnuttar/singlequote evalueras inte, så kör med vanliga dubbelfnuttar/citattecken kring din url istället så kommer saker fungera bättre.

curl -s --user 'LOGINDETAILS' "https://dyndns.citynetwork.se/nic/update?hostname=HOST&myip=$(curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//')"

Tackar så hemskt mycket, detta gjorde exakt det jag hade önskat!

Desktop: AMD Ryzen 5 1600X / 16GB RAM / GTX 1080 / 512GB SSD
Server: Intel Pentium G4400 / 4GB RAM / 17TB HDD

Trädvy Permalänk
Forumledare
Registrerad
Okt 2002

Ett lite snabbare sätt (främst då det räcker med ett DNS-uppslag, men det minimerar även skalforkar) vore att använda OpenDNS tjänst:

dig +short myip.opendns.com @resolver1.opendns.com

för att plocka IP-adressen (kräver som synes att dig är installerat).

Det finns även andra HTTP-baserade tjänster som ger enbart adressen utan uppmärkningskod, så som exempelvis

Ska du göra det i ett skript så kan det vara en bra vana att tilldela en variabel med IP-numret på en separat rad för att underlätta felsökning. Det ger dig också möjlighet att kontrollera att variabeln är "vettig" innan du skeppar den till City Network. Exempel som försöker separera användardata från City Networks API:

#!/bin/sh hostname="dittdomannamn.se" user="kontonamn" password="losenord" external_ip=$(dig +short myip.opendns.com @resolver1.opendns.com) curl -s --user "$user:$password" "https://dyndns.citynetwork.se/nic/update?hostname=$hostname&myip=$external_ip"

(otestat, men det visar troligen vad jag menar). Det kan som sagt vara trevligt att kontrollera att $external_ip exempelvis inte är tom innan kommandot körs för att kunna presentera ett trevligare felmeddelande.

Du skriver inte OS, men du kan även titta på projektet ddclient som existerar i paketet med samma namn på Debian-baserade distributioner (och troligen även fler) som sköter samma uppgift, men stöder fler tjänster, lägger sig fint i bakgrunden, håller reda på när uppdateringar behöver göras, etc. Ett alternativ till att återuppfinna hjulet, men ibland är det ju detta som är målet .

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Feb 2010

@phz Tack för ditt välskrivna svar, dock ville jag inte installera flera packages, och även om jag faktiskt tittade på ddclient så fick jag det aldrig att funka. Dessutom funkar curl-scriptet jättebra och jag har lagt det i cron. Skulle det krångla någon gång får jag titta tillbaka hit och pröva din variant dock!

Kör i övrigt Debian Jessie.

EDIT: Inser att ditt script faktiskt var mycket bättre, samt jag hade visst "dig" installerat (scriptet fungerar även utmärkt)

Desktop: AMD Ryzen 5 1600X / 16GB RAM / GTX 1080 / 512GB SSD
Server: Intel Pentium G4400 / 4GB RAM / 17TB HDD