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


13

我想检查文件是否存在

[ -f /path/to/file/ ]

但是,我以常规用户身份运行此命令,并且该文件归root用户所有。我如何使用sudo完成此操作。

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


2
它确实可以在我的系统上运行。有哪些症状?您确定要使用-f而不是-e吗?
b0fh 2011年

Answers:


11

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

/在问题中张贴了一条尾迹-您是否正在测试目录?应该是-d或简单地说-e(“该名称存在某种东西-与类型无关”)

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


4
可能存在问题:如果sudo命令失败(密码错误,/ etc / sudoers等中不允许),它将产生与文件不存在相同的结果。
Gordon Davisson

1
@戈登-是的:我的回答是根据sudo工作的部分而定的:)
voretaq7 2011年

13
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

Luca Borrione的回答对我来说非常有效。我需要测试只有根用户可以读取的目录内深层文件的存在。
wallheater 2012年

1

除其他答案外,可以通过先运行来区分测试失败还是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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.