วิธีเปลี่ยนความเป็นเจ้าของจากลิงก์สัญลักษณ์?


47

ฉันกำลังประสบปัญหาบางอย่างกับการสร้างลิงค์นุ่ม ๆ ต่อไปนี้เป็นไฟล์ต้นฉบับ

$ ls -l /etc/init.d/jboss
-rwxr-xr-x 1 askar admin 4972 Mar 11  2014 /etc/init.d/jboss

การสร้างลิงก์ล้มเหลวด้วยปัญหาการอนุญาตสำหรับเจ้าของไฟล์:

ln -sv  jboss /etc/init.d/jboss1
ln: creating symbolic link `/etc/init.d/jboss1': Permission denied

$ id
uid=689(askar) gid=500(admin) groups=500(admin)

ดังนั้นฉันจึงสร้างลิงก์ด้วยสิทธิ์ sudo:

$ sudo ln -sv  jboss /etc/init.d/jboss1
`/etc/init.d/jboss1' -> `jboss'

$ ls -l /etc/init.d/jboss1
  lrwxrwxrwx 1 root root 11 Jul 27 17:24 /etc/init.d/jboss1 -> jboss

ต่อไปฉันพยายามเปลี่ยนความเป็นเจ้าของซอฟต์ลิงค์เป็นผู้ใช้ดั้งเดิม

$ sudo chown askar.admin /etc/init.d/jboss1

$ ls -l /etc/init.d/jboss1
lrwxrwxrwx 1 root root 11 Jul 27 17:24 /etc/init.d/jboss1 -> jboss

แต่การอนุญาตของซอฟต์ลิงค์จะไม่เปลี่ยนแปลง

ฉันหายไปที่นี่เพื่อเปลี่ยนการอนุญาตลิงก์หรือไม่


คุณใช้ระบบปฏิบัติการอะไร
mjturner

$ cat / etc / redhat-release Red Hat Enterprise Linux Server รีลีส 6.6 (Santiago)
Zama Ques

คำตอบ:


68

บนระบบ Linux เมื่อเปลี่ยนความเป็นเจ้าของลิงก์สัญลักษณ์โดยใช้chownตามค่าเริ่มต้นจะเปลี่ยนเป้าหมายของลิงก์สัญลักษณ์ (เช่นอะไรก็ตามที่ลิงก์สัญลักษณ์ชี้ไป )

หากคุณต้องการเปลี่ยนความเป็นเจ้าของลิงก์เองคุณต้องใช้-hตัวเลือกเพื่อchown:

-h, - ไม่มีการอ้างถึงส่งผลกระทบต่อแต่ละลิงก์สัญลักษณ์แทนไฟล์อ้างอิงใด ๆ (มีประโยชน์เฉพาะกับระบบที่สามารถเปลี่ยนความเป็นเจ้าของ symlink ได้)

ตัวอย่างเช่น:

$ touch test
$ ls -l test*
-rw-r--r-- 1 mj   mj   0 Jul 27 08:47 test
$ sudo ln -s test test1
$ ls -l test*
-rw-r--r-- 1 mj   mj   0 Jul 27 08:47 test
lrwxrwxrwx 1 root root 4 Jul 27 08:47 test1 -> test
$ sudo chown root:root test1
$ ls -l test*
-rw-r--r-- 1 root root 0 Jul 27 08:47 test
lrwxrwxrwx 1 root root 4 Jul 27 08:47 test1 -> test

โปรดทราบว่าขณะนี้เป้าหมายของลิงก์นั้นเป็นของ root

$ sudo chown mj:mj test1
$ ls -l test*
-rw-r--r-- 1 mj   mj   0 Jul 27 08:47 test
lrwxrwxrwx 1 root root 4 Jul 27 08:47 test1 -> test

และอีกครั้งลิงก์test1ยังเป็นของ root แม้ว่าจะtestมีการเปลี่ยนแปลงก็ตาม

$ sudo chown -h mj:mj test1
$ ls -l test*
-rw-r--r-- 1 mj mj 0 Jul 27 08:47 test
lrwxrwxrwx 1 mj mj 4 Jul 27 08:47 test1 -> test

และในที่สุดเราก็เปลี่ยนความเป็นเจ้าของลิงก์โดยใช้-hตัวเลือก


ในฐานะที่เป็นวงที่น่าผิดหวัง: ค่าcp -asมิได้installมิได้lnโดยตรงสามารถสร้าง symlinks กับที่ระบุผู้ใช้ / กลุ่ม
Ulrich Schwarz

7

เมื่อดำเนินการกับ symlink คุณจะต้องบอกถึงเครื่องมือส่วนใหญ่ (chown, chmod, ls ... ) เพื่อไม่ให้ลิงค์ปรากฏขึ้นอีก: คุณต้องเพิ่ม-hพารามิเตอร์ดังที่ระบุไว้ใน manpage:

-h, --no-dereference
          affect symbolic links instead of any referenced file (useful only on systems that can change the ownership of a symlink)

ดังนั้นลอง: sudo chown -h askar.admin /etc/init.d/jboss1


1
คำตอบที่กระชับที่สุด คนส่วนใหญ่มาที่นี่เพราะ chown โดยตัวมันเองไม่ทำงาน - "-h" แก้ไขสิ่งนี้
itoctopus

4

โปรดทราบด้วยว่าข้อผิดพลาดที่คุณให้ไว้ด้านบน

ln: creating symbolic link `/etc/init.d/jboss1': Permission denied

ไม่ได้เกิดจากเจ้าของ symlink เป็นบุคคลอื่นที่ไม่ใช่เจ้าของไฟล์ต้นฉบับ มันเป็น (ส่วนใหญ่อาจ) ที่เกิดจากการใช้ Askar /etc/init.dไม่ได้มีสิทธิ์ในการเขียนไปยังไดเรกทอรี


ฉันคิดว่า การเพิ่มสิทธิ์การเขียนสำหรับกลุ่มหายไป
Zama Ques
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.