Script de Shell realizado por un usuario para copiar un archivo en un directorio propiedad de un usuario diferente

Script de Shell realizado por un usuario para copiar un archivo en un directorio propiedad de un usuario diferente

Tengo dos usuarios y grupos en Unix: user1:user1y user2:user2.

Tengo un directorio myDirectorycon 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.shcomo 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 grouppermisos mydirectoryse interponen en su forma de eliminar o crear un archivo en ese directorio.

como user1ejecutar 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 -fprueba toma un argumento, pero si el patrón coincide con varios archivos, se pasan varios argumentos. Como desea vaciar el directorio myDirectoryde archivos comprimidos tar, basta con

rm -f /myDirectory/*.tar.gz

La -fmarca rmhará que no se produzcan errores si no hay archivos para eliminar.

Respuesta4

Bueno, veo muchos errores:

  1. No está permitido escribir en myDirectory. Sólo user2se permite escribir allí.
  2. Estás mezclando rutas absolutas con relativas. /myDirectoryes un directorio diferente al myDirectory. 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 archivos myDirectory. Si myDirectoryes relativo a la ruta desde la ruta de la línea de comando actual (en cuyo contexto se llama el script), entonces ./myDirectorysería correcto. De lo contrario, considere brindarnos información más detallada sobre dónde myDirectoryse encuentra realmente. Esto es importante porque el alcance de la ruta relativa myDirectorypuede 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.
  3. La expresión de condición [y ]solo está disponible en Bash, no en Shell. La definición de Shelldepende también de su sistema UNIX actual. Normalmente, en Linux apunta a Bash, porque Linux no tiene una implementación directa Shell, ni BSD la tiene. Sólo Mac tiene su propia Shellimplementación directa. Por lo tanto, Shelles 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 directamente Bash. 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 user1y user2. Luego puede cambiar el grupo de carpetas principal myDirectorya 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/envcomando 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.

información relacionada