Cambiar los permisos al subir con scp

44

Estoy cargando archivos a mi cuenta de shell usando scp. Como necesito permisos diferentes en el servidor que en mi computadora, me gustaría tener una forma de cambiar fácilmente los permisos al cargarlos sin necesidad de enviar ssh a la cuenta y cambiarlos manualmente.

Florian Mayer
fuente

Respuestas:

29

Si está copiando desde una máquina Windows, puede usar WinSCP para copiar, y tiene una opción para establecer los permisos en los archivos copiados después de la carga.

Si no, creo que su única opción es ejecutar un chmod en el servidor después de la carga, lo que podría hacer de forma remota con un comando ssh:

scp /path/to/file server:/server/path/to/file
ssh server chmod 644 /server/path/to/file
zigdon
fuente
También pensé en eso, ¿qué hay de subir directorios entonces?
Florian Mayer
Hm, podría hacer chmod -R entonces. No es una mala idea, supongo.
Florian Mayer
1
Correcto. scp -r, luego ssh chmod -R
zigdon
1
También tuve éxito haciendo lo mismo con plink y pscp (del paquete de masilla)
stevepastelan
22

Mi solución de trabajo preferida sería usar rsyncen su lugar:

Reemplazar:

scp /path/to/file server:/server/path/to/file

Con:

rsync --chmod=u+rwx,g+rwx,o+rwx /path/to/file server:/path/to/file

Esto evita que se autentique dos veces. También hay muchas otras opciones con rsync que probablemente agregarían valor, como poder preservar el propietario, el grupo, etc.

JRomero
fuente
Esto no está funcionando.
soham
1
Descubrí la causa. Tienes que usar --permstambién. explainshell.com/...
soham
55
¿Podría mostrar el comando completo, válido, pelase? Ya sea como comentario o editando la respuesta
Mawg
6

He hecho algunos experimentos con scp. Para los archivos nuevos cargados en el servidor de destino, los archivos tienen los mismos permisos que en el servidor de origen. Si los archivos existentes se sobrescriben en el servidor de destino, los permisos para esos archivos no cambian.

He hecho estos experimentos con CentOS 4.6.

Jingguo Yao
fuente
3
Esto debería ser un comentario en lugar de una respuesta
Jaime Hablutzel
2
Envejecido (pero realmente ayudó ;-)
Mawg
Esto es lo que estoy tratando de solucionar de una vez a través del script. Rsync no siempre está en el servidor de destino y prefiero que el script que proporcione no se tome libertades con apt / yum, etc. para instalar rsync. Parece que tendré que seguir el método scp + chmod o rm + scp para asegurar que los permisos sean correctos. : - /
zaTricky
5

Puede hacerlo usando tar, ssh y umask de esta manera:

en el host 1:

[saml@host1 testdir]$ pwd
/tmp/testdir

[saml@host1 testdir]$ ls -l
total 12
-rw-r--r--  1 saml saml 21 May 19 00:21 file1
-rw-r--r--  1 saml saml 48 May 19 00:21 file2
-rw-r--r--  1 saml saml 28 May 19 00:21 file3

[saml@host1 testdir]$ tar cvf - . | (ssh host2 "umask 0277; cd /tmp/testdir;tar xvf -")
./
./file1
./file2
./file3
./
./file1
./file2
./file3

en host2:

[samr@host2 testdir]$ pwd
/tmp/testdir

[samr@host2 testdir]$ ls -l
total 12
-r-------- 1 samr web 21 May 19 00:21 file1
-r-------- 1 samr web 48 May 19 00:21 file2
-r-------- 1 samr web 28 May 19 00:21 file3

Puede colocar los modificadores -v en tar que he incluido aquí simplemente para que pueda ver los archivos almacenados en el host1 y enviados a través de STDOUT (también conocido como -) y luego no ser tarred en el host2.

NOTA: ¿Por qué funciona esto? El comportamiento predeterminado de Tar es descomprimir archivos usando la máscara de usuario de un usuario remoto. En el ejemplo anterior, he incluido el comando umask para establecerlo explícitamente en algo diferente que demuestre que el tar remoto está cambiando los permisos en el lado remoto.

