Geonode logo
Geonode Team

Geonode Team

Aktualisiert: 7. Oktober 2026

Veröffentlicht: 02.09.2026

So legen Sie mit curl einen benutzerdefinierten User-Agent fest (+Beispiele)

`curl -A "MyBot/1.0" https://example.com` legt den User-Agent-Header fest. Das ist die Syntax, und die interessante Frage ist, was man dort eintragen soll. Die spontane Antwort – eine Zeichenfolge aus Chrome zu kopieren – ist häufig falsch, da sie einen Widerspruch zwischen dem, was man vorgibt zu sein, und dem, was die Verbindung nachweislich ist, erzeugt. Dieser Leitfaden behandelt die Syntax, den Fall der Entfernung sowie die sinnvollere Strategie, sich ehrlich zu identifizieren.

Unser Standpunkt ganz klar: Wir sind Geonode und verkaufen Proxys, und Fragen zum User-Agent tauchen meist zusammen mit der Frage „Warum werde ich blockiert?“ auf. Die ehrliche Antwort lautet: Der User-Agent ist eines der schwächsten verfügbaren Signale, und eine Browser-Zeichenkette in einer Anfrage, deren TLS-Fingerabdruck etwas anderes aussagt, ist schlimmer als gar keine Tarnung – man hat damit eine Inkonsistenz geschaffen, die ein echter Browser niemals erzeugt. Dazu gibt es weiter unten einen Abschnitt. Die Strategie, die häufiger funktioniert, als man erwartet, ist genau das Gegenteil: Geben Sie an, wer Sie sind, stellen Sie eine Kontakt-URL bereit und verhalten Sie sich vernünftig. Anonyme Automatisierung wird weitaus schneller blockiert als identifizierte Automatisierung, und sich zu identifizieren kostet nichts.

Die Syntax „

curl -A "MyBot/1.0" https://example.com

“ Im curl-Handbuch wird „-A, --user-agent <name>

“ wie folgt beschrieben: „Geben Sie die User-Agent-Zeichenkette an, die an den HTTP-Server gesendet werden soll. Um Leerzeichen in der Zeichenkette zu kodieren, setzen Sie die Zeichenkette in einfache oder doppelte Anführungszeichen.“

Auch die Standardeinstellung wird angegeben: „Standardmäßig verwendet curl curl/VERSION

, beispielsweise User-Agent: curl/8.22.0

.“

Ohne Angabe einer Option gibt sich jede von Ihnen gesendete Anfrage also als curl mit der jeweiligen Version zu erkennen. Manche Server reagieren darauf unterschiedlich, was Sie wissen sollten, bevor Sie zu dem Schluss kommen, dass eine Website nicht funktioniert.

Die entsprechende Variante mit einem generischen Header:

curl -H "User-Agent: MyBot/1.0" https://example.com

Beide führen zum gleichen Ergebnis – im Handbuch wird darauf hingewiesen, dass der Header „auch mit den Optionen ``--header`

oder ``--proxy-header

gesetzt werden kann“. ``-A

ist kürzer; ``-H

` entspricht der üblichen Vorgehensweise beim Setzen aller anderen Header, was wichtig ist, wenn Sie Befehle programmgesteuert generieren.

Wenn Sie den Wert mehrmals angeben, „wird der zuletzt festgelegte Wert verwendet“.

Den Header vollständig entfernen

Ein Fall, von dem viele nicht wissen, dass es ihn gibt, und das Handbuch macht hier einen klaren Unterschied:

Wenn Sie der Funktion „--user-agent“ ein leeres Argument („“) übergeben, wird der Header vollständig aus der Anfrage entfernt. Wenn Sie einen leeren Header bevorzugen, können Sie ihn auf ein einzelnes Leerzeichen („ “) setzen.

curl -A "" https://example.com          # no User-Agent header at all
curl -A " " https://example.com         # User-Agent: (empty value)

