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 $userName
Variable behalte. Die meisten Befehle sind Einzeiler und su -c "/what/ever/command" $userName
funktionieren gut genug.
Einer dieser Befehle, den ich jedoch nicht ausführen möchte, root
wird 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\r
so 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.