我有一个 bash 脚本应该从/tmp
. 问题:该文件是mysql
在SELECT INTO OUTFILE
导出过程中由我的用户创建的。因此,运行脚本的用户不拥有该文件。
不过,我怎样才能删除该文件,而不必将脚本添加到 中sudo crontab
?
我的用户-crontab:
/opt/my_routine.sh
my_routine.sh:
!#/bin/bash
rm -f "/tmp/mysql_export.csv" #FAILS
mysql --user=user --password=rootpw --database=mydb < /opt/export.sql
导出.sql:
SELECT some, fields INTO OUTFILE '/tmp/mysql_export.csv' FROM mytable FIELDS TERMINATED BY ';' ESCAPED BY '' LINES TERMINATED BY '\n';
问题
重定向标准输出,所以文件是由正确的用户创建的(就像在另一个答案中一样)是一个不错的主意,但我认为你需要
TERMINATED BY
,ESCAPED BY
和LINES TERMINATED BY
. 这些需要INTO OUTFILE
。一个直接重定向标准输出的解决方案只是省略了INTO OUTFILE
,所以它不能使用TERMINATED BY
等。用于写入标准输出的尝试
INTO OUTFILE
不起作用:它不起作用,因为该文件以前必须不存在;MySQL 必须自己创建它。这有正当的安全原因(示例)。特殊文件
/proc/self/fd/1
由内核提供,因此 MySQL 拒绝它。有问题的路径是
/tmp/mysql_export.csv
. 当您尝试从中删除mysql_export.csv
时/tmp/
,您对目录的权限很重要。这/tmp/
通常是这样的:t
中的小写字母drwxrwxrwt
表示“其他”的执行权限和粘滞位设置。关于粘性位:(来源:维基百科)
您不能删除该文件,因为您既不是 root 也不是该文件的所有者。
解决方案
上面的引用只是给了我们一个线索。如果您既不是文件的所有者也不是 root,那么您需要:
因此,在某处创建一个目录,允许其他用户在其中创建文件(
chmod
,setfacl
)并调整您的程序以mysql_export.csv
在那里创建。文件出现后,即使它属于其他用户,您也可以将其删除。使用rm -f
. 没有-f
你可能会被提示,因为该文件不属于你。笔记
sudo
,你不需要在系统中设置任何额外的组。您可以从 mysql 转储结果,而不是执行 INTO FILE:
然后你的 export.sql 将只是:
或者,您可以使用
sudo rm ...
.有很多方法,具体取决于您必须使用的具体内容。
您可以在创建脚本中使用 umasks 或 chmod 以使文件组/世界可写(并确保两个用户都在组中)。
您可以以同一用户身份运行这两个脚本。您是否知道冠相关的用户指定,或使用用户特定的冠作业作为该用户运行?
(不实用,精神手淫)您可以使用保险丝或某些覆盖文件(或具有挂载权限的文件块设备)/滥用来自 vfat 等原始文件系统的权限,该文件系统没有权限概念,因此您可以在挂载时根据需要强制使用它们.