Modifica le autorizzazioni al momento del caricamento con scp


44

Sto caricando i file sul mio account di shell usando scp. Poiché ho bisogno di autorizzazioni diverse sul server rispetto al mio computer, mi piacerebbe avere un modo per modificare facilmente le autorizzazioni al momento del caricamento senza bisogno di ssh sull'account e modificarle manualmente.

Risposte:


29

Se stai copiando da un computer Windows, puoi usare WinSCP per copiare e ha un'opzione per impostare le autorizzazioni sui file copiati dopo il caricamento.

In caso contrario, penso che la tua unica scelta sia quella di eseguire un chmod sul server dopo il caricamento, cosa che potresti fare in remoto con un comando ssh:

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

Ci ho pensato anche io, che dire del caricamento di directory allora?
Florian Mayer,

Hm, allora potrei fare chmod -R. Non è una cattiva idea, immagino.
Florian Mayer,

1
Destra. scp -r, quindi ssh chmod -R
zigdon,

1
Ho anche avuto successo facendo la stessa cosa con plink e pscp (dal pacchetto putty)
stevepastelan,

22

La mia soluzione di lavoro preferita sarebbe rsyncinvece utilizzare :

Sostituire:

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

Questo ti impedisce di autenticarti due volte. Ci sono anche molte altre opzioni con rsync che probabilmente aggiungerebbero valore come la possibilità di preservare il proprietario, il gruppo, ecc.


Questo non sta funzionando.
soham,

1
Scopri la causa. Devi usare --permsanche tu . explainshell.com/...
Soham

5
Potresti mostrare il comando completo, valido, pelase? O come commento, o modificando la risposta
Mawg

6

Ho fatto alcuni esperimenti con SCP. Per i nuovi file caricati sul server di destinazione, i file hanno le stesse autorizzazioni del server di origine. Se i file esistenti vengono sovrascritti sul server di destinazione, le autorizzazioni per tali file non cambiano.

Ho fatto questi esperimenti con CentOS 4.6.


3
Questo dovrebbe essere un commento invece di una risposta
Jaime Hablutzel,

2
Agred (ma mi ha davvero aiutato ;-)
Mawg

Questo è ciò che sto cercando di aggirare in una volta sola tramite script. Rsync non è sempre sul server di destinazione e preferirei che lo script che distribuisco non si prenda delle libertà con apt / yum ecc. Per installare rsync. Sembra che dovrei andare con il metodo scp + chmod o rm + scp per assicurarmi che le autorizzazioni siano corrette. : - /
zaTricky

5

Puoi farlo usando tar, ssh e umask in questo modo:

sull'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

su 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

Puoi rilasciare le opzioni -v su tar che ho incluso qui solo in modo da poter vedere i file essere tarati su host1 e inviati tramite STDOUT (aka. -) e quindi non tarati su host2.

NOTA: perché funziona? Il comportamento predefinito di Tar è decomprimere i file usando umask di un utente remoto. Nell'esempio sopra ho incluso il comando umask per impostarlo esplicitamente su qualcosa di diverso che dimostra che il tar remoto sta cambiando le autorizzazioni sul lato remoto.


1
Come posso vedere con questo comando, puoi applicare solo meno autorizzazioni ai file trasferiti, poiché umasksolo sottrai le autorizzazioni, ad esempio per un file locale con 700cui non riesci a ottenere il file 755nel server di destinazione, o sbaglio?
Jaime Hablutzel,

1
Inoltre è necessario --no-same-permissionsper il secondo tarutilizzo se l'utente di destinazione è root, consultare superuser.com/a/383801/89031
Jaime Hablutzel,

@jaime - è corretto, ciò ti consentirà di impostare solo umaskper l'intero set di file mentre vengono scritti sul server remoto. Non esiste un controllo individuale per file diversi. Lo userò spesso poiché desidero rimuovere autorizzazioni rilassate che erano OK sul mio laptop, ad esempio durante la copia su una distribuzione remota.
slm,

@jaime - --no-same-permissionsè corretto anche secondo tarla pagina man di. Ho cambiato le istruzioni nel mio esempio, quindi non c'è confusione al riguardo.
slm,

3

Ho scritto una piccola sceneggiatura per l'attività in Python. Puoi fare python script.py -p o + r alcuni file alcuni / 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)

3
Ti dispiace pubblicare il tuo codice in Code Review . Ci potrebbero essere dei buoni suggerimenti su come migliorarlo.
Tshepang,

1
Wow, non ho mai sentito parlare del nuovo sito SO, Code Review, ty @Tshepang!
AnneTheAgile,

2
@AnneTheAgile non è così nuovo; ha più di 3 anni :)
tshepang,

1

Suggerirei di impostare un po 'di appiccicoso sulla cartella in modo che i file caricati sotto quella cartella ottengano automaticamente tale autorizzazione.

chmod 1644 dir

"1" usato sopra imposta il bit appiccicoso.

quindi devi solo caricarne uno e non devi eseguire un altro comando in seguito.


Qualcuno può spiegare come funzionerebbe, per favore?
Mawg,

0

Supponendo che tu stia caricando su una variante UNIX, penso che le autorizzazioni dovrebbero seguire le tue impostazioni UMASK. Non ricordo dalla parte superiore della mia testa quali file di punti vengono elaborati per SCP, ma se imposti il ​​tuo UMASK in uno di quelli i file che creerai avranno i suoi permessi basati su di esso. Probabilmente dipende dalla shell che usi sul sistema remoto.

Qualunque cosa tu faccia, non usare l'opzione -p poiché fa esattamente l'opposto di quello che vuoi.


No. -p non è quello che volevo perché ho bisogno di autorizzazioni diverse sul server (sì, è UNIX) rispetto al mio computer locale. Ovviamente potrei modificarli, usare -p e poi ripristinarli, anche se avrei bisogno di archiviare i permessi.
Florian Mayer,

Non ti stavo suggerendo di usare -p, ma sto solo confermando che lo eri. Chiarirò il mio post.
tvanfosson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.