41

Я загружаю файлы в свою учетную запись оболочки, используя scp. Поскольку мне нужны другие разрешения на сервере, чем на моем компьютере, я хотел бы иметь возможность легко изменять разрешения при загрузке без необходимости использовать ssh для учетной записи и изменять их вручную.

7 ответов7

22

Если вы копируете с компьютера с Windows, вы можете использовать WinSCP для копирования, и у него есть возможность установить разрешения для копируемых файлов после загрузки.

Если нет, я думаю, что ваш единственный выбор - выполнить chmod на сервере после загрузки, что вы можете сделать удаленно с помощью команды ssh:

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

Моим предпочтительным рабочим решением было бы использовать вместо этого rsync :

Заменить:

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

С:

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

Это мешает вам пройти аутентификацию дважды. Есть также много других опций с rsync, которые, вероятно, добавят ценность, например, возможность сохранить владельца, группу и т.д.

6

Я провел несколько экспериментов с scp. Для новых файлов, загружаемых на целевой сервер, файлы имеют те же разрешения, что и на исходном сервере. Если существующие файлы перезаписываются на целевом сервере, разрешения для этих файлов не меняются.

Я провел эти эксперименты с CentOS 4.6.

5

Вы можете сделать это, используя tar, ssh, & umask следующим образом:

на хосте 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

на хосте 2:

[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

Вы можете сбросить ключ -v на tar, который я включил здесь, просто для того, чтобы вы могли видеть файлы, которые были скопированы на host1 и отправлены через STDOUT (aka. -), а затем стали un-tarred на host2.

ПРИМЕЧАНИЕ: почему это работает? Поведение Tar по умолчанию распаковывает файлы, используя umask удаленного пользователя. В приведенном выше примере я включил команду umask, чтобы явно установить для нее что-то другое, что демонстрирует, что удаленный tar изменяет разрешения на удаленной стороне.

3

Я написал небольшой скрипт для задачи на Python. Вы можете сделать python script.py -p o+r для некоторых файлов: /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)
1

Я бы посоветовал установить бит закрепления в папке, чтобы файлы, которые вы загружаете в эту папку, автоматически получали это разрешение.

chmod 1644 dir

"1", использованное выше, устанавливает бит прилипания.

так что вам нужно только загрузить одну и не запускать другую команду впоследствии.

0

Предполагая, что вы загружаете в вариант UNIX, я думаю, что разрешения должны соответствовать вашим настройкам UMASK. Я не могу вспомнить, какие точечные файлы обрабатываются для SCP, но если вы установите UMASK в один из тех файлов, которые вы создадите, будут установлены его разрешения на его основе. Вероятно, это зависит от того, какую оболочку вы используете в удаленной системе.

Что бы вы ни делали, не используйте опцию -p, так как она делает то, что вам нужно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .