man su
dit:
You can use the -- argument to separate su options from the arguments
supplied to the shell.
man bash
dit:
-- A -- signals the end of options and disables further option
processing. Any arguments after the -- are treated as filenames
and arguments. An argument of - is equivalent to --.
Eh bien, voyons:
[root ~] su - yuri -c 'echo "$*"' -- 1 2 3
2 3
[root ~] su - yuri -c 'echo "$*"' -- -- 1 2 3
2 3
[root ~] su - yuri -c 'echo "$*"' -- - 1 2 3
1 2 3
[root ~] su - yuri -c 'echo "$*"' - 1 2 3
1 2 3
Ce que j'attendais (la sortie de la deuxième commande diffère):
[root ~] su - yuri -c 'echo "$*"' -- 1 2 3
2 3
[root ~] su - yuri -c 'echo "$*"' -- -- 1 2 3
1 2 3
[root ~] su - yuri -c 'echo "$*"' -- - 1 2 3
1 2 3
[root ~] su - yuri -c 'echo "$*"' - 1 2 3
1 2 3
Probablement pas vraiment un problème. Mais que se passe-t-il là-bas? Les deuxième et troisième variantes semblent être la voie à suivre, mais l'une d'elles ne fonctionne pas. Le quatrième semble peu fiable, -
peut être traité comme su
une option.
bash 4.2.45
sur les comptes source et de destination.Réponses:
Ce qui se passe, c'est que le premier argument que vous fournissez au shell est le
$0
paramètre (généralement ce serait le nom du shell). Il n'est pas inclus lorsque vous le faitesecho $*
car$*
chaque argument est différent de$0
.Exemple:
Mise à jour
Effectuez la commande suivante:
donne la ligne de strace:
Donc, il semble que dans ce cas, il
su
engloutisse le supplément--
sans le passer à bash, probablement en raison d'un bug (ou du moins d'un comportement non documenté). Il ne va cependant pas ronger plus de deux des--
arguments:la source
su - yuri -c 'echo "$*"' -- -- 1 2 3
:, le shell est censé être obtenu-- 1 2 3
, mais uniquement les sorties2 3
. Cela a-t-il même un sens?bash -c 'echo $*' -- 1 2 3
, il sort1 2 3
comme prévu.su
bug.En fait, la réponse de @ Graeme - et votre question - ne font que référencer les effets secondaires de la façon dont le shell les gère.
"$@positional $*parameters".
Ils sont attribués par le shell à ses arguments lors de l'invocation et à tout moment plus tard avec l'set
utilitaire intégré . Ils peuvent être appelés à tout moment avec soit"$*"
qui divise chaque position avec le premier caractère,"$IFS"
soit"$@"
qui cite chaque position et les divise avec tous les"$IFS."
Si vous avez déjà les valeurs que vous alimentez le shell, vous n'avez pas besoin de
--
trois fois. Les paramètres du shell sontset
capables - toujours, à tout moment, pas seulement à l'appel (sauf $ 0 et -i):Et toutes ces citations peuvent être déroutantes. Cela simplifie un peu les choses:
Les arguments du shell parent sont
set
à 4, 5 et 6 et sont ensuite passés au sous-shell invoqué parsu
via le positionnelparameter "$@array".
Notez comment je
( subshell )
la commande ci-dessus - je le fais parce que je ne veux pas jouer avec mon environnement shell actuel - parce que je peux changer par inadvertance quelque chose que je préfère ne pas si je le faisais avecset.
À PROPOS DE LA REDIRECTION:
Tout d'abord, votre système Unix fonctionne avec des fichiers - autorisations de fichier, contenu de fichier, attributs de fichier. D'une manière ou d'une autre, chaque objet de données que vous utilisez peut (et, à mon avis du moins, devrait) être traité comme un fichier. La redirection pointe vers un fichier - c'est tout. A
<<HERE-DOCUMENT
décrira un fichier en ligne puis le redirigera. Soit les extensions de shell sont interprétées, soit elles ne le sont pas.Le demandeur note dans les commentaires ci-dessous que lorsqu'il tente d'utiliser cette méthode en tant
root
qu'utilisateur, il reçoit une erreur d'autorisation. Quand j'ai répondu, j'ai suggéré luichown
ouchgrp
le/dev/fd/${num}
fichier spécial, mais ce n'est probablement pas la meilleure méthode. La raison pour laquelle il rencontre cette questionroot
est accordé desread
autorisations , mais pasexecute
les autorisations. Vous pouvez facilement gérer cela en évitant simplement unexec
appel. Au lieu d'invoquer le/dev/fd/${num}
fichier directement sur la ligne de commande, procédez comme suit:L'utilisation de deux heredocs peut vous aider à vous échapper. Voici ce qui se passe dans tous les cas:
PAS D'INSTALLATION
<<HEREDOC
PRODUCTION
SET
"$@"
IN<<HEREDOC
PRODUCTION
ENSEMBLE
"$@"
ET PLUS EN<<HEREDOC
PRODUCTION
la source
"8 9\n4 5 6\n"
. Je coursdebian 6
,bash-4.1.5
etsu
.root
il dit:-su: /dev/fd/4: Permission denied
. Tu sais ce que ça veut dire, au fait? Sinon, il sort comme vous le dites, mais il ne répond pas à la question. La question concerne l'utilisation de--
et-
.chown /dev/fd/4
pour la durée dont vous en aurez besoin, ou tout simplementchgrp
. Je n'ai pas beaucoup de temps pour tester en ce moment. Mais c'est un peu à côté du point, comme pour l'autre, vous n'avez pas besoin de passer d'arguments à la fin - travaillez simplement votre citation. Voyez maintenant?su
ne pas pouvoir travailler avec redirigéstdin
, passer des arguments est encore mieux que de les injecter dans la commande. Parce que dans ce dernier cas, vous devez leur échapper.