Dosya izinleri sembolik bağlantılar için nasıl uygulanır?


93

Diyelim ki bu yapıya sahipsin:

+ directory
-- file1
-- file2
-- file3 -> /tmp/file3

file3file3sistemde başka bir yere bir bağlantıdır .

Şimdi ben chmod 777dizini ve içindeki tüm içerikleri diyelim . Benim mu file3yılında /tmpbu izinleri almak? Ayrıca, aynı durumda olduğumuzu ancak tersine döndüğümüzü varsayalım.

/tmp/file3 -> /directory/file3

Bağlanılan dosyaya izinleri uygularsam, bu bağlantıyı nasıl etkiler?


İzinler yalnızca dosyayı etkiler, sembolik bağlantıyı değil.
baraboom

Yanıtlar:


90

Bu, nasıl aradığınıza chmodve üzerinde çalıştığınız platforma bağlıdır .

Örneğin, bir Linux sisteminde şunu man chmodsöylüyor:

chmod sembolik bağların izinlerini asla değiştirmez; chmod sistem çağrısı onların izinlerini değiştiremez. Sembolik bağlantıların izinleri asla kullanılmadığı için bu bir problem değildir. Ancak, komut satırında listelenen her sembolik bağlantı için chmod, sivri uçlu dosyanın izinlerini değiştirir. Buna karşılık, chmodözyinelemeli dizin geçişleri sırasında karşılaşılan sembolik bağları yok sayar.

Bununla birlikte, bir Mac’te, şunun gibi seçenekleri kullanarak sembolik bir bağlantının izinlerini değiştirmek için chmod kullanılabilir man chmod:

-h Dosya sembolik bir bağsa, bağlantının işaret ettiği dosya yerine bağlantının modunu değiştirin.

Örnek olarak, bu cevabın geri kalanında Linux makinesinde olduğunuzu varsayalım.

İlk durumda chmod -R 777 directory, izinleri tekrar tekrar değiştirmek için koşarsanız, bağlantı hedefi etkilenmez, ancak yaparsanız chmod 777 directory/*bunu gerçekleştirir.

Bağlantı hedefindeki izinleri doğrudan değiştirirseniz, söz konusu izinler geçerli olacaktır (man sayfası ve baraboom'un dediği gibi, gerçek bağlantı izinleri hiçbir şey için kullanılmaz).


Gösterim için test günlüğü:

$ mkdir dir && touch dir/file{1,2} /tmp/file3 && ln -s {/tmp,dir}/file3
$ ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 dir/file1
-rw-r--r-- 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

$ chmod -R 777 dir && ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group  0 2011-06-27 22:02 /tmp/file3
-rwxrwxrwx 1 user group  0 2011-06-27 22:02 dir/file1
-rwxrwxrwx 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

$ chmod 700 dir/* && ls -l dir/* /tmp/file3
-rwx------ 1 user group  0 2011-06-27 22:02 /tmp/file3
-rwx------ 1 user group  0 2011-06-27 22:02 dir/file1
-rwx------ 1 user group  0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3

2
Bu benim için de bir sürprizdi. Sonraki soru: sembolik link üzerindeki izinler kimler anlamına geliyor ?
Edward Falk

@EdwardFalk sembolik bağlantı izinleri kısıtlayıcı değildir, çünkü her şeyin bağlantılı dosyadan izin almak için geçiş yapması gerekir.
Walf,

5

Baraboom'un ve peth'in cevaplarının her ikisi de doğrudur: Sembolik linklerin kendileri üzerindeki izin bitleri önemsizdir (macOS hariç; aşağıya bakınız) ve sembolik bir link üzerindeki izin değişikliklerinin değiştirilmesi - chmodkomut satırı aracı veya chmod()sistem çağrısı gibi - sembolik bağın hedefine karşı yapıldıysa.

Symlink () sistem çağrısının SUSv4 / POSIX.1-2008 tanımını alıntılamak için :

Oluşturulan sembolik link için dosya modu bitlerinin değerleri belirtilmemiş. POSIX.1-2008 tarafından belirtilen tüm arayüzler , stat yapısının st_mode alanında döndürülen dosya modu bitlerinin değeri belirtilmediği sürece, sembolik linklerin içeriği her zaman okunabilir gibi davranır .

Burada “belirtilmemiş” her uygulama için bir yorum odasını terk eder. Özellikleri:

  • Linux'ta, (ext4fs kullanılarak test) stat()döner st_mode=0777olursa olsun sembolik link oluşturulduğu zaman umask'ı ne; ls -lbu nedenle her zaman lrwxrwxrwxsembolik bağlantılar için görüntülenir .
  • MacOS'ta (HFS) ve FreeBSD'de (hem UFS hem de ZFS), sembolik bir bağlantının kendine ait bir izni vardır: chmod -hYukarıda belirtilen komut, bu bağlantı iznini (dahili olarak lchown()bunu başarmak için POSIX dışı bir sistem çağrısı kullanan ) ve stat()sistemde değiştirebilir. çağrı için bu değeri döndürür st_mode.

Linux ve FreeBSD'deki sembolik bağlantılara POSIX tarafından belirtilen şekilde her zaman takip edilebilir. Özellikle, FreeBSD'de bu, sembolik bir bağlantının dosya modunun erişim kontrolü üzerinde hiçbir etkisinin olmadığı anlamına gelir.

Diğer yandan, macOS POSIX'i biraz kırıyor. Sembolik bir bağlantı okuma iznine bakılmaksızın izlenebilse de , kullanıcı okuma iznine sahip değilse (İzin reddedildi) readlink()ile başarısız olur EACCES:

$ sudo ln -shf target symlink
$ sudo chmod -h 444 symlink
$ ls -l symlink
lr--r--r--  1 root  staff  1 Mar 14 13:05 symlink -> target
$ sudo chmod -h 000 symlink
$ ls -l symlink

ls: symlink: Permission denied
l---------  1 root  staff  1 Mar 14 13:05 symlink
$ echo kthxbye > target
$ cat symlink
kthxbye

(Not -> targetkısmı ikinci çıktıda eksik ls -lkomuta ve bu cat symlinkhala başarılı ve içeriğini basılı targetkullanıcı izni okumuş olmamasına rağmen dosyaya symlink.)

NetBSD symperm, eğer ayarlanmışsa, sembolik bağ okuma / yürütme izinlerini kontrol etme readlink()ve aktarma izinlerine neden olan adında özel bir montaj seçeneği sunar .


-1
  1. link dosyasını bırakın (herhangi bir işlem tarafından kullanılmadığından emin olduktan sonra)
  2. umask'ı 777-umask = gerekli dosya izinlerini sağlayacak şekilde ayarlayın
  3. afresh link dosyasını oluşturmak

3
Bu soruya nasıl cevap veriyor?
00'te
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.