我有一个bash脚本,应该从中删除文件/tmp
。问题:文件是mysql
在SELECT INTO OUTFILE
导出期间由我的用户创建的。因此,运行脚本的用户不拥有该文件。
不过,如何在不添加脚本的情况下删除该文件sudo crontab
呢?
myuser-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
export.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
。重定向stdout的直接解决方案只是忽略INTO OUTFILE
,因此无法使用TERMINATED BY
etc。
INTO OUTFILE
用于写入标准输出的尝试不起作用:
SELECT some, fields INTO OUTFILE '/proc/self/fd/1' FROM mytable FIELDS TERMINATED BY ';' ESCAPED BY '' LINES TERMINATED BY '\n';
这是行不通的,因为文件之前一定不能存在。MySQL必须自己创建它。为此有充分的安全原因(示例)。特殊文件/proc/self/fd/1
由内核提供,因此MySQL拒绝了它。
有问题的路径是/tmp/mysql_export.csv
。当您尝试从中删除mysql_export.csv
时/tmp/
,目录的权限很重要。这是怎么/tmp/
看起来平常喜欢:
$ ls -ld /tmp/
drwxrwxrwt 1 root root 1772 Nov 1 19:39 /tmp/
$
小写t
中drwxrwxrwt
表示为“其他”和粘性位设置执行权限。关于粘性位:
粘性位最常见的用法是在类Unix操作系统的文件系统中的目录上。设置目录的粘性位后,文件系统会以特殊方式处理此类目录中的文件,因此只有文件的所有者,目录的所有者或根目录才能重命名或删除文件。没有设置sticky位,任何具有目录写和执行权限的用户都可以重命名或删除包含的文件,而不管文件的所有者。
(来源:Wikipedia)
您不能删除文件,因为您既不是root用户也不是文件的所有者。
以上引用只是给我们一个线索。如果您既不是文件的所有者,也不是根用户,那么您需要:
因此,在某个位置创建一个目录,允许其他用户在其中创建文件(chmod
,setfacl
),并调整在mysql_export.csv
此处创建的过程。文件出现后,即使它属于另一个用户,也可以将其删除。使用rm -f
。如果没有-f
您,则可能会提示您,因为该文件不属于您。
sudo
,也不需要在系统中设置任何其他组。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句