Bất cứ ai có thể giải thích tại sao sudo ls với một ký tự đại diện không hoạt động?


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

Bất cứ ai có thể giải thích tại sao điều này xảy ra? Tôi bị mắc kẹt trên một kịch bản do điều này.

Câu trả lời:


29

Một khả năng là bạn không có quyền truy cập vào một hoặc nhiều thư mục trong đường dẫn đó ( /sites/servers/server_instance/logs). Việc mở rộng ký tự đại diện được thực hiện bởi trình bao của bạn và sau đó các đường dẫn mở rộng được chuyển đếnsudo lệnh.

Nếu người dùng của bạn không có quyền, việc mở rộng sẽ không hoạt động trong lệnh đầu tiên. Nó sẽ được chạy như nguyên trạng ( ls -ltr /sites/servers/server_instance/logs/access*) và không có tệp nào được đặt tên theo nghĩa đen access*). Nếu abckhông có quyền yêu cầu cho tất cả các thư mục trong đường dẫn, lệnh thứ hai, không có bất kỳ ký tự đại diện nào, sẽ không được chạm vào bởi shell của bạn và nó sẽ hoạt động tốt.

$ 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

cảm ơn Muru, ý kiến ​​của bạn đã đúng, tôi đã thay đổi quyền thành 755 và hiện tại nó hoạt động tốt.
Faisal

3
@Faisal: Tôi sẽ nghĩ rằng việc thay đổi quyền không phải là biện pháp khắc phục thích hợp, mặc dù nó cho thấy chẩn đoán là chính xác. Biện pháp khắc phục thích hợp dường như là không thực hiện toàn cầu trong khi chuẩn bị lệnh sudo, mà là triệt tiêu nó ở đây (bằng cách trích dẫn đối số đường dẫn), chuyển đối số như là đến lslệnh có thể (khi thay đổi danh tính suđã được thực hiện hiệu ứng) làm Globing.
Marc van Leeuwen

2
@MarcvanLeeuwen lskhông thực hiện bất kỳ hành vi nào.
muru

3
Bạn có thể làm cho Globing xảy ra trong môi trường sudo bằng cách thêm sh -cvào dòng lệnh.
Stig Hemmer

@Faisal nếu điều đó trả lời câu hỏi của bạn, hãy xem xét chấp nhận nó ...
clem steredenn

7

Bạn có thể bị vô hiệu hóa toàn cầu.

Tìm kiếm một cái gì đó như set -fhoặc set -o noglobtrước những dòng trong kịch bản, hoặc nếu trong một vỏ tương tác chạy echo $-; nếu có một fđầu ra, globalbing bị vô hiệu hóa:

$ echo $-
fhimBH

Để khắc phục điều đó, hãy xóa set -fhoặc set -o noglobkhỏi tập lệnh hoặc nếu trong trình bao tương tác chạy set +fhoặc 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

Vâng, tôi là người dùng cá nhân của tôi không có quyền truy cập vào đường dẫn đó. Trong kịch bản tôi sẽ là người dùng của tôi (thông qua ssh) và chạy lệnh đó thông qua người dùng sản xuất. Có bất kỳ công việc xung quanh cho điều này? (Một điểm cần lưu ý là tôi không phải cung cấp mật khẩu để chuyển đổi người dùng)
Faisal

@Faisal Làm thế nào về việc chạy tập lệnh với tư cách là người dùng đích ( sudo -u abc /path/to/script)? Trong trường hợp đó, Globing không nên thất bại. Trong mọi trường hợp, muru đề nghị vấn đề đường dẫn trong câu trả lời của anh ấy, không phải tôi. Bạn nên cân nhắc việc chấp nhận câu trả lời của anh ấy ( askubfox.com/help/accepted-answer ).
kos

Trên thực tế tôi đang chạy nó trên máy từ xa thông qua script nên tôi sẽ cần. Cảm ơn bạn cũng đã trả lời.
Faisal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.