와일드 카드가있는 sudo ls가 작동하지 않는 이유를 누구나 설명 할 수 있습니까?


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

덕분에 Muru, 귀하의 의견이 정확했습니다. 나는 755로 권한을 변경했으며 이제는 잘 작동합니다.
파이살

3
@Faisal : 진단이 올바른 것으로 밝혀졌지만 권한 변경이 올바른 해결책이 아니라고 생각합니다. 받는 사람 그대로 적절한 구제 인수를 전달 sudo는 명령을 준비하는 동안 글 로빙 않습니다하지 않는 것 같다, 오히려 (path 인수를 인용하여) 여기를 억제 할 ls다음 (신분 변경이에서 할 수 명령을 su촬영하고있다 효과) globbing을 수행하십시오.
Marc van Leeuwen

2
@MarcvanLeeuwen ls은 globbing을 수행하지 않습니다.
muru

3
sh -c명령 행 에 추가하여 sudo 환경에서 globbing을 수행 할 수 있습니다 .
Stig Hemmer

@Faisal 귀하의 질문에 대한 답변이된다면, 그것을 받아들이는 것을 고려하십시오 ...
clem steredenn

7

글 로빙이 비활성화되었을 수 있습니다.

스크립트에서 또는 대화식 셸에서 실행중인 경우 해당 줄 앞 set -f이나 뒤를 찾습니다 . 이 있다면 출력에, globbing을 사용할 수 없습니다 :set -o noglobecho $-f

$ echo $-
fhimBH

이 문제를 해결하려면, 제거 set -f또는 set -o noglob스크립트에서, 또는 경우 대화 형 쉘을 실행에 set +fset +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) 로 스크립트를 실행하는 것은 어떻습니까? 이 경우 globbing이 실패해서는 안됩니다. 어쨌든 muru는 나 자신이 아닌 그의 대답에서 경로 문제를 제안했습니다. 그의 답변 ( askubuntu.com/help/accepted-answer ) 수락을 고려해야 합니다.
kos

실제로 스크립트를 통해 원격 컴퓨터에서 실행하므로 -i가 필요합니다. 답변 해 주셔서 감사합니다.
파이살
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.