Ändern Sie die Berechtigungen beim Hochladen mit scp

44

Ich lade mit scp Dateien auf mein Shell-Konto hoch. Da ich auf dem Server andere Berechtigungen als auf meinem Computer benötige, möchte ich eine Möglichkeit haben, die Berechtigungen beim Hochladen einfach zu ändern, ohne auf das Konto zugreifen und sie manuell ändern zu müssen.

Florian Mayer
quelle

Antworten:

27

Wenn Sie von einem Windows-Computer kopieren, können Sie WinSCP zum Kopieren verwenden, und es besteht die Möglichkeit, die Berechtigungen für die kopierten Dateien nach dem Hochladen festzulegen.

Wenn nicht, denke ich, besteht Ihre einzige Wahl darin, nach dem Upload ein chmod auf dem Server auszuführen, was Sie mit einem ssh-Befehl aus der Ferne tun können:

scp /path/to/file server:/server/path/to/file
ssh server chmod 644 /server/path/to/file
Zickzack
quelle
Ich habe auch darüber nachgedacht, was ist dann mit dem Hochladen von Verzeichnissen?
Florian Mayer
Hm, dann könnte ich chmod -R machen. Keine schlechte Idee, denke ich.
Florian Mayer
1
Recht. scp -r, dann ssh chmod -R
zigdon
1
Ich hatte auch Erfolg damit, dasselbe mit plink und pscp (aus dem Putty-Paket) zu
tun
22

Meine bevorzugte Arbeitslösung wäre, rsyncstattdessen Folgendes zu verwenden :

Ersetzen:

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

Mit:

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

Dies verhindert, dass Sie sich zweimal authentifizieren. Es gibt auch viele andere Optionen mit rsync, die wahrscheinlich einen Mehrwert bringen, beispielsweise die Möglichkeit, Eigentümer, Gruppe usw. beizubehalten.

JRomero
quelle
Das funktioniert nicht.
Soham
1
Finde die Ursache heraus. Sie müssen --permsauch verwenden. explainshell.com/...
Soham
5
Könnten Sie den vollständigen, gültigen Befehl pelase anzeigen? Entweder als Kommentar oder durch Bearbeiten der Antwort
Mawg
7

Ich habe einige Experimente mit scp gemacht. Für neue Dateien, die auf den Zielserver hochgeladen werden, haben die Dateien die gleichen Berechtigungen wie auf dem Quellserver. Wenn vorhandene Dateien auf dem Zielserver überschrieben werden, ändern sich die Berechtigungen für diese Dateien nicht.

Ich habe diese Experimente mit CentOS 4.6 durchgeführt.

Jingguo Yao
quelle
3
Dies sollte ein Kommentar statt einer Antwort sein
Jaime Hablutzel
2
Agred (aber es hat wirklich geholfen ;-)
Mawg
Dies ist, was ich versuche, in einem Rutsch per Skript zu umgehen. Rsync befindet sich nicht immer auf dem Zielserver, und ich würde es begrüßen, wenn das Skript, das ich herausgebe, keine Freiheiten mit apt / yum usw. zur Installation von rsync beansprucht. Es scheint, als müsste ich die Methode scp + chmod oder rm + scp verwenden, um sicherzustellen, dass die Berechtigungen korrekt sind. : - /
zaTricky
5

Sie können dies mit tar, ssh und umask wie folgt tun:

auf 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

auf 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

Sie können die Schalter -v auf tar ablegen, die ich hier angegeben habe, damit Sie sehen können, wie die Dateien auf host1 geteert und über STDOUT (aka. -) gesendet werden und dann auf host2 nicht geteert werden.

HINWEIS: Warum funktioniert das? Tars Standardverhalten besteht darin, Dateien mit der umask eines entfernten Benutzers zu entpacken. Im obigen Beispiel habe ich den Befehl umask eingefügt, um ihn explizit auf einen anderen Wert zu setzen. Dies zeigt, dass der Remote- TAR die Berechtigungen auf der Remote-Seite ändert.

slm
quelle
1
Wie ich mit diesem Befehl sehen kann, können Sie nur weniger Berechtigungen auf übertragene Dateien anwenden, als umasknur Berechtigungen zu subtrahieren, z. B. für eine lokale Datei, mit der 700Sie die Datei 755auf dem Zielserver nicht erhalten konnten , oder irre ich mich?
Jaime Hablutzel
1
Darüber hinaus benötigen Sie --no-same-permissionsfür die zweite tarVerwendung, wenn der
Zielbenutzer
@jaime - das ist richtig. Auf diese Weise können Sie nur umaskdie gesamten Dateien festlegen, die auf den Remote-Server geschrieben wurden. Es gibt keine individuelle Kontrolle für verschiedene Dateien. Ich verwende dies häufig, da ich Berechtigungen entfernen möchte, die auf meinem Laptop in Ordnung waren, wenn ich zum Beispiel auf eine Remote-Bereitstellung kopiere.
Slm
@jaime - das --no-same-permissionsist laut Manpage auch korrekt tar. Ich habe die Eingabeaufforderungen in meinem Beispiel geändert, sodass diesbezüglich keine Verwirrung herrscht.
Slm
3

Ich habe ein kleines Skript für die Aufgabe in Python geschrieben. Sie können python script.py -p o + r einige Dateien einige / 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)
Florian Mayer
quelle
3
Stören Sie Ihren Code zu veröffentlichen Code Review . Es könnte dort nette Vorschläge geben, wie es verbessert werden kann.
Tshepang
1
Wow, ich habe noch nie von der neuen SO-Site Code Review gehört, ty @Tshepang!
AnneTheAgile
2
@AnneTheAgile es ist nicht so neu; Es ist über 3 Jahre alt :)
Tshepang
1

Ich würde vorschlagen, Sticky Bit für den Ordner einzurichten, damit die Dateien, die Sie in diesen Ordner hochladen, diese Berechtigung automatisch erhalten.

chmod 1644 dir

"1" setzt das Sticky-Bit.

Sie müssen also nur einen Befehl hochladen und anschließend keinen weiteren ausführen.

DaveDeveloper
quelle
Kann mir bitte jemand erklären, wie das funktionieren würde?
Mawg
0

Angenommen, Sie laden auf eine UNIX-Variante hoch, sollten die Berechtigungen Ihren UMASK-Einstellungen entsprechen. Ich kann mich nicht mehr genau erinnern, welche Punktedateien für SCP verarbeitet werden, aber wenn Sie Ihre UMASK auf eine dieser Dateien einstellen, werden die Berechtigungen für die von Ihnen erstellten Dateien darauf basierend festgelegt. Es hängt wahrscheinlich davon ab, welche Shell Sie auf dem Remote-System verwenden.

Verwenden Sie auf keinen Fall die Option -p, da dies genau das Gegenteil von dem ist, was Sie möchten.

Tvanfosson
quelle
Nee. -p ist nicht das, was ich wollte, weil ich auf dem Server andere Berechtigungen benötige (ja, es ist ein UNIX) als auf meinem lokalen Computer. Ich könnte sie natürlich chmodieren, -p verwenden und sie dann zurück chmodieren, obwohl ich die Berechtigungen dann speichern müsste.
Florian Mayer
Ich habe nicht vorgeschlagen, dass Sie -p verwenden, sondern nur bestätigt, dass Sie es sind. Ich werde meinen Beitrag klären.
Tvanfosson