web-dev-qa-db-ja.com

ワイルドカードを使用したSudo lsが機能しない理由を説明できますか?

$ 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

なぜこれが起こるのか誰にも説明できますか?これが原因で台本に引っかかっています。

12
Faisal

1つの可能性は、そのパス(/sites/servers/server_instance/logs)の1つ以上のディレクトリにアクセスする権限がないことです。ワイルドカードの展開はシェルによって実行され、展開されたパスはSudoコマンドに渡されます。

ユーザーに権限がない場合、最初のコマンドで展開は機能しません。そのまま(ls -ltr /sites/servers/server_instance/logs/access*)実行され、文字通りaccess*という名前のファイルはありません。 abcがパス内のすべてのディレクトリに必要なアクセス許可を持っている場合、ワイルドカードを持たない2番目のコマンドはシェルによって変更されず、正常に機能します。

$ 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
24
muru

グロビングが無効になっている可能性があります。

スクリプトのこれらの行の前に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
6
kos