Scp ile yükledikten sonra izinleri değiştir


44

Dosyalarımı scp kullanarak kabuk hesabıma yüklüyorum. Sunucu üzerinde bilgisayarımdan farklı izinlere ihtiyacım olduğu için, hesaba yüklerken izinleri kolayca değiştirebilir ve hesaba ssh gerekmeden ve bunları manuel olarak değiştirebilirim.

Yanıtlar:


29

Bir Windows makinesinden kopyalıyorsanız, kopyalamak için WinSCP kullanabilirsiniz ve yüklendikten sonra kopyalanan dosyalar için izinleri ayarlama seçeneği vardır.

Değilse, tek seçeneğiniz, ssh komutuyla uzaktan yapabileceğiniz, yüklemeden sonra sunucuda bir chmod yürütmek olduğunu düşünüyorum:

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

Ben de düşündüm, peki ya sonra dizinleri yüklüyorsun?
Florian Mayer

Hm, chmod -R yapabilirim o zaman. Kötü bir fikir değil sanırım.
Florian Mayer

1
Sağ. scp -r, sonra ssh chmod -R
zigdon

1
Aynı şeyi plink ve pscp ile de yaptım (macun paketinden)
stevepastelan 22:13

22

Tercih ettiğim çalışma çözümü rsyncbunun yerine kullanmak olacaktır :

Değiştir:

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

İle:

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

Bu, iki kez kimlik doğrulamanızı önler. Ayrıca, muhtemelen rsync ile sahibi, grubu koruyabilmek gibi değer katabilecek başka seçenekler de var .


Bu çalışmıyor.
soham

1
Sebebini öğrendim. Sen de kullanmalısın --perms. explainshell.com/...
Soham

5
Tam, geçerli, komut, pelase gösterebilir misiniz? Ya yorum olarak, ya da cevabı
düzenleyerek

6

Scp ile bazı deneyler yaptım. Hedef sunucuya yüklenen yeni dosyalar için dosyalar kaynak sunucudaki izinlere aynıdır. Hedef sunucuda varolan dosyaların üzerine yazılmışsa, bu dosyaların izinleri değişmez.

Bu deneyleri CentOS 4.6 ile yaptım.


3
Bu bir cevap yerine bir yorum olmalıdır
Jaime Hablutzel

2
Agred (ama gerçekten yardımcı oldu ;-)
Mawg

Bu benim bir senaryo ile dolaşmaya çalıştığım şey. Rsync her zaman hedef sunucuda değildir ve verdiğim betiğin rsync'i kurmak için apt / yum etc gibi özgürlükleri ortadan kaldırmamasını tercih ederim. İzinlerin doğru olduğundan emin olmak için scp + chmod veya rm + scp yöntemine gitmem gerekebilir gibi görünüyor. : - /
zaTricky

5

Bunu tar, ssh, & umask gibi kullanarak yapabilirsiniz:

ana bilgisayar 1'de:

[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

host2'de:

[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 anahtarlarını yalnızca buraya dahil ettiğim tar öğesine bırakarak, host1'de taranan ve STDOUT (aka. -) aracılığıyla gönderilen ve daha sonra host2'de taranmayan dosyaları görebilirsiniz.

NOT: Bu neden işe yarıyor? Tar'ın varsayılan davranışı, uzak bir kullanıcının umask kullanarak dosyaları açmaktır. Yukarıdaki örnekte, bunu açıkça, uzak katranın uzak taraftaki izinleri değiştirdiğini gösteren farklı bir şeye ayarlamak için umask komutunu ekledim .


1
Bu komutla görebileceğim gibi, aktarılan dosyalara yalnızca daha az izin uygulayabilirsiniz umask, örneğin yalnızca yerel bir dosya için alt çıkarma izinleri, 700dosyayı 755hedef sunucuda bulamadı mı, yoksa hatalı mıyım?
Jaime Hablutzel

1
Ayrıca , hedef kullanıcı root ise --no-same-permissionsikinci tarkullanım için ihtiyacınız vardır , bkz. Superuser.com/a/383801/89031
Jaime Hablutzel

@jaime - bu doğrudur, bu yalnızca umaskuzak sunucuya yazılan tüm dosya kümesini ayarlamanıza olanak sağlar. Farklı dosyalar için bireysel kontrol yoktur. Örneğin, uzaktaki bir dağıtıma kopyalarken dizüstü bilgisayarımda normal olan rahat izinleri çıkarmak istediğimden bunu sık kullanacağım.
slm,

@jaime - 'in man sayfasına --no-same-permissionsgöre de doğru tar. Örneğimin istemlerini değiştirdim, bu yüzden bu konuda bir karışıklık yok.
slm

3

Python'daki görev için küçük bir senaryo yazdım. Yapabilirsiniz python script.py -p o + r bazı dosyalar bazı / 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
Eğer adresinden kodu gönderirken sakıncası var mı Kod İnceleme . Nasıl geliştirilebileceği konusunda güzel öneriler olabilir.
tshepang

1
Vay, yeni SO sitesi, Code Review, ty @Tshepang'ı hiç duymadım!
AnneTheAgile

2
@AnneTheAgile o kadar yeni değil; 3 yaşından fazla :)
tshepang

1

Klasöre yapışkan bir bit ayarlamanızı öneririm, böylece bu klasöre yüklediğiniz dosyalar otomatik olarak bu izni alır.

chmod 1644 dir

Yukarıda kullanılan "1" yapışkan parçayı ayarlar.

bu nedenle yalnızca birini yüklemeniz ve sonradan başka bir komut çalıştırmanız gerekmez.


Birisi bunun nasıl işe yarayacağını açıklayabilir mi, lütfen?
Mawg

0

Bir UNIX değişkenine yüklediğinizi varsayarsak, izinlerin UMASK ayarlarınızı takip etmesi gerektiğini düşünüyorum. SCP için hangi nokta dosyalarının işlendiğini kafamın üstünden hatırlamıyorum, ancak UMASK'ınızı oluşturduğunuz dosyalardan birine ayarlarsanız, buna göre izinleri verilecek. Muhtemelen uzaktaki sistemde hangi kabuğu kullandığınıza bağlıdır.

Ne yaparsanız yapın, -p seçeneğini kullanmayın, istediğinizi tam tersi yapar.


Hayır! -p istediğim şey değildi, çünkü sunucu üzerinde (evet, bu bir UNIX kodu) yerel makinemden farklı izinlere ihtiyacım var. Tabii ki onları chmod edebilir, -p kullanabilir ve sonra onları chmod edebilirim, ancak izinleri saklamam gerekebilirdi.
Florian Mayer

-P'yi kullanmanızı önermedim, sadece olduğunuzu onaylayın. Görevimi açıklığa kavuşturacağım.
tvanfosson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.