La diferencia entre semange y chcon es que chcon es "temporal" si el sistema se vuelve a etiquetar, los contextos presentes en un archivo/directorio se perderán, usar semanage hace que los contextos de selinux sean persistentes.
Para que la semanage funcione, debe proporcionar la ruta completa al archivo o directorio, por eso semanage fcontext -a -t public_content_rw_t upload/ no funciona pero semanage fcontext -a -t public_content_rw_t "/var/ftp/upload(/.*)? lo hace; restorecon no requiere la ruta completa.
Este es el contexto predeterminado
[example@unixlinux.online ftp]# ll -Zd upload/ drwxr-xr-x. root root unconfined_u:object_r:public_content_t:s0 upload/
Probé este comando para cambiar el contexto
[example@unixlinux.online ftp]# semanage fcontext -a -t public_content_rw_t upload/ [example@unixlinux.online ftp]# ll -Zd upload/ drwxr-xr-x. root root unconfined_u:object_r:public_content_t:s0 upload/
[example@unixlinux.online ftp]# restorecon -R -v upload [example@unixlinux.online ftp]# ll -Zd upload/ drwxr-xr-x. root root unconfined_u:object_r:public_content_t:s0 upload/
No funciona, pero este comando escribirá el contexto en /etc/selinux/targeted/contexts/files/file_contexts.local archivo
ver aquí
# This file is auto-generated by libsemanage # Do not edit directly. upload/ system_u:object_r:public_content_rw_t:s0
Ahora probé este comando (Comando de trabajo )
[example@unixlinux.online ftp]# semanage fcontext -a -t public_content_rw_t "/var/ftp/upload(/.*)?"
[example@unixlinux.online ftp]# restorecon -R -v upload restorecon reset /var/ftp/upload context unconfined_u:object_r:public_content_t:s0->unconfined_u:object_r:public_content_rw_t:s0
Now context is changed. [example@unixlinux.online ftp]# ll -Zd upload/ drwxr-xr-x. root root unconfined_u:object_r:public_content_rw_t:s0 upload/
Pero realmente no sé por qué está funcionando, vea la diferencia en el comando.
Obtuve la respuesta en la página man de man ftpd_selinux
semanage fcontext -a -t public_content_rw_t "/var/ftpd/incoming(/.*)?"