Es gibt kein Wort Spaltung (wie in dem Merkmal , dass Splits Variablen auf nicht notierte Erweiterungen) in diesem Code als $myvar
nicht unquoted wird.
Es gibt jedoch eine Sicherheitsanfälligkeit bezüglich Befehlsinjektion, die $myvar
erweitert wird, bevor sie an übergeben wird bash
. Sein Inhalt wird also als Bash-Code interpretiert!
Leerzeichen dort führen dazu, dass mehrere Argumente übergeben werden cd
, nicht aufgrund der Wortaufteilung , sondern weil sie in der Shell-Syntax als mehrere Token analysiert werden. Mit einem Wert von bye;reboot
wird das neu gestartet! ¹
Hier möchten Sie:
sudo bash -c 'cd -P -- "$1"' bash "$myvar"
(wo Sie den Inhalt von $myvar
als erstes Argument dieses Inline-Skripts übergeben; beachten Sie, wie beide $myvar
und $1
für ihre jeweilige Shell zitiert wurden, um das Aufteilen von IFS-Wörtern (und das Globbing) zu verhindern).
Oder:
sudo MYVAR="$myvar" bash -c 'cd -P -- "$MYVAR"'
(wo Sie den Inhalt $myvar
einer Umgebungsvariablen übergeben).
Natürlich werden Sie nichts Nützliches erreichen, wenn Sie nur cd
in diesem Inline-Skript ausgeführt werden (außer zu prüfen, ob dies möglich root
ist cd
). Vermutlich möchten Sie das Skript cd
dort und dann dort etwas anderes tun wie:
sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"
Wenn die Absicht war , zu verwenden , sudo
um die Lage sein , cd
in ein Verzeichnis , das Sie sonst keinen Zugang zu, dann das kann nicht wirklich funktionieren.
sudo sh -c 'cd -P -- "$1" && exec bash' sh "$myvar"
startet ein interaktives bash
mit seinem aktuellen Verzeichnis in $myvar
. Aber diese Shell wird als ausgeführt root
.
Du könntest es tun:
sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
Um eine nicht privilegierte Interaktion bash
mit dem aktuellen Verzeichnis zu erhalten $myvar
, aber wenn Sie überhaupt nicht die Berechtigung hatten, cd
in dieses Verzeichnis zu gelangen, können Sie in diesem Verzeichnis nichts tun, selbst wenn es Ihr aktuelles Arbeitsverzeichnis ist.
$ myvar=/var/spool/cron/crontabs
$ sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
bash-4.4$ ls
ls: cannot open directory '.': Permission denied
Eine Ausnahme wäre, wenn Sie über eine Suchberechtigung für das Verzeichnis selbst verfügen, jedoch nicht für eine der Verzeichniskomponenten seines Pfads:
$ myvar=1/2
$ mkdir -p "$myvar"
$ chmod 0 1
$ cd 1/2
cd: permission denied: 1/2
$ sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
bash-4.4$ pwd
/home/stephane/1/2
bash-4.4$ mkdir 3
bash-4.4$ ls
3
bash-4.4$ cd "$PWD"
bash: cd: /home/stephane/1/2: Permission denied
¹ Genau genommen würde es für Werte $myvar
wie $(seq 10)
(wörtlich) natürlich zu einer Wortaufteilung kommen, wenn diese Befehlssubstitution durch die bash
Shell als erweitert wirdroot
cd
nur Wirkung innerhalb derbash -c
Schale.