誰もがワイルドカードを使用した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

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

Muruに感謝します。あなたの意見は正しかったので、許可を755に変更しました。
ファイサル

3
@Faisal:許可の変更は適切な解決策ではないと思いますが、診断が正しいことは明らかです。適切な解決策は、sudoコマンドの準備中にグロビングを行わずに、ここでそれを抑制し(パス引数を引用する)、引数をそのままlsコマンドに渡すことです(アイデンティティの変更suが行われたとき)効果)グロビングを行います。
マーク・ヴァン・レーウェン

2
@MarcvanLeeuwen lsはグロビングを行いません。
ムル

3
sh -cコマンドラインに追加することで、sudo環境でグロビングを実行できます。
スティグヘマー

@Faisalあなたの質問に答えることであれば、それを受け入れる考える...
steredennクレム

7

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

スクリプト内のそれらの行の前set -fまたはset -o noglob前に何かを探します。または、対話型シェルで実行している場合echo $-。あるかどう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を介して)ユーザーとして実行し、運用ユーザーを介してそのコマンドを実行しています。このための回避策はありますか?(注意すべき1つのポイントは、ユーザーを切り替えるためにパスワードを入力する必要がないことです)
ファイサル

@Faisalターゲットユーザー(sudo -u abc /path/to/script)としてスクリプトを実行してはどうですか?その場合、グロビングは失敗しないはずです。いずれにせよ、muruは私ではなくパスの問題を彼の答えで提案しました。彼の回答を受け入れることを検討する必要があります(askubuntu.com/help/accepted-answer)。
コス

実際、スクリプトを介してリモートマシンで実行しているため、-iが必要になります。答えてくれてありがとう。
ファイサル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.