Alterar permissões ao fazer o upload com scp

40

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

    
por Florian Mayer 11.10.2008 / 18:52

7 respostas

22

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

Se não, acho que sua única escolha é 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
    
por 11.10.2008 / 19:12
21

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ê autentique duas vezes. Há também muitas outras opções com o rsync que provavelmente adicionaria valor, como poder preservar o proprietário, o grupo , etc.

    
por 22.04.2013 / 17:17
6

Eu fiz algumas experiências 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 sobrescritos no servidor de destino, as permissões para esses arquivos não serão alteradas.

Eu fiz essas experiências com o CentOS 4.6.

    
por 04.06.2012 / 14:53
5

Você pode fazer isso usando tar, ssh, & 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 descartar os parâmetros -v para tar, os quais incluímos aqui apenas para que você possa ver os arquivos sendo encerrados no host1 e enviados por meio de STDOUT (também conhecido como .-) e, em seguida, obtendo o un-tarred no host2. / p>

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

    
por 19.05.2010 / 07:03
3

Eu escrevi um pequeno script para a tarefa em Python. Você pode fazer python script.py -p o + r alguns arquivos em / dir / on / o / 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)
    
por 11.10.2008 / 20:32
1

Eu sugeriria configurar um bit pegajoso na pasta para que os arquivos que você carregasse sob essa pasta receba essa permissão automaticamente.

chmod 1644 dir

"1" usado acima define o bit adesivo.

então você só precisa fazer o upload de um e não precisa executar outro comando depois.

    
por 22.04.2013 / 17:28
0

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

Não importa o que você faça, não use a opção -p, pois ela faz exatamente o oposto do que você deseja.

    
por 11.10.2008 / 19:01