Хто-небудь може пояснити, чому судо лс із маючий лист не працює?


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є необхідні дозволи для всіх каталогів на шляху, друга команда, яка не мала жодних марок, не торкнеться вашої оболонки, і вона буде добре працювати.

$ 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

спасибі Муру, ваша думка була правильною, я змінив дозвіл на 755 і тепер це працює нормально.
Файсал

3
@Faisal: Я думаю, що зміна дозволів не є належним засобом, хоча це показує, що діагноз є правильним. Правильне засіб , здавалося б, не робити підстановку при підготовці команди SUDO, а придушити його тут (цитуючи аргумент шляху), передаючи аргумент як є в lsкоманду , яка може потім (коли зміна тотожного suприйняв ефект) роблять глобус.
Марк ван Левен

2
@MarcvanLeeuwen lsне робить жодної глобалізації.
muru

3
Ви можете домогтися глобалізації в середовищі sudo, додавши sh -cдо командного рядка.
Stig Hemmer

@Faisal, якщо це відповідає на ваше запитання, подумайте про його прийняття ...
clem steredenn

7

У вас може бути відключений глобус.

Шукайте щось подібне 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)? У цьому випадку глобалізація не повинна провалюватися. У будь-якому випадку Муру запропонував у своїй відповіді питання про шлях, а не я. Вам слід подумати про прийняття його відповіді ( askubuntu.com/help/accepted-answer ).
kos

Насправді я запускаю це на віддаленій машині через скрипт, тому -і знадобиться. Дякую і вам за відповіді.
Файсал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.