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.
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:
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
Tercih ettiğim çalışma çözümü rsync
bunun 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 .
--perms
. explainshell.com/...
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.
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 .
umask
, örneğin yalnızca yerel bir dosya için alt çıkarma izinleri, 700
dosyayı 755
hedef sunucuda bulamadı mı, yoksa hatalı mıyım?
--no-same-permissions
ikinci tar
kullanım için ihtiyacınız vardır , bkz. Superuser.com/a/383801/89031
umask
uzak 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.
--no-same-permissions
göre de doğru tar
. Örneğimin istemlerini değiştirdim, bu yüzden bu konuda bir karışıklık yok.
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)
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.
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.