如何结合setpriv与重定向写入权限受限的文件
问题描述
我需要在Bash脚本中使用echo写入my_file.txt,该文件的权限信息如下:
drwxr-xr-x 2 snap_daemon root 4096 Apr 11 15:56 my_file.txt
我尝试执行以下命令:
sudo setpriv \ --clear-groups \ --reuid snap_daemon \ --regid snap_daemon -- \ echo "thing" > my_file.txt
但收到权限拒绝错误:
-bash: my_file.txt: Permission denied
原因是setpriv仅作用于echo命令,而文件重定向操作由当前shell(以原用户身份)执行,因此没有写入权限。请问如何让setpriv作用于输出到my_file.txt的重定向操作?
解决方案
方法1:通过子Shell打包命令与重定向
将echo和重定向操作封装到一个Shell命令字符串中,让setpriv切换用户后执行整个子Shell,这样重定向会以snap_daemon身份完成:
sudo setpriv \ --clear-groups \ --reuid snap_daemon \ --regid snap_daemon -- \ sh -c 'echo "thing" > my_file.txt'
使用单引号可以避免原Shell提前解析重定向符号,确保操作在切换用户后的环境中执行。
方法2:利用tee命令写入文件
通过管道将echo的输出传给tee,tee会以snap_daemon身份运行,从而获得文件写入权限:
echo "thing" | sudo setpriv \ --clear-groups \ --reuid snap_daemon \ --regid snap_daemon -- \ tee my_file.txt > /dev/null
添加> /dev/null是为了阻止tee将内容输出到终端,仅完成文件写入操作。
方法3:直接切换用户执行命令(简化版)
如果不需要setpriv的特殊参数(如--clear-groups),也可以用sudo -u直接切换用户并执行封装的Shell命令:
sudo -u snap_daemon sh -c 'echo "thing" > my_file.txt'
但如果必须依赖setpriv的特定功能,优先选择前两种方法。
内容的提问来源于stack exchange,提问作者Mia Altieri
相关产品推荐
相关产品推荐

