Изменить разрешения при загрузке с помощью scp

44

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

Флориан Майер
источник

Ответы:

29

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

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

scp /path/to/file server:/server/path/to/file
ssh server chmod 644 /server/path/to/file
zigdon
источник
Я тоже думал об этом, а как насчет загрузки каталогов?
Флориан Майер
Хм, тогда я мог бы сделать chmod -R. Не плохая идея, я думаю.
Флориан Майер
1
Правильно. scp -r, затем ssh chmod -R
zigdon
1
Я также имел успех, делая то же самое с plink и pscp (из пакета
putty
22

Мое предпочтительное рабочее решение будет использовать 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, которые, вероятно, добавят ценность, например, возможность сохранить владельца, группу и т. Д.

JRomero
источник
Это не работает.
Сохам
1
Выяснил причину. Вы должны использовать --permsтакже. explainshell.com/...
сохи
5
Не могли бы вы показать полный, действительный, команда, pelase? Либо в качестве комментария, либо путем редактирования ответа
Mawg
6

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

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

Цзинго Яо
источник
3
Это должен быть комментарий, а не ответ
Хайме Хаблуцель
2
Агред (но это действительно помогло ;-)
Mawg
Это то, что я пытаюсь обойти за один раз по сценарию. Rsync не всегда находится на конечном сервере, и я бы предпочел, чтобы сценарий, который я выдаю, не использовал apt / yum и т. Д. Для установки rsync. Кажется, мне, возможно, придется использовать метод scp + chmod или rm + scp, чтобы убедиться в правильности разрешений. : - /
zaTricky
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. -), а затем получившиеся без tar на host2.

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

ОДС
источник
1
Как я вижу с помощью этой команды, вы можете применять только меньшее количество разрешений к передаваемым файлам, так как umaskтолько права на субреферат, например, для локального файла, с которым 700вы не можете получить файл 755на конечном сервере, или я ошибаюсь?
Хайме Хаблутцель
1
Кроме того, вам нужно --no-same-permissionsдля второго tarиспользования, если конечный пользователь является пользователем root, см. Superuser.com/a/383801/89031
Хайме Хаблутцель
@jaime - это правильно, это позволит вам установить только umaskдля всего набора файлов, когда они записываются на удаленный сервер. Нет индивидуального контроля для разных файлов. Я буду часто использовать это, так как я хочу лишить смягченные разрешения, которые были в порядке на моем ноутбуке, например, при копировании в удаленное развертывание.
Slm
@jaime - --no-same-permissionsправильно также в соответствии tarс man-страницей. Я изменил подсказки в моем примере, чтобы не было путаницы в этом.
SLM
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)
Флориан Майер
источник
3
Вы не против опубликовать свой код на Code Review . Там могут быть хорошие предложения о том, как это можно улучшить.
Чепанг
1
Вау, я никогда не слышал о новом SO-сайте, Code Review, ты @Tshepang!
AnneTheAgile
2
@AnneTheAgile это не так уж и ново; ему больше 3 лет :)
tshepang
1

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

chmod 1644 dir

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

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

DaveDeveloper
источник
Может кто-нибудь объяснить, как это будет работать, пожалуйста?
Mawg
0

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

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

tvanfosson
источник
Нет. -p это не то, что я хотел, потому что мне нужны другие разрешения на сервере (да, это UNIX), чем на моей локальной машине. Я мог бы, конечно, chmod их, использовать -p и затем chmod их обратно, хотя тогда мне нужно было сохранить разрешения.
Флориан Майер
Я не предлагал вам использовать -p, просто подтвердил, что вы это сделали. Я уточню свой пост.
tvanfosson