Verwenden von Bindestrichen in systemd-Argumenten

Verwenden von Bindestrichen in systemd-Argumenten

Bei systemd-Einheiten mit Argumenten, Bindestrichen undandere Spezifiziererwerden durch Schrägstriche ersetzt.

Einige Unit-Namen spiegeln Pfade wider, die im Dateisystem-Namespace existieren. Beispiel: Eine Geräte-Unit dev-sda.device bezieht sich auf ein Gerät mit dem Geräteknoten /dev/sda im Dateisystem-Namespace. Wenn dies zutrifft, wird eine spezielle Methode zum Escapen des Pfadnamens verwendet, sodass das Ergebnis als Teil eines Dateinamens verwendet werden kann. Grundsätzlich wird bei einem Pfad "/" durch "-" ersetzt und alle anderen Zeichen, die keine ASCII-alphanumerischen Zeichen sind, werden durch C-artige "\x2d"-Escapes ersetzt.

--freedesktop.org

Ich habe versucht, ein Argument mit einem Bindestrich einzugeben, und dabei ist mir aufgefallen, dass die Systemd-Einheit meine Bindestriche nicht durch einen Schrägstrich ersetzt. Werden Bindestriche also nicht immer ersetzt? Oder interpretiere ich das einfach falsch?

Grundsätzlich möchte ich einer systemd-Einheit einen String übergeben, der wiederum einen String an die ausführbare Datei übergibt, die ich in der Einheit ausführe.

Zum Beispiel:

Angenommen, ich habe eine Einheit [email protected]und innerhalb dieser Einheit möchte ich Folgendes ausführen:

/usr/local/bin/my_script param-with-hyphen

Wenn ich versuche, das Argument mit einem Bindestrich an die folgende Einheit zu übergeben, so:

$ systemctl start [email protected]

ExecStart=/usr/local/bin/my_script %i

Wird die Zeichenfolge nicht in konvertiert param/with/hyphen?

Bei meinen Tests wird der Bindestrich nicht ersetzt.

Ich habe eine Einheit gemacht:/etc/systemd/system/[email protected]

[Unit]
Description=Test arg %i

[Service]
ExecStart=/usr/bin/echo "arg: %i"

und ranntesystemctl start testunit@test-hyphen

Das Ergebnis ersetzt den Bindestrich nicht:

$ journalctl -u testunit@test-hyphen
Journal file /var/log/journal/f41c5d772fa24834926605125d59db1b/user-1000@4cc6a20c4391418eb972f65e6ecfafbe-000000000000043c-0005351d59c7b07b.journal is truncated, ignoring file.
-- Logs begin at Fri 2016-06-10 18:15:25 PDT, end at Sat 2016-09-24 23:12:42 PDT
Sep 24 23:12:25 Archon systemd[1]: Started Test arg test-hyphen.
Sep 24 23:12:25 Archon echo[6302]: arg: test-hyphen

Antwort1

Sie haben die Dokumentation falsch gelesen:

Bei einem Pfad wird grundsätzlich "/" durch "-" ersetzt.

Schrägstriche in einem Dateisystempfad werden durch Bindestriche ersetzt, aber es wird nichts darüber gesagt, dass Bindestriche durch Schrägstriche ersetzt werden ... weshalb die Bindestriche in Ihrem Test so bleiben, wie sie sind. Was jedoch wahrscheinlich passiert, ist, dass Ihre Bindestriche durch ersetzt werden \x2d, was als interpretiert wird, -wenn es sich durch die Pipeline bewegt.

alle anderen Zeichen, die keine ASCII-alphanumerischen Zeichen sind, werden durch C-artige "\x2d"-Escapezeichen ersetzt

Der Abschnitt zu „Spezifizierern“ scheint hier nicht besonders relevant zu sein, außer dass er Ihnen erlaubt, zu steuern, wie Ihre Argumente maskiert werden oder nicht.

Antwort2

DerdokumentierenDie Erklärung dazu steht bei dir direkt neben der Tabelle: Das Escapen wird nicht automatisch rückgängig gemacht, sondern du musst explizit danach fragen:

"%i" Instanzname: Für instantiierte Einheiten: Dies ist die Zeichenfolge zwischen dem Zeichen "@" und dem Suffix des Einheitennamens.
"%I" Nicht maskierter Instanzname: Dasselbe wie "%i", aber mit deaktivierter Maskierung.

%IWenn Sie anstelle von verwenden %i, sollten die Bindestriche wie beschrieben in Trennstriche geändert werden.

(Diese Formulierung ist mir allerdings etwas vage. „unescaped“ könnte so interpretiert werden, dass der Wert nicht maskiert wird, aber hier bedeutet es, dass das Maskieren rückgängig gemacht wird.)

verwandte Informationen