Tengo dos usuarios y grupos en Unix: user1:user1
y user2:user2
.
Tengo un directorio myDirectory
con los detalles a continuación ( ls -ltr
)
drwxr-xr-x. 4 user2 user2 35 Apr 27 10:16 myDirectory
Ahora estoy ejecutando un script myScript.sh
como user1
:
#!/bin/sh
whoami
if [ -f /myDirectory/*.tar.gz ]
then
rm -f /myDirectory/*.tar.gz
fi
cp -f someDirectory/*.tar.gz /myDirectory/
Sin embargo, aparece el siguiente error:
cp: cannot create regular file ‘/myDirectory/myTar.tar.gz’: Permission denied
¿Qué estoy haciendo mal? ¿Cómo puedo arreglar esto?
Respuesta1
Puedes hacer esto con permisos de grupo. Debe crear un grupo de usuarios, agregar los dos usuarios y cambiar la propiedad del grupo del directorio de destino. Primero, crea un grupo:
groupadd newusergroup
Luego agregue los usuarios:
usermod -G newusergroup user1
usermod -G newusergroup user2
Luego cambie los permisos en el directorio de destino:
chgrp newusergroup /myDirectory
Todo esto supone que desea que ambos usuarios tengan acceso al directorio. Si solo desea que el usuario1 tenga acceso, simplemente cambie los permisos de esta manera:
chown user1.user1 /myDirectory
Respuesta2
Los group
permisos mydirectory
se interponen en su forma de eliminar o crear un archivo en ese directorio.
como user1
ejecutar el siguiente comando primero:
chmod g+w mydirectory
Respuesta3
Sería mejor si el usuario que necesita escribir, es decir, el usuario al que estás copiandoa, ejecutó el script. De esa manera, no tendría que otorgar permisos especiales de escritura en el directorio de destino.
Además, la prueba
if [ -f /myDirectory/*.tar.gz ]
es defectuoso. La -f
prueba toma un argumento, pero si el patrón coincide con varios archivos, se pasan varios argumentos. Como desea vaciar el directorio myDirectory
de archivos comprimidos tar
, basta con
rm -f /myDirectory/*.tar.gz
La -f
marca rm
hará que no se produzcan errores si no hay archivos para eliminar.
Respuesta4
Bueno, veo muchos errores:
- No está permitido escribir en
myDirectory
. Sólouser2
se permite escribir allí. - Estás mezclando rutas absolutas con relativas.
/myDirectory
es un directorio diferente almyDirectory
. Esto también podría causar el error de permiso denegado, porque su script está intentando copiarlo en la carpeta raíz del sistema de archivosmyDirectory
. SimyDirectory
es relativo a la ruta desde la ruta de la línea de comando actual (en cuyo contexto se llama el script), entonces./myDirectory
sería correcto. De lo contrario, considere brindarnos información más detallada sobre dóndemyDirectory
se encuentra realmente. Esto es importante porque el alcance de la ruta relativamyDirectory
puede diferir de varias maneras. Sin conocer su caso explícito, una respuesta relacionada con esto sería solo una respuesta general, que podría no ser aplicable a su caso específico. - La expresión de condición
[
y]
solo está disponible enBash
, no enShell
. La definición deShell
depende también de su sistema UNIX actual. Normalmente, en Linux apunta aBash
, porque Linux no tiene una implementación directaShell
, ni BSD la tiene. Sólo Mac tiene su propiaShell
implementación directa. Por lo tanto,Shell
es sólo un estándar UNIX teórico, que hoy en día termina en muchos dialectos e interpretaciones diferentes de ese documento teórico, que realmente depende de su sistema UNIX actual. Por lo tanto, utilice mejor directamenteBash
. Esto funciona al 100 % en la mayoría de las plataformas UNIX. No conozco ningún sistema UNIX en el que Bash no esté disponible.
Algunos otros puntos interesantes en los que pensar: Es posible que desees agregar varios grupos, que son user1
y user2
. Luego puede cambiar el grupo de carpetas principal myDirectory
a ese grupo. Hasta donde yo sé, ese es el enfoque común al respecto.
También puedes usar Bash a través del /usr/bin/env
comando shebang, lo que garantiza que realmente termines en cualquier Bash:
#!/usr/bin/env bash
Este también es un buen enfoque para otros lenguajes de script como perl, php, etc.