slm
fuente
1
Como puedo ver con este comando, solo puede aplicar menos permisos a los archivos transferidos, ya que umasksolo resta los permisos, por ejemplo, para un archivo local con el 700que no pudo obtener el archivo 755en el servidor de destino, ¿o me equivoco?
Jaime Hablutzel
1
Por otra parte lo que necesita --no-same-permissionspara el segundo taruso si el usuario de destino es la raíz, consulte superuser.com/a/383801/89031
Jaime Hablutzel
@jaime: eso es correcto, esto solo le permitirá configurar el umaskconjunto completo de archivos a medida que se escriben en el servidor remoto. No hay control individual para diferentes archivos. A menudo lo usaré, ya que quiero eliminar los permisos relajados que estaban bien en mi computadora portátil, por ejemplo, cuando copio a una implementación remota.
slm
@jaime: también --no-same-permissionses correcto según tarla página de manual de 'man'. He cambiado las indicaciones en mi ejemplo para que no haya confusión al respecto.
slm
3

Escribí un pequeño script para la tarea en Python. Puede hacer python script.py -p o + r algunos archivos algunos / dir / on / the / server /

import subprocess
import sys
from optparse import OptionParser


DEFAULT_SERVER = 'your.server.com'

parser = OptionParser()

parser.add_option("-p", "--permissions", action="store", 
                     type="str", dest="perm", metavar="PERM",
                     help="chmod files to PERM", default=None)
parser.add_option("-s", "--server", action="store", 
                     type="str", dest="serv", metavar="SERVER",
                     help="scp to SERVER", default=DEFAULT_SERVER)

options, args = parser.parse_args()
files = args[:-1]
direct = args[-1]

proc = subprocess.Popen(['scp'] + files + ['%s:%s' % (options.serv, direct)],
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if proc.wait() != 0:
    print >>sys.stderr, "Uploading failed!"
    sys.exit(1)

if options.perm is not None:
    arg_dict = dict(dir=direct, perm=options.perm, files=' '.join(files))
    proc = subprocess.Popen(['ssh', options.serv, 'cd %(dir)s;'
                             'chmod -R %(perm)s %(files)s' % arg_dict],
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Florian Mayer
fuente
3
¿Te importa publicar tu código en Code Review ? Podría haber buenas sugerencias sobre cómo se puede mejorar.
tshepang
1
Wow, nunca escuché sobre el nuevo sitio SO, Code Review, ty @Tshepang!
AnneTheAgile
2
@AnneTheAgile no es tan nuevo; tiene más de 3 años :)
tshepang
1

Sugeriría configurar un bit adhesivo en la carpeta para que los archivos que cargue en esa carpeta obtengan ese permiso automáticamente.

chmod 1644 dir

"1" usado arriba establece el bit adhesivo.

así que solo tienes que subir uno y no tener que ejecutar otro comando después.

DaveDeveloper
fuente
¿Alguien puede explicar cómo funcionaría esto, por favor?
Mawg
0

Suponiendo que está cargando a una variante de UNIX, creo que los permisos deben seguir la configuración de UMASK. No recuerdo de la parte superior de mi cabeza qué archivos de puntos se procesan para SCP, pero si configura su UMASK en uno de esos, los archivos que cree tendrán sus permisos establecidos en función de ello. Probablemente depende de qué shell use en el sistema remoto.

Hagas lo que hagas, no uses la opción -p, ya que hace exactamente lo contrario de lo que quieres.

tvanfosson
fuente
No -p no es lo que quería porque necesito permisos diferentes en el servidor (sí, es UNIX) que en mi máquina local. Por supuesto, podría modificarlos, usar -p y luego modificarlos nuevamente, aunque necesitaría almacenar los permisos en ese momento.
Florian Mayer
No estaba sugiriendo que usaras -p, solo confirmando que eras. Aclararé mi publicación.
tvanfosson