如何使用 sudo 检查文件是否存在?

如何使用 sudo 检查文件是否存在?

我想检查文件是否存在,像这样

[ -f /path/to/file/ ]

但是我以普通用户身份运行此命令,并且该文件归 root 所有。我如何使用 sudo 来实现这一点。

sudo [ -f /path/to/file/ ] 不起作用。

答案1

您所描述的应该可以正常工作 - 只要您使用绝对路径,并且-f(“文件存在并且是常规文件”)确实是您想要执行的测试。

我看到你在问题中发布的内容后面有一个尾注/- 你是在测试目录吗?应该是-d,或者简单地说-e(“存在具有该名称的内容 - 无论类型如何”)

还要注意,除非沿途某些东西不可读test[)应该能够告诉您root拥有的文件是否存在(例如[ -f /root/.ssh/known_hosts ]可能会失败,因为/root/.ssh目录不存在(或者至少不应该) 普通用户可读。 [ -f /etc/crontab ]应该成功)。

答案2

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

测试手册页

相反,如果你想从 root 检查某个文件或目录是否可供某个用户读取,你可以使用

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

答案3

除了其他答案之外,可以通过首先运行来区分测试或 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

答案4

我只是想把这件事说出来,因为这是我通常的做法

如果 [ $(sudo ls /etc/ | grep -ic '^wsl.conf$') -gt 0 ]; 然后 ... fi

我喜欢这种方式,因为它有点明确,而且我发现它应该 100% 有效。我遇到过这样的问题:如果我没有正确的权限,使用 -f 总是会失败

相关内容