web-dev-qa-db-fra.com

Modifier les autorisations lors du téléchargement avec scp

Je télécharge des fichiers sur mon compte Shell à l'aide de scp. Comme j'ai besoin d'autorisations différentes sur le serveur et sur mon ordinateur, j'aimerais avoir un moyen de changer facilement les autorisations lors du téléchargement sans avoir besoin de ssh sur le compte et de les modifier manuellement.

44
Florian Mayer

Si vous copiez depuis un ordinateur Windows, vous pouvez utiliser WinSCP pour copier. Il est également possible de définir les autorisations sur les fichiers copiés à la fin du processus. télécharger.

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 pouvez faire à distance avec une commande ssh:

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

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 --chmod=u+rwx,g+rwx,o+rwx /path/to/file server:/path/to/file

Cela vous empêche de vous authentifier deux fois. Il y a aussi beaucoup d'autres options avec rsync qui ajouteraient probablement de la valeur, comme pouvoir conserver le propriétaire, le groupe, etc.

22
JRomero

J'ai fait des expériences avec scp. Pour les nouveaux fichiers téléchargés sur le serveur cible, les fichiers ont les mêmes autorisations que sur le serveur source. Si les 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.

6
Jingguo Yao

Vous pouvez le faire en utilisant tar, ssh et 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 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

Vous pouvez supprimer les commutateurs -v à tar que j'ai inclus ici simplement pour que vous puissiez voir les fichiers en cours de classement sur Host1 et envoyés via STDOUT (alias. -), puis en mode non-tarés sur Host2.

REMARQUE: Pourquoi cela fonctionne? Le comportement par défaut de Tar consiste à décompresser les fichiers à l'aide de umask d'un utilisateur distant. Dans l'exemple ci-dessus, j'ai inclus la commande umask pour lui attribuer explicitement une valeur différente, ce qui montre que le tar distant modifie les autorisations du côté distant. .

5
slm

J'ai écrit un petit script pour la tâche en Python. Vous pouvez faire python script.py -p o + r quelques fichiers certains/dir/sur/le/serveur/

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)
3
Florian Mayer

Je suggèrerais de configurer sticky bit sur le dossier afin que les fichiers que vous téléchargez sous ce dossier obtiennent cette autorisation automatiquement.

chmod 1644 dir

"1" utilisé ci-dessus définit le bit collant.

il vous suffit donc d'en télécharger une et de ne pas avoir à exécuter une autre commande par la suite.

1
DaveDeveloper

En supposant que vous téléchargiez vers une variante UNIX, je pense que les autorisations doivent suivre vos paramètres UMASK. Je ne me rappelle pas par coeur quels fichiers-points sont traités pour SCP, mais si vous définissez votre UMASK dans l'un de ces fichiers, les autorisations que vous créez en seront définies. Cela dépend probablement du shell que vous utilisez sur le système distant.

Quoi que vous fassiez, n’utilisez pas l’option -p, car elle fait exactement le contraire de ce que vous voulez.

0
tvanfosson