man su
dice:
You can use the -- argument to separate su options from the arguments
supplied to the shell.
man bash
dice:
-- 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 --.
Pues bien, veamos:
[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
Lo que esperaba (la salida del segundo comando difiere):
[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
Probablemente no sea un gran problema. ¿Pero qué está pasando allí? La segunda y la tercera variantes parecen ser el camino a seguir, pero una de ellas no funciona. El cuarto parece poco confiable, -
puede tratarse como su
una opción.
bash 4.2.45
tanto en las cuentas de origen como en las de destino.Respuestas:
Lo que está sucediendo es que el primer argumento que proporciona al shell es el
$0
parámetro, (generalmente este sería el nombre del shell). No se incluye cuando lo hace,echo $*
ya que$*
es cada argumento aparte de$0
.Ejemplo:
Actualizar
Haciendo el siguiente comando:
rinde la línea de strace:
Entonces, de alguna manera, parece que en este caso
su
está engullendo el extra--
sin pasarlo a bash, posiblemente debido a un error (o al menos un comportamiento indocumentado). Sin embargo, no comerá más de dos de los--
argumentos:fuente
su - yuri -c 'echo "$*"' -- -- 1 2 3
supuestamente el shell obtiene-- 1 2 3
, pero solo sale2 3
. ¿Tiene sentido?bash -c 'echo $*' -- 1 2 3
, sale1 2 3
como se esperaba.su
error.En realidad, la respuesta de @ Graeme, y su pregunta, solo hacen referencia a los efectos secundarios de cómo maneja el shell.
"$@positional $*parameters".
Estos son asignados por el shell a sus argumentos al invocarlos y en cualquier momento posterior con laset
utilidad incorporada . Pueden ser llamados en cualquier momento, ya sea"$*"
que divide cada posicional con el primer carácter"$IFS"
o"$@"
que cita cada posicional y los divide con todos"$IFS."
Si ya tiene los valores que está alimentando al shell, no es necesario que lo haga
--
tres veces. Los parámetros de Shell sonset
capaces, siempre, en cualquier momento, no solo en la invocación (excepto $ 0 y -i):Y todas esas citas de shell pueden ser confusas. Esto simplifica un poco las cosas:
Los argumentos del shell principal son
set
4, 5 y 6 y luego se pasan al subshell invocado porsu
el posicionalparameter "$@array".
Tenga en cuenta cómo uso
( subshell )
el comando anterior: lo hago porque no quiero perder el tiempo con mi entorno actual de shell, porque puedo cambiar inadvertidamente algo que preferiría no hacerlo si lo hiciera conset.
ACERCA DE LA REDIRECCIÓN:
En primer lugar, su sistema Unix funciona con archivos: permisos de archivo, contenido de archivo, atributos de archivo. De una forma u otra, cada objeto de datos que usa puede (y, al menos en mi opinión, debería) abordarse como un archivo. La redirección apunta a un archivo, eso es todo. A
<<HERE-DOCUMENT
describirá un archivo en línea y luego lo redirigirá. O las expansiones de shell se interpretan o no.El autor de la pregunta señala en los comentarios a continuación que cuando intenta utilizar este método como
root
usuario, recibe un error de permisos. Cuando respondí, le sugerí élchown
ochgrp
el/dev/fd/${num}
archivo especial, pero este probablemente no sea el mejor método. La razón se encuentra con este problema esroot
se concederead
permisos pero noexecute
permisos. Puede manejar esto fácilmente evitando unaexec
llamada. En lugar de invocar el/dev/fd/${num}
archivo directamente en la línea de comando, haga lo siguiente:El uso de dos heredocs puede ayudar a escapar. Esto es lo que sucede en todos los casos:
NO ESTABLECIDO EN
<<HEREDOC
SALIDA
SET
"$@"
IN<<HEREDOC
SALIDA
SET
"$@"
Y MÁS EN<<HEREDOC
SALIDA
fuente
"8 9\n4 5 6\n"
. Estoy corriendodebian 6
,bash-4.1.5
ysu
.root
que dice:-su: /dev/fd/4: Permission denied
. ¿Sabes lo que eso significa, por cierto? De lo contrario, sale como usted dice, pero no aborda la pregunta. La pregunta es sobre el uso de--
y-
.chown /dev/fd/4
durante el tiempo que va a necesitar, o simplementechgrp
. No tengo mucho tiempo para probar en este momento. Pero eso es un poco irrelevante, al igual que el otro, no necesita pasar argumentos al final de la cola, solo trabaje en su cita. ¿Vealo Ahora?su
no poder trabajar con redireccionadosstdin
, pasar argumentos es aún mejor que inyectarlos en el comando. Porque en el último caso necesitas escapar de ellos.