Dies sind tatsächlich unterschiedliche Anfragen. Das Senden eines leeren Headers ist nicht dasselbe wie das Senden eines Headers ohne Inhalt, und Server können zwischen beiden unterscheiden.

Beides ist ungewöhnlich, und Ungewöhnlichkeit ist an sich schon ein Signal. Eine Anfrage ganz ohne User-Agent ist seltener als eine, die sich als „curl“ identifiziert; daher führt das Entfernen des Headers, um weniger auffällig zu wirken, in der Regel zum gegenteiligen Ergebnis.

Der gleiche Mechanismus funktioniert über „-H“, und im Handbuch wird die Syntax für beide Fälle erläutert: „Entfernen Sie einen internen Header, indem Sie rechts vom Doppelpunkt einen Ersatz ohne Inhalt angeben, wie in: -H "Host:"“, während ein Header mit leerem Wert ein Semikolon benötigt – „-H "X-Custom-Header;"“ sendet „X-Custom-Header:“.

Warum die Standardeinstellung wichtig ist „

curl/8.22.0“ ist eine völlig harmlose Zeichenfolge, die jedoch Konsequenzen hat.

Manche Server blockieren sie sofort. Eine pauschale Regel gegen bekannte Automatisierungstools lässt sich leicht programmieren und ist so verbreitet, dass Sie immer wieder darauf stoßen werden.

Manche liefern andere Inhalte. Vereinfachtes Markup, keine JavaScript-abhängigen Abschnitte, gelegentlich eine völlig andere Seite.

Manche protokollieren es und unternehmen nichts. Der mit Abstand häufigste Fall.

Manche CDNs betrachten ihn als eines von vielen Signalen und nicht als eigenständige Entscheidungsgrundlage.

Die praktische Konsequenz ist, dass „es funktioniert in meinem Browser, aber nicht in curl“ mehrere mögliche Ursachen haben kann, und der User-Agent ist nur eine davon. Bevor Sie etwas daran ändern, prüfen Sie, ob der Unterschied tatsächlich auf JavaScript zurückzuführen ist – „curl“ führt JavaScript nicht aus, sodass eine clientseitig zusammengestellte Seite für „curl“ fast leer erscheint, egal welchen Header Sie senden. Das ist kein blockierendes Problem, und kein User-Agent behebt es.

Warum das Nachahmen eines Browsers oft nach hinten losgeht

Der Abschnitt, den Sie lesen sollten, bevor Sie eine Chrome-Zeichenkette einfügen.

Ein User-Agent ist eine Behauptung. Ein modernes Anti-Bot-System gleicht diese Behauptung mit Belegen ab, und davon gibt es reichlich:

TLS-Fingerabdruck. Die Art und Weise, wie ein Client TLS aushandelt – Reihenfolge der Verschlüsselungssuiten, Erweiterungen, unterstützte Gruppen – erzeugt eine Signatur, die üblicherweise als JA3 oder JA4 zusammengefasst wird. Die von curl ist nicht die von Chrome, und kein Header kann dies ändern. Eine Anfrage, die vorgibt, Chrome zu sein, aber den TLS-Handshake von curl verwendet, ist noch leichter zu identifizieren als eine, die ehrlich angibt, curl zu sein, da echter Chrome diese Kombination niemals erzeugt.

Header-Satz und Reihenfolge. Browser senden einen charakteristischen Satz von Headern in einer charakteristischen Reihenfolge – Accept, Accept-Language, Accept-Encoding, Sec-Fetch-* und weitere. curl sendet drei oder vier. Sich als Chrome auszugeben und dabei den Header-Satz von curl zu senden, ist ein offensichtlicher Widerspruch.

HTTP-Version und Verhalten. Details zur Wiederverwendung von Verbindungen, Multiplexing und Header-Komprimierung.

Verhalten. Echte Browser laden das CSS, die Bilder und die Skripte. Ein Client, der ein HTML-Dokument und sonst nichts lädt, sieht nicht wie ein Browser aus, egal was er behauptet.

