54 votes

Changer les permissions lors du téléchargement avec scp

Je télécharge des fichiers vers mon compte Shell en utilisant scp. Comme j'ai besoin de permissions différentes sur le serveur et sur mon ordinateur, j'aimerais avoir un moyen de modifier facilement les permissions lors du téléchargement sans avoir besoin de ssh au compte et de les modifier manuellement.

40voto

Mantas K. Points 44

Si vous copiez depuis une machine Windows, vous pouvez utiliser WinSCP à copier, et il a une option pour définir les autorisations sur les fichiers copiés après le téléchargement.

Sinon, je pense que votre seul choix est d'exécuter un chmod sur le serveur après le téléchargement, ce que vous pourriez faire à distance avec une commande ssh :

scp /path/to/file server:/server/path/to/file
ssh server chmod 644 /server/path/to/file

37voto

jtveg Points 1

Ma solution de travail préférée serait d'utiliser rsync à la place :

Remplacer :

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

Avec :

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

Cela vous évite de vous authentifier deux fois. Il existe également de nombreuses autres options avec rsync qui apporterait probablement une valeur ajoutée, comme la possibilité de préserver le propriétaire, le groupe, etc.

7voto

Batur Points 11

Vous pouvez le faire en utilisant tar, ssh, & umask comme ceci :

sur l'hôte 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

sur l'hôte 2 :

[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

Vous pouvez laisser tomber les commutateurs -v à tar que j'ai inclus ici simplement pour que vous puissiez voir les fichiers être tarés sur l'hôte1 et envoyés à travers STDOUT (aka. -) et ensuite être dé-tarés sur l'hôte2.

NOTE : Pourquoi cela fonctionne-t-il ? Le comportement par défaut de Tar est de décompresser les fichiers en utilisant l'umask d'un utilisateur distant. Dans l'exemple ci-dessus, j'ai inclus la commande umask pour le définir explicitement sur quelque chose de différent, ce qui démontre que le goudron distant modifie les permissions du côté distant.

7voto

RamblinRose101 Points 1

J'ai fait quelques expériences avec scp. Pour les nouveaux fichiers téléchargés sur le serveur cible, les fichiers ont les mêmes permissions que sur le serveur source. Si des fichiers existants sont écrasés sur le serveur cible, les autorisations pour ces fichiers ne changent pas.

J'ai fait ces expériences avec CentOS 4.6.

4voto

Florian Mayer Points 775

J'ai écrit un petit script pour cette tâche en Python. Vous pouvez faire Python script.py -p o+r some files some/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)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X