ls colors: ¿por qué algunas de mis fuentes son negras y otras verdes en ls output?

10

Subí algunos archivos de fuentes a AWS (ejecutando Amazon Linux) y los moví al /usr/share/fontsdirectorio usando un cpcomando en .ebextensions.

Cuando ingreso SSH desde mi Mac y uso ls -a, veo que algunos archivos tienen un color diferente: un conjunto de archivos de fuente es negro mientras que otros son verdes. Tengo curiosidad por saber qué causó esto, y si creará algún problema para mi código .

directorio de fuentes en Elastic Beanstalk con AWS Linux

Captura de pantalla de ls -la

De otra respuesta en AskUbuntu encontré esta clave sobre cómo interpretar estos colores. No puedo entender por qué un .ttf sería ejecutable o por qué un conjunto de .ttfs sería reconocido y no otro.

Azul: Directorio

Verde: archivo de datos ejecutable o reconocido

Sky Blue: archivo vinculado

Amarillo con fondo negro: dispositivo

Rosa: archivo de imagen gráfica

Rojo: archivo de archivo

Todos estos archivos se descargaron a una Mac desde varios sitios de fuentes antes de cargarlos.

Pranab
fuente
55
Los colores específicos (azul, rosa, etc.) no significan nada. Puedes personalizar los colores para que sean lo que quieras. linux-sxs.org/housekeeping/lscolors.html Para verificar los colores para su sistema específico, repita $ LS_COLORS
beardedlinuxgeek
Para aclarar, mi intención no era realmente sobre los colores per se, sino entender si esto indica que enfrentaré algún problema con mis scripts / código.
Pranab

Respuestas:

13

ls -lle dirá definitivamente si un archivo es ejecutable o no. No creo que haya ningún gran misterio aquí. Usted descargó archivos de varias fuentes, cada uno de los cuales podría tener diferentes bits de permiso establecidos por una razón u otra. * Si no le gusta ver algunos con colores y otros sin probar chmod -x *.ttf... los archivos de fuentes no deberían necesitar el conjunto de bits ejecutable.

* Como dice el comentario altamente votado de Matteo Italia, que debe preservarse, dice: Lo más probable es que se hayan copiado de un volumen FAT o NTFS, que no almacena el bit ejecutable, por lo que se montan de manera predeterminada para que todos los archivos tengan el bit ejecutable establecido .

Capa B
fuente
1
Exactamente. La única diferencia entre un archivo normal que tiene un conjunto de permisos 'ejecutable', y uno que no lo es, es que cuando intenta ejecutar el archivo desde la línea de comandos, para el archivo con el conjunto de bits x, el SO intentará usar un programa, si cualquiera de estos se define en el sistema, para abrir ese archivo.
Gnudiff
2
@Pranab no, para las fuentes no debería haber ninguna diferencia.
Gnudiff
1
@Pranab Me alegro de poder ayudar. Cuando estoy en una computadora adecuada con teclado, intentaré dar una respuesta un poco más informativa, para que haya un contexto más amplio disponible.
Gnudiff
1
En realidad, prefiero no engañar a alguien que no sabe lo contrario, así que aquí está mi comentario original menos los bits incorrectos: hay varias razones por las que el bit podría establecerse ... si en algún punto de la línea alguien activa el bit ejecutable, entonces eso podría "seguir" el archivo. (Esto supone que cada persona que lo copia conserva esos bits originales). En cualquier caso, es bastante inofensivo.
B Layer
12
Lo más probable es que se hayan copiado de un volumen FAT o NTFS, que no almacena el bit ejecutable, por lo que se montan de forma predeterminada para que todos los archivos tengan el bit ejecutable establecido .
Matteo Italia
6

Parece que el lscomando que está ejecutando es un alias parals --color

hombre ls

--color [= CUANDO] colorea la salida; CUANDO puede ser 'siempre' (predeterminado si se omite), 'auto' o 'nunca'; más información a continuación

Puede verificarlo ejecutando el origen ls:

  • Usando comillas:

    "ls" -a

  • Usando la ruta completa (por ejemplo, si la lsubicación está en /bin/ls) y ver si muestra los colores o no:

    / bin / ls -a

Nota: la ejecución ls -lale mostrará los detalles de los archivos y podrá ver los detalles completos de cada archivo, lo que le permitirá verificar con la salida esperada dels --color

Yaron
fuente
Es interesante cuántas formas hay de llegar al comando central. No conocía el método de rodear con comillas. Por lo menos con bash, uno también puede preceder al comando con barra invertida, \ls -ao utilice la orden interna 'comando', command ls -a. Si desea ver cómo se resuelve un comando, en lugar de ejecutarlo, lo hay type -a ls.
B Layer
@BlairM. Las comillas y los métodos de barra diagonal inversa solo evitan la expansión de alias. No tendrán ningún efecto si tiene una función de shell o llamada incorporada ls.
shadowtalker
@ssdecontrol Derecha. No quise sugerir lo contrario ... estábamos hablando de alias con respecto a ls. Pero es buena información.
B Layer
4

El color indica que el archivo está marcado como "ejecutable" *

Los bits de permiso ejecutables (uno para el usuario, uno para el grupo, uno para el otro) significa que si el nombre del archivo se pasa a una de las llamadas al sistema exec, el núcleo continuará e intentará ejecutarlo.

La convención es que solo los archivos que están destinados a ser ejecutados tienen el bit ejecutable establecido. Sin embargo, al mover / copiar archivos, especialmente en un entorno multiplataforma, es fácil ganar o perder inadvertidamente los bits ejecutables.

