เปลี่ยนการอนุญาตสำหรับลิงก์สัญลักษณ์


37

ฉันมี symlink ด้วยสิทธิ์เหล่านี้:

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

symlink ตั้งอยู่ในไฟล์. tar.gz ตอนนี้เมื่อฉันคลายไฟล์เก็บถาวร tar.gz โดยใช้ maven symlink จะใช้ไม่ได้อีกต่อไป ฉันจึงพยายามสร้าง symlink ขึ้นใหม่ ก่อนอื่นฉันจะสร้าง symlink โดยใช้lnแต่ฉันจะตั้งค่าการอนุญาตเหมือนกับ symlink ดั้งเดิมได้อย่างไร?

คำตอบ:


59

คุณสามารถสร้าง symlink ใหม่และย้ายไปยังตำแหน่งของลิงก์เก่า

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

ที่จะรักษาความเป็นเจ้าของลิงก์ หรือคุณสามารถใช้chownเพื่อตั้งค่าความเป็นเจ้าของลิงก์ด้วยตนเอง

chown -h myuser:myuser npm

ในระบบส่วนใหญ่การอนุญาต symlink ไม่สำคัญ เมื่อใช้ symlink สิทธิ์ขององค์ประกอบของเป้าหมายของ symlink จะถูกตรวจสอบ อย่างไรก็ตามในบางระบบพวกเขามีความสำคัญ MacOS ต้องได้รับอนุญาตการอ่านบนลิงค์readlinkและsympermตัวเลือกการเมาท์ของ NetBSD จะบังคับให้มีการตรวจสอบการอนุญาตการอ่านและการสำรวจเส้นทาง ในระบบเหล่านั้น (และญาติพี่น้องรวมทั้ง FreeBSD และ OpenBSD) มีเทียบเท่าตัวเลือกในการ-hchmod

chmod -h 777 npm

1
ฉันเพิ่งพบปัญหาเรื่องสิทธิ์อนุญาตด้วย symlink บนเซิร์ฟเวอร์ CentOS 6.8 symlink มีเจ้าของ: กลุ่ม root: root เมื่อเจ้าของและกลุ่มถูกเปลี่ยนเป็นผู้ใช้ที่เป็นเจ้าของไดเรกทอรีดังที่แสดงในคำตอบนี้ปัญหาการอนุญาตก็หายไป
Night Owl

เพียงแค่ให้คำอธิบาย ในการเปลี่ยนความเป็นเจ้าของหรือสิทธิ์บน symlink แฟล็ก -h จะส่งผลกระทบต่อไฟล์ symlink แทนไฟล์ที่ถูกอ้างถึง
UltimaWeapon

12

เมื่อคุณพยายามที่จะใช้chmodการตั้งค่าการอนุญาตของลิงค์จริง ๆ แล้วที่คุณทำคือการตั้งค่าการอนุญาตของเป้าหมายของการเชื่อมโยงสิทธิ์ของการเชื่อมโยงจะไม่มีความหมาย


2
จะเกิดอะไรขึ้นถ้ามีคนเปลี่ยนลิงค์ไปยังโค้ดที่เป็นอันตราย รหัสต้นฉบับอาจเป็นสิ่งที่รูทสามารถเข้าถึงได้เท่านั้น ตัวอย่างเช่นในสคริปต์ crontap
aliqandil

@aliqandil โดยทั่วไปผู้ใช้สามารถลบและสร้างไฟล์ใด ๆ ในไดเรกทอรีที่พวกเขามีการเข้าถึงการเขียน ในทุบตีสำหรับไฟล์testที่มี-rw-rw-r-- root rootสำหรับrm testฉันได้รับพรอมต์rm: remove write-protected regular empty file 'test'?วิธีการแก้ปัญหาคือการวางไฟล์ที่สำคัญในไดเรกทอรีที่ผู้ใช้มีการอ่านอย่างเดียวเข้าถึง
AnOccasionalCashew

5

เมื่อคุณมีลิงค์เช่น:

link -> foo/bar

และต้องการเปลี่ยนเป็น:

link -> new/target

