La pregunta es sobre la configuración de los permisos para asegurarse de que el archivo no sea legible en todo el mundo (solo lectura/escritura para el usuario actual).
Desafortunadamente, por su cuenta, el código:
fd = os.open('/path/to/file', os.O_WRONLY, 0o600)
no garantiza que los permisos serán niega al mundo. Garantiza que el archivo tendrá r/w para el usuario actual, ¡eso es todo!
En dos sistemas de ensayos muy diferentes, este código crea un archivo con -rw-r - r-- con mi máscara de usuario por defecto, y -rw-rw-rw- con máscara de usuario (0), que es definitivamente no es lo que se desea (y plantea un serio riesgo de seguridad).
Si desea asegurarse de que el archivo no tiene bits establecidos para el grupo y en el mundo, usted tiene que umask estos bits primero (recuerde - máscara de usuario es negación de permisos):
os.umask(0o177)
Además, para estar 100% seguro de que el archivo no existe con diferentes permisos, primero debe modificarlo/eliminarlo (eliminar es más seguro, ya que es posible que no tenga permisos de escritura en el directorio de destino, y si tiene problemas de seguridad, no desea escribir ningún archivo donde no se le permita), de lo contrario puede tener un problema de seguridad si un pirata informático crea el archivo antes que usted con permisos de r/w en todo el mundo en previsión de su mo ve. En ese caso, os.open abrirá el archivo sin establecer sus permisos en absoluto y uno se queda con un archivo mundial r/w secreta ...
por lo que necesita:
import os
if os.path.isfile(file):
os.remove(file)
original_umask = os.umask(0o177) # 0o777^0o600
try:
handle = os.fdopen(os.open(file, os.O_WRONLY | os.O_CREAT, 0o600), 'w')
finally:
os.umask(original_umask)
Esto es la forma segura de garantizar la creación de un archivo -rw ------- independientemente de su entorno y configuración. Y, por supuesto, puede atrapar y manejar los IOErrors según sea necesario. Si no tiene permisos de escritura en el directorio de destino, no debería poder crear el archivo, y si ya existía, la eliminación fallará.
Considero que esta respuesta es mejor que la mía, pero no es "cuál es el problema": presenta un factor nuevo que el OP no sabe: es la conversión de un manejador de archivos en un objeto de archivo Python – jsbueno
@jsbueno: I ' Solo he combinado las dos primeras líneas y he usado 'con'. Y en el ejemplo en la pregunta, el archivo se cierra a través de 'myFileObject.close()' de todos modos. – vartec
Esto no funciona para mí. os.open con estos flags espera que el archivo ya exista. >>> f = os.open ('test.txt', os.O_WRONLY, 0600) Traceback (última llamada más reciente): Archivo "", línea 1, en OSError: [Errno 2] No existe dicho archivo o directorio: 'test.txt' –