Führen Sie expect in einem Bash-Skript als ein anderer Benutzer aus

Führen Sie expect in einem Bash-Skript als ein anderer Benutzer aus

Ich schreibe ein Bash-Skript, um eine kleine Software zu installieren, die ich gerade entwickle. Dieses Skript wird sudo(als Root) ausgeführt, aber einige der vom Skript ausgeführten Befehle müssen (oder sollten) mit einem normalen Benutzer ausgeführt werden, dessen Namen ich in der $userNameVariable behalte. Die meisten Befehle sind Einzeiler und su -c "/what/ever/command" $userNamefunktionieren gut genug.

Einer dieser Befehle, den ich jedoch nicht ausführen möchte, rootwird mich Dinge fragen (eigentlich nur eine Sache, aber viele Male: ob er eine vorhandene Datei überschreiben soll oder nicht). Dieser Befehl, den ich vielleicht " baaad_command" nenne, hat keine Option, eine Standardantwort bereitzustellen (es gibt kein " --assume-no" oder ähnliches).

Die einzige Möglichkeit, die ich für machbar halte, ist die Nutzung dererwartenBefehl, und antworte " n\r" jedes Mal, wenn der Befehl eine Zeichenfolge ausgibt, die mit " Overwrite" beginnt, ich möchte, dass mein Skript n\rso oft mit Nein (also " ") antwortet, wie baaad_command verlangt"Overwrite... ? [y/n]"

Ich habe viele verschiedene Kombinationen von su, spawn, expect ... ausprobiert, ohne Erfolg.

Dies ist mein vorerst letzter Versuch:

#!/bin/bash
if [[ -d "$destinationFolder" ]] ; then
    if [[ -n "$userName" ]] ; then
        spawned=$(su -c expect -c "
            spawn baaad_command --user \"foo\" --passwd \"bar\" \"$destinationFolder\"
             expect {
                 Overwrite: { send \"n\r\"; exp_continue }
                 eof { exit }
             }
        " )
    else
        echo "Don't have a non-root username to install baaad_command with. Skipping"
        exit 3
    fi
else
        echo "$destinationFolder directory not found in $(pwd). Can't continue"
        exit 2
fi

Es weist im Vergleich zu den anderen 200 Versuchen keine bemerkenswerten Unterschiede auf … es ist einfach zufällig das letzte.

Jeder Hinweis wird sehr geschätzt. Vielen Dank im Voraus.

Antwort1

Sie müssen wahrscheinlich su -c 'expect -c "spawn ..."'– verwenden. Beachten Sie die zusätzlichen Anführungszeichen.

verwandte Informationen