Змініть дозволи після завантаження за допомогою 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

Я теж думав про це, а як тоді завантажувати каталоги?
Флоріан Майєр

Гм, я міг би зробити chmod -R тоді. Думаю, не погана ідея.
Флоріан Майєр

1
Правильно. scp -r, тоді ssh chmod -R
zigdon

1
Я також мав успіх, роблячи те ж саме з plink та pscp (з пакету шпаклівки)
stevepastelan

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, які, ймовірно, додадуть цінності, такі як можливість зберегти власника, групу тощо.


Це не працює.
soham

1
З’ясував причину. Ви також повинні використовувати --perms. explainshell.com / ...
сохи

5
Чи можете ви показати повну, дійсну, команду, пелас? Або як коментар, або
редагуючи

6

Я зробив кілька експериментів з scp. Для нових файлів, завантажених на цільовий сервер, файли мають ті ж дозволи, що і на вихідному сервері. Якщо наявні файли перезаписані на цільовому сервері, дозволи для цих файлів не змінюються.

Я провів ці експерименти з CentOS 4.6.


3
Це має бути коментар замість відповіді
Хайме Хаблуцель

2
Agred (але це дійсно допомогло ;-)
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, які я включив сюди, просто так, щоб ви могли бачити, як файли відмічені на хості1 і надсилаються через STDOUT (ака. -), а потім отримують непризначений хост2.

ПРИМІТКА. Чому це працює? За замовчуванням поведінка Тар полягає в розпакуванні файлів за допомогою віддаленого користувача umask. У наведеному вище прикладі я включив команду umask, щоб явно встановити її на щось інше, що демонструє, що віддалений tar змінює дозволи на віддаленій стороні.


1
Як я бачу, за допомогою цієї команди ви можете застосувати лише меншу кількість дозволів до переданих файлів, як umaskлише підзаконні дозволи, наприклад, для локального файлу, з яким 700ви не змогли отримати файл 755на сервері призначення, чи я помиляюся?
Хайме Хаблуцель

1
Крім того , потрібно --no-same-permissionsдля другого tarвикористання , якщо користувач призначення кореневих см superuser.com/a/383801/89031
Хайме Hablutzel

@jaime - це правильно, це дозволить вам встановити umaskлише цілий набір файлів під час запису на віддалений сервер. Немає індивідуального контролю для різних файлів. Я часто використовую це, оскільки хочу скасувати розслаблені дозволи, наприклад, на моєму ноутбуці, наприклад, під час копіювання на віддалене розгортання.
slm

@jaime - --no-same-permissionsправильний, а також відповідно до tarсторінки man's 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 . Там можуть бути приємні пропозиції щодо її вдосконалення.
tshepang

1
Нічого собі, я ніколи не чув про новий SO-сайт, Code Review, ty @Tshepang!
AnneTheAgile

2
@AnneTheAgile це не так вже й нове; це старше 3 років :)
tshepang

1

Я б запропонував налаштувати клейкий біт у папці, щоб файли, які ви завантажуєте в цю папку, отримували цей дозвіл автоматично.

chmod 1644 реж

Використовуваний вище "1" встановлює клейкий біт.

тож вам потрібно завантажити лише одну, а потім не потрібно виконувати іншу команду.


Може хтось пояснить, як це спрацювало б, будь ласка?
Mawg

0

Якщо припустити, що ви завантажуєте варіант UNIX, я думаю, що дозволи повинні відповідати вашим налаштуванням UMASK. Я не згадую вгорі голови, які точки-файли обробляються для SCP, але якщо ви встановите свій UMASK в одному з тих файлів, які ви створюєте, буде встановлено його дозвіл. Це, мабуть, залежить від того, яку оболонку ви використовуєте у віддаленій системі.

Що б ви не робили, не використовуйте параметр -p, оскільки він робить абсолютно протилежне тому, що ви хочете.


Ні. -p - це не те, що я хотів, тому що мені потрібні інші дозволи на сервері (так, це UNIX), ніж на моїй локальній машині. Звичайно, я міг би chmod їх, використовувати -p, а потім chmod їх назад, хоча тоді мені потрібно зберегти дозволи.
Флоріан Майєр

Я не пропонував вам використовувати -p, просто підтвердив, що ви є. Я уточню свою посаду.
tvanfosson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.