Die ehrliche Hierarchie lautet also: Ein korrekter User-Agent ist konsistent und unauffällig; ein gefälschter ist inkonsistent und auffällig. Wenn Sie wirklich browserähnliche Anfragen benötigen, brauchen Sie einen Browser – Playwright oder ein ähnliches Tool – und keinen Header. Die damit verbundenen Vor- und Nachteile haben wir im Artikel „Screenshots mit Playwright erstellen“ behandelt.

Es gibt einen schmalen legitimen Mittelweg: das Testen der User-Agent-Verarbeitung Ihrer eigenen Website oder das Abrufen von Inhalten, die eine Website für mobile Clients anders bereitstellt. Dabei handelt es sich um Überprüfungen Ihrer eigenen Systeme oder um harmlose Inhaltsaushandlung, und das ist in Ordnung.

Was man stattdessen senden sollte

Bei automatisierten Clients wird die Zeichenfolge am seltensten blockiert, die angibt, was man ist:

curl -A "AcmePriceBot/1.2 (+https://acme.example.com/bot)" https://example.com

. Diese Konvention besteht aus drei Teilen: einem Namen, einer Version und einer URL, unter der man herausfinden kann, was man ist und wie man erreicht werden kann. Das funktioniert, weil es dem Betreiber der Website Alternativen zum Blockieren bietet. Ein unerklärliches Muster von Anfragen ist ein Problem, das gestoppt werden muss; ein identifizierter Crawler mit einer Kontaktseite ist eine Entscheidung, die getroffen werden muss – und häufig lautet diese Entscheidung: Zulassen.

Drei praktische Vorteile, alle real:

**robots.txt

kann dich gezielt ansprechen.** Regeln werden anhand des User-Agent-Tokens abgeglichen, sodass eine Website deinem Crawler eine Berechtigung erteilen kann, die sie nicht jedem gewährt. Das ist nicht möglich, wenn du anonym bist.

Betreiber können Sie vor einer Sperrung kontaktieren. Dies geschieht häufiger, als man erwartet, und ist ein weitaus besseres Ergebnis, als erst drei Wochen später von einer Sperrung zu erfahren.

Es unterstützt die Beantragung von Zugriff. „Wir sind der als AcmePriceBot identifizierte Crawler; das ist unsere Aufgabe“ ist ein Gespräch, das zu etwas führen kann. „Wir sind ein nicht identifiziertes Skript“ hingegen nicht.

Passen Sie Ihr Verhalten an diese Aussage an: Halten Sie sich an robots.txt

, beachten Sie Crawl-delay

und Retry-After

, halten Sie Ihre Zugriffsrate moderat und nutzen Sie den Cache, damit Sie dieselbe unveränderte Ressource niemals zweimal abrufen.

Einheitliche Einstellung in Skripten

Bei mehr als einem Befehl sollten Sie die Zeichenfolge an einer Stelle hinterlegen.

UA="AcmePriceBot/1.2 (+https://acme.example.com/bot)"

curl -sS --fail --location \
     --user-agent "$UA" \
     --connect-timeout 5 --max-time 30 \
     "$URL"

Oder legen Sie sie einmalig in einer curl-Konfigurationsdatei fest, wodurch jeder Aufruf einheitlich bleibt, ohne dass das Flag wiederholt werden muss:

# bot.conf
--user-agent "AcmePriceBot/1.2 (+https://acme.example.com/bot)"
--location
--show-error
curl -K bot.conf "$URL"

Ein besonderer Hinweis zu ~/.curlrc

: Dies gilt für jeden curl-Aufruf dieses Benutzers, einschließlich Befehlen, die Sie nicht selbst geschrieben haben. Wenn Sie dort einen Bot-User-Agent festlegen, wird jede Ad-hoc-Anfrage, die Sie jemals stellen, als Ihr Crawler identifiziert, was Monate später zu verwirrenden Ergebnissen führt. Verwenden Sie für alles, was arbeitslastspezifisch ist, eine benannte Konfigurationsdatei mit -K

.

