ใครสามารถอธิบายได้ว่าทำไม sudo ls กับ wildcard ถึงใช้งานไม่ได้?


16
$ sudo -iu abc ls -ltr /sites/servers/server_instance/logs/access*
ls: cannot access /sites/servers/server_instance/logs/access*: No such file or directory

$ sudo -iu abc ls -ltr /sites/servers/server_instance/logs/
total 594812
-rwxrwxrwx 1 abc abc      45 Mar 21 12:42 old.log
-rwxrwxrwx 1 abc abc      304537970 Mar 24 12:45 console.log
-rwxrwxrwx 1 abc abc      304537970 Mar 24 13:20 access_nginx.log

ใครสามารถอธิบายได้ว่าทำไมสิ่งนี้ถึงเกิดขึ้น ฉันติดอยู่กับสคริปต์เนื่องจากสิ่งนี้

คำตอบ:


29

ความเป็นไปได้อย่างหนึ่งคือคุณไม่ได้รับอนุญาตให้เข้าถึงไดเรกทอรีอย่างน้อยหนึ่งไดเรกทอรีในเส้นทางนั้น ( /sites/servers/server_instance/logs) การขยายสัญลักษณ์แทนจะดำเนินการโดยเชลล์ของคุณจากนั้นเส้นทางที่ขยายจะถูกส่งผ่านไปยังsudoคำสั่ง

หากผู้ใช้ของคุณไม่มีสิทธิ์การขยายจะไม่ทำงานในคำสั่งแรก มันจะถูกเรียกใช้ตามที่เป็น ( ls -ltr /sites/servers/server_instance/logs/access*) และไม่มีชื่อไฟล์อย่างแท้จริงaccess*) หากabcไม่มีสิทธิ์ที่จำเป็นสำหรับไดเรกทอรีทั้งหมดในพา ธ คำสั่งที่สองซึ่งไม่มี wildcards จะไม่มีการแตะต้องโดยเชลล์และจะทำงานได้ดี

$ sudo namei -lx foo/bar/baz
f: foo/bar/baz
drwxr-xr-x muru    muru    foo
drwx------ test    test    bar
drwxr-xr-x muru    muru    baz

$ sudo ls foo/bar/b*
ls: cannot access 'foo/bar/b*': No such file or directory

$ sudo -u test ls foo/bar/
baz

ขอบคุณ Muru ความคิดเห็นของคุณถูกต้องฉันเปลี่ยนสิทธิ์เป็น 755 และตอนนี้ก็ใช้งานได้ดี
Faisal

3
@Faisal: ฉันคิดว่าการเปลี่ยนแปลงการอนุญาตไม่ใช่วิธีการรักษาที่เหมาะสมแม้ว่ามันจะแสดงให้เห็นว่าการวินิจฉัยนั้นถูกต้อง วิธีการรักษาที่เหมาะสมดูเหมือนจะเป็นไปไม่ได้ไม่ globbing ขณะที่การเตรียมคำสั่ง sudo แต่ระงับมันนี่ (โดยการอ้างอาร์กิวเมนต์เส้นทาง) ผ่านการโต้แย้งตามที่เป็นไปlsคำสั่งที่สามารถแล้ว (เมื่อมีการเปลี่ยนแปลงตัวตนจากsuได้ดำเนินการ ผลกระทบ) ทำ globbing
Marc van Leeuwen

2
@MarcvanLeeuwen lsไม่ได้ทำอะไรมากมาย
muru

3
คุณสามารถทำให้ globbing เกิดขึ้นในสภาพแวดล้อม sudo โดยการเพิ่มsh -cลงในบรรทัดคำสั่ง
เฮมเมอ

@Faisal หากตอบคำถามของคุณลองยอมรับ ...
clem steredenn

7

คุณอาจปิดการใช้งาน globbing

มองหาสิ่งที่ต้องการset -fหรือset -o noglobก่อนที่จะสายผู้ที่อยู่ในสคริปต์หรือถ้าในเปลือกวิ่งโต้ตอบecho $-; หากมีสิ่งใดสิ่งหนึ่งfอยู่ในผลลัพธ์การทำงานแบบกลมจะถูกปิดใช้งาน:

$ echo $-
fhimBH

หากต้องการแก้ไขให้ลบset -fหรือออกset -o noglobจากสคริปต์หรือหากอยู่ในเชลล์เชิงโต้ตอบที่รันset +fหรือset +o noglob:

$ set -f
$ echo $-
fhimBH
$ ls access*
ls: cannot access access*: No such file or directory
$ set +f
$ echo $-
himBH
$ ls access*
access

ใช่ฉันเป็นผู้ใช้ส่วนบุคคลของฉันไม่สามารถเข้าถึงเส้นทางนั้น ในสคริปต์ฉันจะเป็นผู้ใช้ของฉัน (ผ่าน ssh) และเรียกใช้คำสั่งนั้นผ่านทางผู้ใช้งานจริง มีวิธีแก้ไขปัญหานี้หรือไม่? (หนึ่งชี้ไปที่การตั้งข้อสังเกตคือฉันจะได้ไม่ต้องให้รหัสผ่านสำหรับการสลับผู้ใช้)
Faisal

@Faisal การรันสคริปต์ในฐานะผู้ใช้เป้าหมาย ( sudo -u abc /path/to/script) เป็นอย่างไร ในกรณีนั้นการโค้งไม่ควรล้มเหลว ในกรณีใด ๆ muru แนะนำปัญหาเส้นทางในคำตอบของเขาไม่ใช่ฉัน คุณควรพิจารณายอมรับคำตอบของเขา ( askubuntu.com/help/accepted-answer )
kos

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