使用sudo时如何使用tee

Cur*_*Sam 3 bash sudo

UBuntu 16.04 Bash 4.4

在4-bash-update.sh第158行:

cd "$drive00" && sudo -H -u myuser bash -c "timeout 2s ./binaryfile -gentoken" > "${save_log_dir}"/update-"${now}".log;
                                                                              ^-- SC2024: sudo doesn't affect redirects. Use ..| sudo tee file
Run Code Online (Sandbox Code Playgroud)

我尝试了几次,每次我的文件被吃掉.

Bar*_*mar 5

您不需要使用tee,只需将重定向放在执行的命令中bash -c:

sudo -H -u myuser bash -c 'timeout 2s ./binaryfile -gentoken > "$1"' _ "${save_log_dir}/update-${now}.log"
Run Code Online (Sandbox Code Playgroud)

如果您在外部重定向,原始shell将尝试打开该文件,但它没有权限.将它放在bash参数中会在目标用户的shell中以其权限执行它.

_在命令行是一个虚拟的值$0壳的参数.您需要该占位符才能提供文件名$1.

  • 更好的做法是使'sudo -H -u myuser bash -c'超时2s ./binaryfile -gentoken>"$ 1"'_"$ {save_log_dir}/update - $ {now} .log"`,所以你不是' t将数据(文件名)替换为代码(`sh -c`的参数).当然,OP可能会控制`save_log_dir`和`now`的值,但是在以后对上传/不受信任/用户提供的文件名进行操作时,最好养成良好的习惯. (2认同)