Wenn Sie mehrere User-Agents für eine Workload benötigen, speichern Sie diese in einem Array und wählen Sie sie gezielt aus, anstatt sie zufällig zuzuweisen – eine zufällige Rotation innerhalb einer Sitzung führt dazu, dass der Client den Eindruck erweckt, den Browser mitten im Besuch zu wechseln, was eher eine Inkonsistenz als eine Tarnung darstellt.

Überprüfen, was tatsächlich gesendet wurde

Eine Gewohnheit, die es sich lohnt anzunehmen, da Annahmen bezüglich der Header überraschend oft falsch sind.

curl -v -A "MyBot/1.0" https://example.com 2>&1 | grep -i '^> user-agent'

Die ausführliche Ausgabe erfolgt über stderr, daher der Befehl „2>&1“. Die Zeilen „>“ zeigen an, was curl übertragen hat.

Oder bitten Sie einen Dienst, die Daten zurückzusenden:

curl -sS -A "MyBot/1.0" https://httpbin.org/user-agent

Dies ist wichtiger, als es zunächst klingt, da das Handbuch ein bestimmtes Verhalten beschreibt: „Sollten Sie einen benutzerdefinierten Header hinzufügen, der denselben Namen wie einer der internen Header hat, die curl verwenden würde, wird Ihr extern gesetzter Header anstelle des internen verwendet.“ Die Kombination von „-A“ mit „-H "User-Agent: ..."“ führt also dazu, dass einer der beiden stillschweigend den Vorrang erhält – und um herauszufinden, welcher das ist, muss man nachsehen. Der Ratschlag aus dem Handbuch selbst ist es wert, wiederholt zu werden: „Sie sollten intern gesetzte Header nicht ersetzen, ohne genau zu wissen, was Sie tun.“

Die gleiche Überprüfung gilt auch bei der Nutzung eines Proxys, wo --proxy-header Header auf der Proxy-Verbindung statt auf der Zielanfrage setzt – ein Unterschied, der viele überrascht, wenn ein von ihnen gesetzter Header scheinbar nicht ankommt.

Einen User-Agent-String lesen

Es lohnt sich, dies zu verstehen – sowohl, weil Sie möglicherweise selbst einen erstellen müssen, als auch, weil das Format erklärt, warum Browser-Strings so seltsam aussehen.

Ein moderner Chrome-String sieht in etwa so aus:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36

Fast nichts davon entspricht der Wahrheit. Es handelt sich weder um Mozilla noch um Safari, und AppleWebKit/537.36 ist seit Jahren eingefroren. Der String ist ein Fossil aus zwei Jahrzehnten der Inhaltsaushandlung: Jeder Browser fügte die Tokens seiner Vorgänger hinzu, damit Server, die nach einem Konkurrenten Ausschau hielten, diesem die richtige Version der Seite bereitstellten. Das Ergebnis ist ein Format, das fast keine verlässlichen Informationen enthält und dennoch von einer Vielzahl von Programmen ausgewertet wird.

