Ubah izin setelah mengunggah dengan scp

44

Saya mengunggah file ke akun shell saya menggunakan scp. Karena saya memerlukan izin berbeda di server daripada di komputer saya, saya ingin memiliki cara untuk dengan mudah mengubah izin saat mengunggah tanpa perlu ssh ke akun dan mengubahnya secara manual.

Florian Mayer
sumber

Jawaban:

29

Jika Anda menyalin dari mesin windows, Anda dapat menggunakan WinSCP untuk menyalin, dan memiliki opsi untuk mengatur izin pada file yang disalin setelah diunggah.

Jika tidak, saya pikir satu-satunya pilihan Anda adalah menjalankan chmod di server setelah pengunggahan, yang dapat Anda lakukan dari jarak jauh dengan perintah ssh:

scp /path/to/file server:/server/path/to/file
ssh server chmod 644 /server/path/to/file
zigdon
sumber
Saya juga memikirkannya, bagaimana dengan mengunggah direktori?
Florian Mayer
Hm, saya bisa melakukan chmod -R. Kurasa itu bukan ide yang buruk.
Florian Mayer
1
Kanan. scp -r, lalu ssh chmod -R
zigdon
1
Saya juga berhasil melakukan hal yang sama dengan plink dan pscp (dari paket dempul)
stevepastelan
22

Solusi kerja pilihan saya adalah menggunakan rsync:

Menggantikan:

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

Dengan:

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

Ini mencegah Anda dari otentikasi dua kali. Ada juga banyak opsi lain dengan rsync yang mungkin akan menambah nilai seperti dapat mempertahankan pemilik, grup, dll.

JRomero
sumber
Ini tidak bekerja.
soham
1
Menemukan penyebabnya. Anda harus menggunakannya --permsjuga. menjelaskanshell.com/…
soham
5
Bisakah Anda menunjukkan perintah lengkap, valid, pelase? Baik sebagai komentar, atau dengan mengedit jawabannya
Mawg
6

Saya telah membuat beberapa percobaan dengan scp. Untuk file baru yang diunggah ke server target, file tersebut memiliki izin yang sama seperti pada server sumber. Jika file yang ada ditimpa pada server target, izin untuk file-file itu tidak berubah.

Saya telah melakukan percobaan ini dengan CentOS 4.6.

Jingguo Yao
sumber
3
Ini harus menjadi komentar alih-alih jawaban
Jaime Hablutzel
2
Agred (tapi itu benar-benar membantu ;-)
Mawg
Inilah yang saya coba untuk berkeliling dalam satu skrip via. Rsync tidak selalu di server tujuan dan saya lebih suka bahwa skrip yang saya berikan tidak mengambil kebebasan dengan apt / yum dll untuk menginstal rsync. Sepertinya saya mungkin harus menggunakan metode scp + chmod atau rm + scp untuk memastikan izin sudah benar. : - /
zaTricky
5

Anda bisa melakukannya menggunakan tar, ssh, & umask seperti ini:

pada 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

di 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

Anda dapat melepaskan sakelar -v ke tar yang telah saya sertakan di sini hanya agar Anda dapat melihat file-file yang ditampung di host1 dan dikirim melalui STDOUT (alias. -) dan kemudian menghapus-tar di host2.

CATATAN: Mengapa ini berhasil? Perilaku default Tar adalah membongkar file menggunakan umask pengguna jarak jauh. Dalam contoh di atas saya telah menyertakan perintah umask untuk secara eksplisit mengaturnya ke sesuatu yang berbeda yang menunjukkan bahwa tar jarak jauh mengubah izin di sisi jarak jauh.

slm
sumber
1
Seperti yang saya lihat dengan perintah ini, Anda hanya dapat menerapkan lebih sedikit izin ke file yang ditransfer, karena umaskhanya mengurangi izin, misalnya untuk file lokal dengan 700Anda tidak bisa mendapatkan file dengan 755di server tujuan, atau apakah saya salah?
Jaime Hablutzel
1
Selanjutnya Anda perlu --no-same-permissionsuntuk tarpenggunaan kedua jika pengguna tujuan root, lihat superuser.com/a/383801/89031
Jaime Hablutzel
@jaime - itu benar, ini hanya akan memungkinkan Anda untuk mengatur umaskseluruh set file ketika mereka ditulis ke server jauh. Tidak ada kontrol individu untuk file yang berbeda. Saya akan sering menggunakan ini karena saya ingin menghapus izin santai yang OK di laptop saya, ketika menyalin ke penyebaran jarak jauh, misalnya.
slm
@jaime - --no-same-permissionssudah benar juga sesuai dengan tarhalaman manual. Saya telah mengubah prompt dalam contoh saya sehingga tidak ada kebingungan tentang itu.
slm
3

Saya menulis skrip kecil untuk tugas dengan Python. Anda dapat melakukan python script.py -p o + r beberapa file beberapa / 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
sumber
3
Apakah Anda keberatan memposting kode Anda di Tinjauan Kode . Mungkin ada saran yang bagus untuk meningkatkannya.
tshepang
1
Wow, saya belum pernah mendengar situs SO yang baru, Code Review, ty @Tshepang!
AnneTheAgile
2
@ AnneTheAgile bukan itu baru; sudah lebih dari 3 tahun :)
tshepang
1

Saya akan menyarankan pengaturan bit lengket pada folder sehingga file yang Anda unggah di bawah folder itu mendapat izin itu secara otomatis.

chmod 1644 dir

"1" yang digunakan di atas mengatur bit sticky.

jadi Anda hanya perlu mengunggah satu dan tidak harus menjalankan perintah lain sesudahnya.

DaveDeveloper
sumber
Bisakah seseorang menjelaskan bagaimana ini akan berhasil?
Mawg
0

Dengan asumsi Anda mengunggah ke varian UNIX, saya pikir izin harus mengikuti pengaturan UMASK Anda. Saya tidak ingat dari bagian atas kepala saya yang mana file-titik diproses untuk SCP, tetapi jika Anda mengatur UMASK Anda di salah satu file yang Anda buat akan memiliki izin ditetapkan berdasarkan itu. Mungkin tergantung pada shell apa yang Anda gunakan pada sistem remote.

Apa pun yang Anda lakukan, jangan gunakan opsi -p karena ia melakukan kebalikan dari apa yang Anda inginkan.

tvanfosson
sumber
Nggak. -p bukan yang saya inginkan karena saya memerlukan izin yang berbeda di server (ya itu UNIX) daripada di mesin lokal saya. Tentu saja saya bisa chmod mereka, gunakan -p dan kemudian chmod mereka kembali, meskipun saya harus menyimpan izin itu.
Florian Mayer
Saya tidak menyarankan agar Anda menggunakan -p, hanya menegaskan bahwa Anda. Saya akan mengklarifikasi posting saya.
tvanfosson