มีสองกรณีที่ควรพิจารณา:

  1. foo/barfooไม่ได้เป็นไดเรกทอรีหรือไม่มีอยู่หรือคุณไม่สามารถเข้าถึงการค้นหา แล้วก็

    ln -s new/target link
    

    จะล้มเหลวเพราะlinkมีอยู่แล้ว แต่คุณสามารถเอาชนะได้โดยใช้มาตรฐาน:

    ln -fs new/target link
    
  2. foo/barเป็นไดเรกทอรี (และคุณมีสิทธิ์ในการค้นหาเพื่อfooให้สามารถระบุได้ว่าfoo/barเป็นไดเรกทอรี) ในกรณีนั้นเมื่อคุณ:

    ln -s new/target link
    

    หรือ

    ln -fs new/target link
    

    ที่เข้าใจว่าเป็นการสร้างtargetsymlink ใหม่ภายในlinkไดเรกทอรี ( linkเป็นไดเรกทอรีเพราะเป็น symlink ไปยังfoo/barไดเรกทอรี) ดังนั้นคุณจะสร้าง:

    foo/bar/target -> new/target
    

    เพื่อเอาชนะสิ่งนั้น GNU lnจึงมี-Tตัวเลือกสำหรับชื่อลิงก์ที่ถูกพิจารณาว่าเป็นชื่อลิงก์เสมอและไม่ใช่เป็นไดเรกทอรีเพื่อสร้างลิงก์ (s) ระบบดังนั้นด้วย GNU ln:

    ln -fsT new/target link
    

    จะทำงาน. เหมือนก่อนหน้านี้มันจะลบlinksymlink ดั้งเดิมและสร้างใหม่ด้วยnew/targetเป็นเป้าหมาย (และกระบวนการ 'euid และ egid เป็นเจ้าของ)

    GNU lnยังมี-nตัวเลือกอีกด้วย มันทำงานเหมือน-Tยกเว้นเมื่อlinkจริง ๆ แล้วเป็นไดเรกทอรีจริงซึ่งในกรณีนี้มันจะยังสร้าง symlink ภายในไดเรกทอรีนั้น (แทนที่จะล้มเหลวด้วยข้อผิดพลาด)

    ตัวเลือกที่ดีที่สุดของคุณคือการลบลิงค์ออกก่อนแล้วจึงสร้างใหม่:

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

ในระบบส่วนใหญ่สิทธิ์ใน symlinks rwxrwxrwxจะถูกละเลยและถาวรโดยทั่วไป

บนระบบที่ symlink อนุญาตเรื่อง (เช่น OS / X ที่คุณต้องการสิทธิ์อ่านเพื่อ symlink เพื่อให้สามารถแก้ไขเป้าหมายได้) โดยทั่วไปจะมีวิธีการเปลี่ยน ( chmod -hบน OS / X)

การเป็นเจ้าของในขณะที่ด้านบนไม่เกี่ยวข้องกับการเข้าถึงไฟล์ที่ชี้ไปที่ symlink ในระบบส่วนใหญ่สามารถมีความเกี่ยวข้องอื่น ๆ ได้tเล็กน้อยไดเรกทอรีหลักหรือโควต้า ... ) และมีคำสั่งมาตรฐานที่จะเปลี่ยน:

chown -h user[:group] the-link
chgrp -h group the-link

0

หากคุณต้องการเปลี่ยนการอนุญาต symlink (โดยปกติจะไม่มีความหมายตามที่เขียนไว้ในคำตอบอื่น ๆ ) ฉันประสบความสำเร็จในการใช้-Rตัวเลือกของchown:

chown -R myuser:mygroup link

หาก-Rไม่ได้ใช้การอนุญาตจะไม่เปลี่ยนแปลง


ที่จะทำงานกับ GNU chownเพราะ-Rโดยนัย-Pแต่ไม่รับประกันและจะไม่ทำงานในการใช้งาน chown อื่น ๆ วิธีมาตรฐานในการเปลี่ยนความเป็นเจ้าของ symlink คือด้วย-hตัวเลือก ฉันเพิ่งอัปเดตคำตอบที่ยอมรับซึ่งไม่ถูกต้อง
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.