Die zugrunde liegende strukturelle Grammatik ist einfach: eine Folge von Tokens wie „Product/Version“, denen jeweils optional ein Kommentar in Klammern folgt. Das ist die gesamte Spezifikation, und deshalb ist eine Zeichenfolge wie „AcmePriceBot/1.2 (+https://acme.example.com/bot)“ wohlgeformt – ein Produkt-Token, eine Version und ein Kommentar, der eine URL enthält. Das Präfix „+“ in der URL ist eher eine Konvention als eine Anforderung und wird allgemein anerkannt.

Die Frage nach mobilen Geräten. Viele Websites liefern mobilen Clients unterschiedliche Markups, und das Unterscheidungsmerkmal ist in der Regel „Mobile“ an einer beliebigen Stelle in der Zeichenfolge. Wenn Sie tatsächlich prüfen möchten, wie eine Seite für mobile Besucher dargestellt wird, handelt es sich beim Senden eines mobilen User-Agents um gewöhnliche Inhaltsaushandlung und nicht um Identitätsvortäuschung – allerdings gilt wie immer derselbe Vorbehalt: Eine mobile Zeichenfolge bei einer Desktop-Verbindung mit einem Desktop-Viewport ist nur eine halbe Aussage, und ein echter mobiler Browser würde sich in mehreren anderen Punkten unterscheiden.

Und der Trend zur Versionsfestlegung. Browser reduzieren zunehmend die Details, die sie in diesem Header offenlegen, und verlagern Informationen zur Funktionsfähigkeit stattdessen in strukturierte Client-Hinweise. In der Praxis bedeutet dies, dass das Parsen des User-Agents für alle eine immer weniger wichtige Informationsquelle darstellt – einschließlich der Websites, die entscheiden, wie sie auf Ihre Anfragen reagieren, was ein weiterer Grund dafür ist, dass es sich um ein schwaches Signal handelt, auf das man eine Strategie aufbauen sollte.

Wenn der User-Agent nicht das Problem ist

Fälle, in denen eine Änderung nichts bringt – hier aufgeführt, weil Nutzer dies meist als Erstes versuchen.

Wenn der Inhalt per JavaScript gerendert wird. curl führt keine Skripte aus. Eine fast leere Antwort bedeutet, dass die Seite clientseitig zusammengestellt wird, und die Lösung liegt im Browser oder der zugrunde liegenden API, nicht in einem Header.

Wenn eine Ratenbegrenzung vorliegt. Bei einer „429“ geht es um das Volumen, nicht um die Identität. Eine Verlangsamung hilft; ein neuer User-Agent hingegen nicht.

Wenn die Adresse das Problem ist. Wenn ein ganzer Bereich gesperrt ist, schlägt jede Anfrage von dort fehl, unabhängig von den Headern.

Wenn eine Authentifizierung erforderlich ist. Ein „401“ verlangt Anmeldedaten.

Wenn der TLS-Fingerabdruck Sie verrät. Dies wurde oben bereits behandelt und ist der Grund, warum die Nachahmung eines Browsers allein über Header meist enttäuschend ausfällt.

Wenn die Website einfach keinen automatisierten Traffic zulässt. Manche Websites geben dies in ihren Nutzungsbedingungen an und setzen dies durch. Das Ändern eines Headers ändert nichts an den Nutzungsbedingungen, und eine Website, die dir mitgeteilt hat, sie nicht zu crawlen, hat dir eine Information gegeben und kein Rätsel gestellt.

Die Diagnose, mit der sich diese Fälle schnell unterscheiden lassen: Rufen Sie dieselbe URL von einem normalen Browser über dieselbe Verbindung auf. Wenn der Browser funktioniert und curl nicht, vergleichen Sie die beiden Anfragen Header für Header – und wenn sich herausstellt, dass der einzige entscheidende Unterschied etwas ist, das Sie über die Befehlszeile nicht ändern können, haben Sie Ihre Antwort.

Häufig gestellte Fragen

Wie lege ich einen User-Agent in curl fest?

curl -A "MyBot/1.0" URL oder alternativ curl -H "User-Agent: MyBot/1.0" URL. Setzen Sie die Zeichenfolge in Anführungszeichen, wenn sie Leerzeichen enthält. Bei mehrfacher Angabe gilt der letzte Wert.

Was ist der Standard-User-Agent von curl?

curl/VERSION – zum Beispiel curl/8.22.0. Er wird bei jeder Anfrage gesendet, sofern Sie ihn nicht überschreiben oder entfernen, und manche Server reagieren je nach User-Agent unterschiedlich darauf.

Wie entferne ich den User-Agent-Header in curl?

curl -A "" URL entfernt den Header vollständig. curl -A " " URL sendet ihn mit einem leeren Wert, was eine andere Anfrage darstellt. Beachten Sie, dass das Nicht-Senden eines User-Agents ungewöhnlicher ist als das Senden des Standard-User-Agents von curl, sodass es eher mehr als weniger Aufmerksamkeit erregt.

Sollte ich mit curl einen Browser-User-Agent vortäuschen?

Normalerweise nicht. Eine Browser-Zeichenkette in einer Anfrage, deren TLS-Fingerabdruck, Header-Satz und Reihenfolge alle von curl stammen, ist eine Inkonsistenz, die echte Browser niemals erzeugen – was Sie eher identifizierbar macht als nicht. Wenn Sie browserähnliche Anfragen benötigen, verwenden Sie einen Browser.

Verhindert das Ändern des User-Agents, dass ich blockiert werde?

Für sich allein genommen selten. Es hilft gegen pauschale Regeln, die bekannte Tools ablehnen, und nützt nichts gegen Ratenbeschränkungen, adressbasierte Sperren, TLS-Fingerprinting oder Verhaltensanalysen. Sich ehrlich mit einer Kontakt-URL zu identifizieren, funktioniert oft besser als eine Tarnung.

Wie sollte der User-Agent eines Bots aussehen?

Name, Version und eine Kontakt-URL: AcmePriceBot/1.2 (+https://acme.example.com/bot). Dadurch kann robots.txt dich gezielt ansprechen, können Betreiber dich kontaktieren, anstatt dich zu blockieren, und erhältst du die Möglichkeit, um Zugriff zu bitten.

Kann ich pro Anfrage einen anderen User-Agent festlegen?

Ja – „-A“ gilt für den Aufruf; gib daher jedes Mal einen anderen Wert an oder verwende „--next“, um mehrere Operationen mit unterschiedlichen Optionen in einem Befehl auszuführen. Vermeide es, innerhalb einer Sitzung zufällig zu wechseln, da dies den Eindruck erweckt, als würde der Client mitten im Besuch den Browser wechseln.

Warum wird mein benutzerdefinierter User-Agent nicht angezeigt?

Höchstwahrscheinlich haben Sie ihn zweimal auf unterschiedliche Weise festgelegt, da curl Ihren extern festgelegten Header anstelle seines internen verwendet und die letzte Definition Vorrang hat. Überprüfen Sie mit curl -v ... 2>&1 | grep -i '^> user-agent', was tatsächlich übertragen wurde.

Fazit

Das Festlegen eines User-Agents in curl erfolgt über ein einziges Flag, wobei die Wahl des Werts wichtiger ist als die Syntax.

Der Standardwert gibt curl ehrlich an, und Ehrlichkeit ist eine vertretbare Haltung: konsistent, unauffällig und gelegentlich der Grund dafür, dass eine Website Sie vernünftig behandelt. Das Entfernen des Headers ist möglich – ein leeres Argument lässt ihn vollständig wegfallen, ein einzelnes Leerzeichen sendet ihn leer – und beides ist ungewöhnlicher als der Standardwert, was das Gegenteil dessen ist, was die Leute normalerweise beabsichtigen.

Das Kopieren einer Browser-Zeichenkette ist der übliche Reflex und die schwächste Option, da diese Angabe überprüfbar ist. TLS-Fingerabdrücke, die Zusammensetzung und Reihenfolge der Header sowie die Frage, ob Sie die Unterressourcen der Seite abrufen, widersprechen dieser Angabe – und ein Widerspruch ist leichter zu erkennen als ein offenes Eingeständnis. Wenn Anfragen im Stil eines Browsers wirklich erforderlich sind, ist ein Browser das richtige Werkzeug.

Der Ansatz, der besser funktioniert, als die meisten Menschen erwarten, kostet nichts: ein Name, eine Version und eine URL, unter der jemand herausfinden kann, wer du bist. Dadurch kann robots.txt Sie ansprechen, ein Betreiber kann Ihnen eine E-Mail senden, anstatt Sie zu blockieren, und „unerklärlicher Datenverkehr“ wird zu „einem Crawler mit einem Eigentümer“ – was eine viel bessere Ausgangslage ist, wenn jemand entscheidet, wie mit Ihnen verfahren werden soll.