Es probable que los archivos almacenados en un sistema de archivos que no admite permisos de Unix (fat, ntfs, etc.) aparezcan en el sistema como ejecutables. Mover o copiar estos archivos a un sistema de archivos Unix utilizando una herramienta que conserva los permisos conservará esos bits ejecutables.

Por otro lado, el uso de herramientas para mover archivos que no pueden preservar los permisos o que se usan con la opción de preservar los permisos deseleccionados probablemente provoque que la copia no se marque como ejecutable aunque el original sí lo fuera.

Entonces, después de moverse por una variedad de plataformas utilizando una variedad de herramientas, los bits de permiso ejecutables pueden terminar en un estado bastante arbitrario.

* No estoy 100% seguro de cómo maneja ls el caso en el que se configuran algunos pero no todos los bits ejecutables.

lavado
fuente
2

Como dijeron las respuestas anteriores, el color es para indicar si los archivos se consideran ejecutables o no.

El permiso de "ejecución" (= bit) en Linux y la mayoría de los otros Unix tiene un significado para los archivos y otro para los directorios.

Para los directorios, si tiene permiso de ejecución, puede ver su contenido. Si no lo hace, no puede cd al directorio, ni puede enumerar archivos en él, incluso si tiene acceso de lectura y escritura al directorio.

Para los archivos normales (a diferencia de los archivos de dispositivo y otros tipos de archivos especiales de Unix), el bit de ejecución significa que si usa el nombre de archivo en la línea de comando, el O / S (o más precisamente: shell) intentará "ejecutar" o ejecutar el archivo como un comando Por el contrario, si no tiene permiso de ejecución en el archivo, no puede ejecutarlo desde la línea de comandos.

Entonces, si, por ejemplo, elimina el permiso x de todos los usuarios en el archivo / bin / cat (que es un comando de Unix), usted mismo o cualquier otra persona y cualquier programa que intente usar el comando "cat" fallará.

Esos son los comandos del sistema operativo, como "cat" y "grep", que normalmente tienen archivos ejecutables en los directorios / * / bin / - / bin, / usr / bin, / sbin, / usr / sbin, etc.

Y luego puede haber scripts interpretados sin compilar, que se escriben en algún lenguaje de programación, como Python o scripts de shell (básicamente, comandos que escribe como desde la línea de comandos cuando se envía al servidor).

Ahora, cuando configura bit de ejecución en el archivo de script (por ejemplo, el archivo foobar) e intenta ejecutarlo con su shell: "./foobar", el shell intenta analizar el archivo y encontrar el programa correcto para pasar el script a.

Esto lo hace el shell al intentar leer la primera línea del archivo y encontrar la notación "shebang" de qué programa se supone que debe ejecutarse.

Entonces, si su foobar era un archivo de texto con la primera línea como esta:

#!/usr/bin/python

Entonces shell intentaría ejecutar el comando: /usr/bin/python foobarbásicamente invocando al intérprete de Python y pasándole el nombre de su archivo foobar como un script de Python.

Si shell no encontrara esa primera línea en su archivo, entonces intentaría ejecutar foobar como si contuviera comandos de shell.

Si el archivo con bit ejecutable no contiene comandos de shell válidos, el shell simplemente se quejaría.

Entonces, esto es lo que sucedería si tuviera archivos TTF con bit de ejecución establecido e intentara ejecutarlo desde la línea de comandos:

$./FreeMonoOblique.ttf
-bash: ./FreeMonoOblique.ttf: cannot execute binary file: Exec format error
$

Entonces, para las fuentes, probablemente sea más ordenado, si el bit exec no está configurado, pero realmente no cambia nada.

PD: solo alguna información extraña. Si elimina el bit de ejecución en algún comando o script, aún podría pasarse a cualquier otro programa como argumento. Si ese otro programa sabe cómo ejecutar su comando, su eliminación de bit exec realmente no importó. Por ejemplo, el script de Python foobar aún sería ejecutado por el intérprete de Python, si simplemente lo hiciera desde la línea de comandos:

$python foobar

en lugar de

$./foobar

Lo mismo con el ejemplo de los comandos del sistema, como "cat". Si elimina el bit exec de "cat", aún puede pasarlo a una nueva instancia de shell para su ejecución:

$sh -c 'cat myfile'

funcionará, incluso si ha eliminado bit exec de cat y

$cat myfile

no lo hace

Gnudiff
fuente
2
En mi sistema, al menos, desarmar el bit ejecutable en un archivo ejecutable binario como cato echono te permite ejecutarlo a través de sh -c 'cat myfile', ni system("cat", "myfile")en idiomas como Ruby. La razón por la que Python puede ejecutar .pyarchivos no ejecutables es porque los lee como una cadena de texto, y luego usa un intérprete para hacer que ese texto se comporte como si fuera un código.
Ethan Kaminski
@EthanKaminski Interesante. Recuerdo claramente que funcionó para mí, pero tendré que verificar los detalles.
Gnudiff
1
@Gnudiff Para ejecutables binarios, la execvellamada al sistema insiste en el permiso de ejecución. En los sistemas basados ​​en glibc, puede invocar el enlazador dinámico como un programa para obtener aproximadamente el mismo efecto que una línea shebang ( /lib64/ld-linux-x86-64.so.2 /bin/cat) y esto funciona para mí incluso si el archivo en la línea de comando no es ejecutable, perosh -c cat no lo hará para ti.
zwol
No es el shell lo que determina si y cómo ejecutar un archivo, es el kernel. El shell simplemente pasa el nombre ejecutable y los parámetros al kernel.
plugwash