unix - salir - script en shell
¿Cómo se usa newgrp en un script y luego se queda en ese grupo cuando el script sale? (7)
El comando newgrp
solo puede usarse de manera significativa desde un shell interactivo, AFAICT. De hecho, me di por vencido sobre ... bueno, digamos hace mucho tiempo que el reemplazo que escribí ahora es elegible para votar tanto en el Reino Unido como en los Estados Unidos.
Tenga en cuenta que newgrp
es un comando especial ''integrado'' en el shell. Estrictamente, es un comando que es externo al shell, pero el shell tiene un conocimiento incorporado sobre cómo manejarlo. El caparazón realmente exec
el programa, por lo que obtienes un nuevo caparazón inmediatamente después. También es un programa raíz setuid. En Solaris, al menos, newgrp
también parece ignorar la variable de entorno SHELL.
Tengo una variedad de programas que newgrp
el problema que newgrp
abordar newgrp
. Recuerde, el comando es anterior a la capacidad de los usuarios para pertenecer a múltiples grupos a la vez (consulte los Manuales de la Versión 7 de Unix ). Como newgrp
no proporciona un mecanismo para ejecutar comandos después de su ejecución, a diferencia de su
o sudo
, escribí un programa newgid
que, como newgrp
, es un programa raíz setuid y le permite cambiar de un grupo a otro. Es bastante simple: solo main () más un conjunto de funciones de informe de error estandarizadas. Ponte en contacto conmigo (primer punto por último en punto com de gmail) para la fuente. También tengo un comando mucho más peligroso llamado '' asroot
'' que me permite (pero solo a mí, bajo la compilación predeterminada) ajustar las listas de usuarios y grupos mucho más a fondo.
asroot: Configured for use by jleffler only
Usage: asroot [-hnpxzV] [<uid controls>] [<gid controls>] [-m umask] [--] command [arguments]
<uid controls> = [-u usr|-U uid] [-s euser|-S euid][-i user]
<gid controls> = [-C] [-g grp|-G gid] [-a grp][-A gid] [-r egrp|-R egid]
Use -h for more help
Option summary:
-a group Add auxilliary group (by name)
-A gid Add auxilliary group (by number)
-C Cancel all auxilliary groups
-g group Run with specified real GID (by name)
-G gid Run with specified real GID (by number)
-h Print this message and exit
-i Initialize UID and GIDs as if for user (by name or number)
-m umask Set umask to given value
-n Do not run program
-p Print privileges to be set
-r euser Run with specified effective UID (by name)
-R euid Run with specified effective UID (by number)
-s egroup Run with specified effective GID (by name)
-S egid Run with specified effective GID (by number)
-u user Run with specified real UID (by name)
-U uid Run with specified real UID (by number)
-V Print version and exit
-x Trace commands that are executed
-z Do not verify the UID/GID numbers
Mnemonic for effective UID/GID:
s is second letter of user;
r is second letter of group
(Este programa creció: si lo rehacía desde cero, aceptaría la identificación de usuario o el nombre de usuario sin requerir diferentes letras de opción; ídem para identificación de grupo o nombre de grupo).
Puede ser complicado obtener permiso para instalar los programas raíz de setuid. Hay algunas soluciones disponibles ahora debido a las instalaciones de varios grupos. Una técnica que puede funcionar es establecer el bit setgid en los directorios donde desea crear los archivos. Esto significa que independientemente de quién crea el archivo, el archivo pertenecerá al grupo que posee el directorio. Esto a menudo logra el efecto que necesita, aunque conozco a pocas personas que lo usan de manera consistente.
Estoy ejecutando un script en un cuadro de Solaris. específicamente SunOS 5.7. Yo no soy root Estoy tratando de ejecutar un script similar al siguiente:
newgrp thegroup << FOO
fuente .login_stuff
echo "hola mundo"
FOO
El script se ejecuta. El problema es que regresa al proceso de llamada que me coloca en el antiguo grupo con la fuente .login_stuff no siendo de origen. Entiendo este comportamiento Lo que estoy buscando es una forma de permanecer en el submarino. Ahora sé que podría poner un xterm y (ver más abajo) en el script y eso lo haría, pero tener un nuevo xterm no es deseable.
Pasando tu pid actual como parámetro.
newgrp thegroup << FOO
fuente .login_stuff
xterm y
echo $ 1
matar -9 $ 1
FOO
No tengo sg disponible. Además, newgrp es necesario.
Podría usar sh & (o cualquier shell que quiera usar) en lugar de xterm y
O también podría considerar usar un alias (si su caparazón lo admite) para que permanezca en el contexto del caparazón actual.
Tal vez
exec $SHELL
haría el truco?
Lo siguiente funciona bien; pon el siguiente bit en la parte superior del script (Bourne o Bash):
### first become another group
group=admin
if [ $(id -gn) != $group ]; then
exec sg $group "$0 $*"
fi
### now continue with rest of the script
Esto funciona bien en Linuxen. Una advertencia: los argumentos que contienen espacios se rompen. Le sugiero que use el env arg1 = ''valor 1'' arg2 = ''valor 2'' script.sh constructo para pasarlos (no pude conseguir que funcione con $ @ por alguna razón)
Este ejemplo se expandió a partir de la respuesta de plinjzaad; maneja una línea de comando que contiene parámetros cotizados que contienen espacios.
#!/bin/bash
group=wg-sierra-admin
if [ $(id -gn) != $group ]
then
# Construct an array which quotes all the command-line parameters.
arr=("${@/#//"}")
arr=("${arr[*]/%//"}")
exec sg $group "$0 ${arr[@]}"
fi
### now continue with rest of the script
# This is a simple test to show that it works.
echo "group: $(id -gn)"
# Show all command line parameters.
for i in $(seq 1 $#)
do
eval echo "$i:/${$i}"
done
Lo usé para demostrar que funciona.
% ./sg.test ''a b'' ''c d e'' f ''g h'' ''i j k'' ''l m'' ''n o'' p q r s t ''u v'' ''w x y z''
group: wg-sierra-admin
1:a b
2:c d e
3:f
4:g h
5:i j k
6:l m
7:n o
8:p
9:q
10:r
11:s
12:t
13:u v
14:w x y z
newgrp adm << ANYNAME
# You can do more lines than just this.
echo This is running as group /$(id -gn)
ANYNAME
..will salida:
This is running as group adm
Tenga cuidado: asegúrese de escapar de ''$'' con una barra inclinada. Las interacciones son un poco extrañas, ya que expande incluso comillas simples antes de ejecutar el shell como el otro grupo. entonces, si su grupo principal es ''usuarios'', y el grupo que está tratando de usar es ''adm'', entonces:
newgrp adm << END
# You can do more lines than just this.
echo ''This is running as group $(id -gn)''
END
..will salida:
This is running as group users
... porque ''id -gn'' fue ejecutado por el shell actual y luego enviado al que se ejecuta como adm. De todos modos, sé que esta publicación es antigua, pero espero que esto sea útil para alguien.
En un archivo de script, por ejemplo, tst.ksh:
#! /bin/ksh
/bin/ksh -c "newgrp thegroup"
En la línea de comando:
>> groups fred
oldgroup
>> tst.ksh
>> groups fred
thegroup