$ 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
なぜこれが起こるのか誰にも説明できますか?これが原因で台本に引っかかっています。
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
グロビングが無効になっている可能性があります。
スクリプトのこれらの行の前に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