Alterar permissões ao fazer upload com scp


44

Estou carregando arquivos para minha conta shell usando scp. Como preciso de permissões diferentes no servidor e no meu computador, gostaria de ter uma maneira de alterar facilmente as permissões após o upload sem precisar ssh na conta e alterá-las manualmente.

Respostas:


29

Se você estiver copiando de uma máquina Windows, poderá usar o WinSCP para copiar, e ele tem uma opção para definir as permissões nos arquivos copiados após o upload.

Caso contrário, acho que sua única opção é executar um chmod no servidor após o upload, o que você poderia fazer remotamente com um comando ssh:

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

Eu pensei sobre isso também, que tal enviar diretórios então?
Florian Mayer

Hm, eu poderia fazer chmod -R então. Não é uma má ideia, eu acho.
Florian Mayer

1
Direita. scp -r, então ssh chmod -R
zigdon 11/08/08

1
Eu também tive sucesso fazendo a mesma coisa com plink e pscp (do pacote arremate)
stevepastelan

22

Minha solução de trabalho preferida seria usar rsync:

Substituir:

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

Com:

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

Isso impede que você se autentique duas vezes. Também existem muitas outras opções com o rsync que provavelmente agregariam valor, como preservar o proprietário, o grupo etc.


Isto não está a funcionar.
So11

1
Descobri a causa. Você tem que usar --permstambém. explainshell.com/...
soham

5
Você poderia mostrar o comando completo, válido, pelase? Quer como comentário, ou por editting a resposta
MAWG

6

Eu fiz alguns experimentos com o scp. Para novos arquivos carregados no servidor de destino, os arquivos têm as mesmas permissões que no servidor de origem. Se os arquivos existentes forem substituídos no servidor de destino, as permissões desses arquivos não serão alteradas.

Eu fiz esses experimentos com o CentOS 4.6.


3
Este deve ser um comentário em vez de uma resposta
Jaime Hablutzel

2
Agred (mas ele fez realmente ajuda ;-)
MAWG

É isso que estou tentando contornar de uma só vez via script. O Rsync nem sempre está no servidor de destino e eu prefiro que o script que forneço não tenha liberdades com o apt / yum etc para instalar o rsync. Parece que eu tenho que usar o método scp + chmod ou rm + scp para garantir que as permissões estejam corretas. : - /
zaTricky

5

Você poderia fazer isso usando tar, ssh e umask assim:

no 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

no 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

Você pode soltar as opções -v no tar que eu incluí aqui apenas para que você possa ver os arquivos sendo colocados no host1 e enviados através do STDOUT (aka. -) e, em seguida, ficando sem tar no host2.

NOTA: Por que isso funciona? O comportamento padrão do Tar é descompactar arquivos usando umask de um usuário remoto. No exemplo acima, incluí o comando umask para defini-lo explicitamente para algo diferente, o que demonstra que o tar remoto está alterando as permissões no lado remoto.


1
Como posso ver com este comando, você só pode aplicar menos permissões aos arquivos transferidos, como umaskapenas as permissões de sub-resumo, por exemplo, para um arquivo local com o 700qual não foi possível obtê-lo 755no servidor de destino, ou estou errado?
Jaime Hablutzel

1
Além disso, você precisa --no-same-permissionspara o segundo taruso, se o usuário de destino é raiz, consulte superuser.com/a/383801/89031
Jaime Hablutzel

@jaime - isso está correto, isso permitirá apenas que você defina o umaskarquivo para todo o conjunto de arquivos conforme eles são gravados no servidor remoto. Não há controle individual para arquivos diferentes. Usarei isso com frequência, pois desejo remover permissões relaxadas que estavam bem no meu laptop, ao copiar para uma implantação remota, por exemplo.
SLM

@jaime - também --no-same-permissionsestá correto, de acordo com tara página de manual do usuário . Eu mudei os prompts no meu exemplo para não haver confusão nisso.
SLM

3

Eu escrevi um pequeno script para a tarefa em Python. Você pode fazer python script.py -p o + r alguns arquivos, alguns / 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
Você se importa de postar seu código na Code Review . Pode haver boas sugestões de como ele pode ser melhorado.
tshepang 21/07

1
Uau, nunca ouvi falar do novo site da SO, Code Review, ty @Tshepang!
AnneTheAgile

2
@AnneTheAgile não é tão novo assim; já tem mais de 3 anos :)
tshepang 01/08

1

Sugiro que você configure um lembrete na pasta para que os arquivos carregados nessa pasta obtenham essa permissão automaticamente.

chmod 1644 dir

"1" usado acima define o bit adesivo.

portanto, você só precisa enviar um e não executar outro comando posteriormente.


Alguém pode explicar como isso funcionaria, por favor?
MAWG

0

Supondo que você esteja fazendo o upload para uma variante do UNIX, acho que as permissões devem seguir as configurações do UMASK. Não me lembro de nada que arquivos de ponto são processados ​​para o SCP, mas se você definir o seu UMASK em um desses arquivos, os arquivos criados terão suas permissões definidas com base nele. Provavelmente depende de qual shell você usa no sistema remoto.

Faça o que fizer, não use a opção -p, pois faz exatamente o oposto do que você deseja.


Não. -p não é o que eu queria, porque preciso de permissões diferentes no servidor (sim, é um UNIX) do que na minha máquina local. É claro que eu poderia chmod-los, usar -p e depois chmod-los de volta, embora eu precise armazenar as permissões então.
Florian Mayer

Eu não estava sugerindo que você usasse -p, apenas confirmando que estava. Vou esclarecer minha postagem.
tvanfosson 11/10/08
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.