From 1eb7976ec8e00e0dc0f60cbccf863c7176a2fc80 Mon Sep 17 00:00:00 2001 From: mm Date: Mon, 14 Sep 2026 10:14:10 +0200 Subject: [PATCH] fix(installer): Selbstschutz gegen stdin-Frass bei curl|sh (VERSION 1.4.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit x14 brach mitten in der Installation ab: der Installer gab seinen eigenen Quelltext aus ("; then", Kommentarzeilen) und blieb stehen. Ursache: Bei `curl ... | sh` liest die Shell das Skript aus STDIN. apt startet auf Ubuntu `needrestart` (Meldung "Scanning processes... / Scanning linux images..."), und das liest stdin — damit war der Rest des Skripts weg. Die Shell setzte mitten im Quelltext fort. Bei x22 trat es nicht auf, weil Telegraf dort schon installiert war (kein apt-Lauf). Fix, drei Schutzschichten: 1. Re-Exec: laeuft das Skript ueber eine Pipe, laedt es sich frisch von der Quelle und startet sich neu — mit stdin auf /dev/null. NICHT per cat von stdin kopieren: die Shell puffert bereits, die Kopie waere unvollstaendig. 2. NEEDRESTART_MODE=a + DEBIAN_FRONTEND=noninteractive fuer alle apt-Aufrufe. 3. /dev/null 2>&1 && \ + curl -fsSL "$_src/install.sh" -o "$_self" 2>/dev/null && [ -s "$_self" ]; then + chmod 0700 "$_self" + # stdin ausdruecklich auf /dev/null: der Prozess erbt sonst die Pipe, und + # apt/needrestart koennte weiter daraus lesen. + NETBIRD_TG_REEXEC=1 REPO_RAW="$_src" sh "$_self" "$@" < /dev/null + _rc=$? + rm -f "$_self" + exit "$_rc" + fi + # Kein curl oder Download fehlgeschlagen: weiter wie bisher. Dann bleibt das + # Risiko, aber der Installer laeuft wenigstens (z. B. in einer Umgebung ohne + # Netz beim zweiten Aufruf). + rm -f "$_self" +fi +# ============================================================================ # NetBird Observability — Telegraf Node Installer (Linux) # # Installiert Telegraf als systemd-Dienst und verbindet die Node fest mit dem @@ -425,13 +463,22 @@ fi # Installation # -------------------------------------------------------------------------- install_apt() { - command -v gpg >/dev/null || { apt-get update -qq; apt-get install -y -qq gnupg >/dev/null; } - command -v curl >/dev/null || apt-get install -y -qq curl >/dev/null + # ZWEITE SCHUTZSCHICHT gegen den stdin-Fraß: + # `needrestart` (Ubuntu-Standard) liest stdin und meldet + # "Scanning processes... / Scanning linux images...". Mit NEEDRESTART_MODE=a + # laeuft es nicht-interaktiv, und die apt-Optionen halten dpkg davon ab, + # Prompts zu stellen. Der Re-Exec oben schuetzt die Shell — diese Zeile + # schuetzt zusaetzlich den Installer-Ablauf selbst. + export NEEDRESTART_MODE=a + export DEBIAN_FRONTEND=noninteractive + APT_OPTS="-y -qq -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold" + command -v gpg >/dev/null || { apt-get update -qq; apt-get install $APT_OPTS gnupg >/dev/null; } + command -v curl >/dev/null || apt-get install $APT_OPTS curl >/dev/null mkdir -p /etc/apt/keyrings curl -fsSL https://repos.influxdata.com/influxdata-archive.key | gpg --dearmor --yes -o /etc/apt/keyrings/influxdata-archive.gpg echo "deb [signed-by=/etc/apt/keyrings/influxdata-archive.gpg] https://repos.influxdata.com/debian stable main" > /etc/apt/sources.list.d/influxdata.list apt-get update -qq - DEBIAN_FRONTEND=noninteractive apt-get install -y -qq telegraf >/dev/null + apt-get install $APT_OPTS telegraf >/dev/null } install_rpm() { cat > /etc/yum.repos.d/influxdata.repo <<'EOF' @@ -442,7 +489,13 @@ enabled = 1 gpgcheck = 1 gpgkey = https://repos.influxdata.com/influxdata-archive.key EOF - if command -v dnf >/dev/null; then dnf install -y -q telegraf; else yum install -y -q telegraf; fi + # dnf/yum lesen ebenfalls stdin (Prompts, Plugin-Rueckfragen) -> hier mit + # -y und ohne Assumeyes-Rueckfrage, damit nichts aus der Pipe greift. + if command -v dnf >/dev/null; then + dnf install -y -q telegraf < /dev/null + else + yum install -y -q telegraf < /dev/null + fi } install_static() { command -v curl >/dev/null || die "curl fehlt." @@ -499,7 +552,7 @@ else case "$OS_ID" in debian|ubuntu|raspbian|linuxmint|pop) install_apt ;; rhel|centos|rocky|almalinux|fedora|ol) install_rpm ;; - alpine) apk add --no-cache -q curl ca-certificates; install_static ;; + alpine) apk add --no-cache -q curl ca-certificates < /dev/null; install_static ;; *) if command -v apt-get >/dev/null; then install_apt elif command -v dnf >/dev/null || command -v yum >/dev/null; then install_rpm else install_static; fi ;; @@ -524,11 +577,13 @@ grant_apache_log_access() { id "$_u" >/dev/null 2>&1 || return 0 if ! command -v setfacl >/dev/null 2>&1; then # acl-Paket nachziehen, sonst ist die Rechtevergabe nicht moeglich. + # Alle Paketmanager mit /dev/null; then - DEBIAN_FRONTEND=noninteractive apt-get install -y -qq acl >/dev/null 2>&1 || true - elif command -v dnf >/dev/null; then dnf install -y -q acl >/dev/null 2>&1 || true - elif command -v yum >/dev/null; then yum install -y -q acl >/dev/null 2>&1 || true - elif command -v apk >/dev/null; then apk add --no-cache -q acl >/dev/null 2>&1 || true + NEEDRESTART_MODE=a DEBIAN_FRONTEND=noninteractive \ + apt-get install -y -qq acl /dev/null 2>&1 || true + elif command -v dnf >/dev/null; then dnf install -y -q acl /dev/null 2>&1 || true + elif command -v yum >/dev/null; then yum install -y -q acl /dev/null 2>&1 || true + elif command -v apk >/dev/null; then apk add --no-cache -q acl /dev/null 2>&1 || true fi fi if ! command -v setfacl >/dev/null 2>&1; then