web-dev-qa-db-ja.com

Sudoを使用してファイルが存在するかどうかを確認するにはどうすればよいですか?

そのようにファイルが存在するかどうかを確認したい

[ -f /path/to/file/ ]

しかし、私はこのコマンドを通常のユーザーとして実行しており、ファイルの所有者はrootです。 Sudoを使用してこれを実現するにはどうすればよいですか。

Sudo [ -f /path/to/file/ ] 動作しません。

13
ckliborn

絶対パスを使用していて、-f(「ファイルが存在し、通常のファイルです」)が実際に実行したいテストである限り、あなたが説明していることはうまくいくはずです。

質問の投稿の末尾に/が表示されます-ディレクトリをテストしていますか?それは-d、または単に-eである必要があります(「タイプに関係なく、その名前で何かが存在します」)

また、途中で何かが読めない場合を除き、test[)は、rootが所有するファイルが存在するかどうかを通知できるはずです(たとえば、[ -f /root/.ssh/known_hosts ]はおそらく失敗します)。 /root/.sshディレクトリが通常のユーザーに読み取れない(または少なくともすべきではない)ためです。[ -f /etc/crontab ]は成功するはずです)。

11
voretaq7
if Sudo test -f "/path/to/file"; then
    echo "FILE EXISTS"
else
    echo "FILE DOESN'T EXIST"
fi

テストマニュアルページ

物事を完了するために、反対側で、特定のユーザーがファイルまたはディレクトリが読み取り可能かどうかをルートから確認する場合は、

if Sudo -u username test -f "/path/to/file"; then
    echo "FILE EXISTS"
else
    echo "FILE DOESN'T EXIST"
fi
13
Luca Borrione

他の回答に加えて、テストとSudo認証の失敗の区別は、最初にSudo trueを実行することで実行できます。私が知っているほとんどのSudo実装では、短期間での再認証は必要ありません。

例えば:

if Sudo true; then
    if Sudo test -f "/path/to/file"; then
        echo "FILE EXISTS"
    else
        echo "FILE DOESN'T EXIST"
    fi
else
    echo "Sudo AUTHENTICATION FAILED"
fi
1