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

44

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 pouvoir facilement modifier les autorisations lors du téléchargement sans avoir besoin de ssh sur le compte et de les modifier manuellement.

Florian Mayer
la source

Réponses:

30

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

scp /path/to/file server:/server/path/to/file
ssh server chmod 644 /server/path/to/file
zigdon
la source
J'y ai pensé aussi, qu'en est-il de télécharger des répertoires?
Florian Mayer
Hm, je pourrais faire chmod -R alors. Ce n'est pas une mauvaise idée, je suppose.
Florian Mayer
1
Droite. scp -r, puis ssh chmod -R
zigdon
1
J'ai également eu du succès avec la même chose avec plink et pscp (du paquet mastic)
stevepastelan
22

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

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 existe également de nombreuses autres options avec rsync qui apporteraient probablement une valeur ajoutée, telles que la possibilité de conserver le propriétaire, le groupe, etc.

JRomero
la source
Ceci ne fonctionne pas.
Soham
1
Découvert la cause. Vous devez utiliser --permsaussi bien. expliquehell.com/…
soham
5
Pourriez-vous montrer le plein, valide, commande, pelase? Soit comme commentaire, soit en modifiant la réponse
Mawg
6

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.

Jingguo Yao
la source
3
Cela devrait être un commentaire au lieu d'une réponse
Jaime Hablutzel
2
Agred (mais ça m'a vraiment aidé ;-)
Mawg
C’est ce que j’essaie de faire d’un seul coup avec un script. Rsync n'est pas toujours sur le serveur de destination et je préférerais que le script que je vous donne ne prenne pas de libertés avec apt / yum etc. pour installer rsync. Il semble que je devrais utiliser la méthode scp + chmod ou rm + scp pour vérifier que les autorisations sont correctes. : - /
zaTricky
5

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 l'hôte2:

[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 que les fichiers sont archivés sur hôte1 et envoyés via STDOUT (alias. -), puis non désordonnés sur hôte2.

NOTE: Pourquoi ça marche? 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 la définir explicitement, ce qui montre que le fichier tar distant modifie les autorisations du côté distant.

slm
la source
1
Comme je peux le voir avec cette commande, vous ne pouvez appliquer que moins d'autorisations aux fichiers transférés, car umaskseules les autorisations de soustraction, par exemple, pour un fichier local avec lequel 700vous ne pouvez pas obtenir le fichier 755dans le serveur de destination, ou est-ce que je me trompe?
Jaime Hablutzel
1
De plus, vous aurez besoin --no-same-permissionspour la deuxième tarutilisation si l'utilisateur de destination est root, voir superuser.com/a/383801/89031
Jaime Hablutzel
@jaime - c'est exact, cela ne vous permettra que de définir l' umaskensemble des fichiers tels qu'ils sont écrits sur le serveur distant. Il n'y a pas de contrôle individuel pour différents fichiers. J'utiliserai souvent cela car je veux supprimer les autorisations peu contraignantes qui étaient correctes sur mon ordinateur portable, lors de la copie vers un déploiement distant, par exemple.
slm
@jaime - le --no-same-permissionsest également correct selon tarla page de manuel de 's. J'ai modifié les invites dans mon exemple afin d'éviter toute confusion.
slm
3

J'ai écrit un petit script pour la tâche en Python. Vous pouvez faire python script.py -p o + r certains fichiers quelque / répertoire / 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)
Florian Mayer
la source
3
Est-ce que ça vous dérange de poster votre code à Code Review . Il pourrait y avoir de bonnes suggestions pour l’améliorer.
Tshepang
1
Wow, je n'ai jamais entendu parler du nouveau site SO, Code Review, ty @Tshepang!
AnneTheAgile
2
@AnneTheAgile ce n'est pas si nouveau; c'est plus de 3 ans :)
tshepang
1

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.

DaveDeveloper
la source
Quelqu'un peut-il expliquer comment cela fonctionnerait, s'il vous plaît?
Mawg
0

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.

tvanfosson
la source
Nan. -p n'est pas ce que je voulais, car j'ai besoin d'autorisations différentes sur le serveur (oui, c'est un UNIX) et sur ma machine locale. Je pourrais bien sûr les chmod, utiliser -p puis les chmod en arrière, bien que je devrais alors stocker les permissions.
Florian Mayer
Je ne proposais pas que vous utilisiez -p, confirmant simplement que vous l'étiez. Je vais clarifier mon post.
tvanfosson