Ubah izin untuk tautan simbolis

37

Saya memiliki symlink dengan izin ini:

lrwxrwxrwx 1 myuser myuser       38 Aug 18 00:36 npm -> ../lib/node_modules/npm/bin/npm-cli.js*

Symlink terletak di arsip .tar.gz. Sekarang ketika saya membongkar arsip tar.gz menggunakan maven symlink tidak lagi valid. Karena itu saya mencoba merekonstruksi symlink. Pertama saya membuat symlink menggunakan ln tetapi bagaimana cara mengatur izin yang sama dengan symlink asli?

u123
sumber

Jawaban:

59

Anda dapat membuat symlink baru dan memindahkannya ke lokasi tautan lama.

ln -s <new_location> npm2
mv -f npm2 npm

Itu akan mempertahankan kepemilikan tautan. Atau, Anda dapat menggunakan chownuntuk mengatur kepemilikan tautan secara manual.

chown -h myuser:myuser npm

Pada kebanyakan sistem, izin symlink tidak penting. Saat menggunakan symlink, izin komponen target symlink akan diperiksa. Namun, pada beberapa sistem mereka penting. MacOS memerlukan izin baca pada tautan readlink, dan sympermopsi pemasangan NetBSD memaksa izin tautan memeriksa baca dan lintasan. Pada sistem tersebut (dan kerabat mereka, termasuk FreeBSD dan OpenBSD) ada -hopsi yang setara untuk chmod.

chmod -h 777 npm
JdeBP
sumber
1
Saya baru saja mengalami masalah izin dengan symlink di server CentOS 6.8. Symlink memiliki pemilik: grup root: root. Ketika pemilik dan grup diubah menjadi pengguna yang memiliki direktori tempat mereka berada, seperti yang ditunjukkan dalam jawaban ini, masalah izin hilang.
Night Owl
Hanya memberikan klarifikasi. Untuk mengubah kepemilikan atau hak pada symlink, flag -h akan memengaruhi file symlink alih-alih file dereferenced.
UltimaWeapon
12

Saat Anda mencoba menggunakan chmoduntuk mengatur izin tautan, yang sebenarnya Anda lakukan adalah mengatur izin target tautan. Izin tautan tidak ada artinya.

Lakukan saja
sumber
2
Bagaimana jika seseorang mengubah tautan ke kode berbahaya? Kode asli bahkan dapat menjadi sesuatu yang hanya dapat diakses oleh root. Misalnya dalam skrip crontap.
aliqandil
@aliqandil Umumnya pengguna dapat menghapus dan membuat ulang file apa pun dalam direktori yang mereka miliki akses tulisnya. Dalam bash, untuk file testdengan -rw-rw-r-- root root, untuk rm testsaya menerima konfirmasi rm: remove write-protected regular empty file 'test'?. Solusinya adalah menempatkan file sensitif dalam direktori di mana pengguna memiliki akses hanya baca.
AnOccasionalCashew
5

Ketika Anda memiliki tautan seperti:

link -> foo/bar

dan ingin mengubahnya menjadi:

link -> new/target

Ada dua hal yang perlu dipertimbangkan:

  1. foo/barbukan direktori atau tidak ada atau Anda tidak memiliki akses pencarian foo. Kemudian

    ln -s new/target link
    

    akan gagal karena linksudah ada, tetapi Anda dapat mengatasinya dengan menggunakan standar:

    ln -fs new/target link
    
  2. foo/baradalah direktori (dan Anda memiliki izin pencarian foountuk dapat menentukan itu foo/baradalah direktori). Dalam hal itu, ketika Anda melakukannya:

    ln -s new/target link
    

    atau

    ln -fs new/target link
    

    Itu dipahami sebagai membuat targetsymlink baru di dalam linkdirektori ( linkadalah direktori karena itu adalah symlink ke foo/bardirektori). Jadi, Anda akan benar-benar membuat:

    foo/bar/target -> new/target
    

    Untuk mengatasinya, GNU lnmemiliki -Topsi agar nama tautan selalu dianggap sebagai nama tautan, dan bukan sebagai direktori untuk membuat tautan. Jadi, dengan GNU ln:

    ln -fsT new/target link
    

    akan bekerja. Seperti sebelumnya, itu akan menghapus linksymlink asli dan membuatnya lagi dengan new/targetsebagai target (dan proses 'euid dan egid sebagai pemilik).

    GNU lnjuga memiliki -nopsi. Ini berfungsi seperti -Tkecuali ketika linksebenarnya merupakan direktori nyata dalam hal ini masih akan membuat symlink di dalam direktori itu (bukannya gagal dengan kesalahan).

    Mudah-mudahan, opsi terbaik Anda adalah menghapus tautan terlebih dahulu dan kemudian membuatnya kembali:

    rm -f link && ln -s new/target link
    

Pada sebagian besar sistem, izin pada symlink diabaikan dan umumnya diperbaiki rwxrwxrwx.

Pada sistem di mana perizinan symlink penting (seperti OS / X di mana Anda memerlukan izin baca untuk symlink untuk dapat menyelesaikan targetnya), umumnya ada cara untuk mengubahnya ( chmod -hpada OS / X).

Kepemilikan, sementara seperti di atas tidak relevan untuk akses ke file yang ditunjuk oleh symlink pada kebanyakan sistem, dapat memiliki beberapa relevansi lain dengan tsedikit direktori induk atau kuota ... ) dan ada perintah standar untuk mengubahnya:

chown -h user[:group] the-link
chgrp -h group the-link
Stéphane Chazelas
sumber
0

Jika Anda benar-benar perlu mengubah izin symlink (biasanya tidak berarti, seperti yang ditulis dalam jawaban lain), saya berhasil menggunakan -Ropsi chown:

chown -R myuser:mygroup link

Jika -Rtidak digunakan, izin tidak diubah.

Miroslav Mocek
sumber
Itu akan bekerja dengan GNU chownkarena -Rtersirat di -Psana, namun itu tidak dijamin dan tidak akan bekerja di beberapa implementasi chown lainnya. Cara standar untuk mengubah kepemilikan symlink adalah dengan -hopsi. Saya baru saja memperbarui jawaban yang diterima yang tidak benar.
Stéphane Chazelas