我想检查文件是否存在,像这样
[ -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 总是会失败