Es gibt kein Wort Spaltung (wie in dem Merkmal , dass Splits Variablen auf nicht notierte Erweiterungen) in diesem Code als $myvarnicht unquoted wird.
Es gibt jedoch eine Sicherheitsanfälligkeit bezüglich Befehlsinjektion, die $myvarerweitert 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;rebootwird das neu gestartet! ¹
Hier möchten Sie:
sudo bash -c 'cd -P -- "$1"' bash "$myvar"
(wo Sie den Inhalt von $myvarals erstes Argument dieses Inline-Skripts übergeben; beachten Sie, wie beide $myvarund $1fü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 $myvareiner 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 rootist cd). Vermutlich möchten Sie das Skript cddort und dann dort etwas anderes tun wie:
sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"
Wenn die Absicht war , zu verwenden , sudoum die Lage sein , cdin 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 bashmit 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 bashmit dem aktuellen Verzeichnis zu erhalten $myvar, aber wenn Sie überhaupt nicht die Berechtigung hatten, cdin 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 $myvarwie $(seq 10)(wörtlich) natürlich zu einer Wortaufteilung kommen, wenn diese Befehlssubstitution durch die bash Shell als erweitert wirdroot
cdnur Wirkung innerhalb derbash -cSchale.