Con Bash's source
es posible ejecutar un script sin un conjunto de bits de ejecución. Este es un comportamiento documentado y esperado, pero ¿no está en contra del uso de un bit de ejecución?
Lo sé, eso source
no crea una subshell.
bash
permissions
executable
source
conventions
Motte001
fuente
fuente
chmod
pueda permitirle establecer permisos (incluido `x) con un número octal le da una idea de la época de la que proviene. No me sorprendería que comenzara como un indicador rápido y sucio de "este es un archivo binario que puede ejecutar", desde los días previos a la invención de she-bang, pero no tengo evidencia de esocp /sbin/suidexecutable /tmp/mycopy; /tmp/mycopy
Respuestas:
Bash es un intérprete; acepta entrada y hace lo que quiera. No necesita prestar atención al bit ejecutable. De hecho, Bash es portátil y puede ejecutarse en sistemas operativos y sistemas de archivos que no tienen ningún concepto de bit ejecutable.
Lo que importa del bit ejecutable es el núcleo del sistema operativo. Cuando el kernel de Linux realiza
exec
, por ejemplo, comprueba que el sistema de archivos no está montado con unanoexec
opción, comprueba el bit ejecutable del archivo de programa y hace cumplir los requisitos impuestos por los módulos de seguridad (como SELinux o AppArmor).Tenga en cuenta que el bit ejecutable es un tipo de control bastante discrecional. En un sistema Linux x86-64, por ejemplo, puede omitir la verificación del núcleo del bit ejecutable invocando explícitamente
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
como intérprete :Esto es algo análogo al abastecimiento del código fuente de Bash en Bash, excepto que
ld.so
es el intérprete, y el código que ejecuta es código de máquina en formato ELF.fuente
ld.so
es hacer enlaces dinámicos.source
o el equivalente pero estándar de puntos.
no ejecutar la secuencia de comandos, pero lee los comandos del archivo de comandos, a continuación, ejecutarlos, línea por línea, en el entorno de shell actual.No hay nada en contra del uso del bit de ejecución, porque el shell sólo tiene que leer permiso para leer el contenido del archivo.
El bit de ejecución solo es necesario cuando ejecuta el script. Aquí el shell
fork()
procesará de nuevo y luego usará laexecve()
función para crear una nueva imagen de proceso a partir del script, que debe ser un archivo ejecutable normal.fuente
bash < script
, obtendrá esencialmente el mismo resultado quesource script
. ¿Qué protección proporciona una comprobación de bit de ejecución?execv
familia OS * de syscalls se puede usar con un ejecutable, no si un intérprete lo ejecutará. ¿Por qué confundir a las personas (y romper la capacidad de evaluar el código transmitido desde fuentes que no son archivos) al romper las convenciones?bin/activate
que no tiene un bit ejecutable. Los scripts pueden ser totalmente bibliotecas u otras cosas por el estilo. Supongo que tener .sh también podría ser una señal, pero tener un mínimo de pistolas es bueno: es bueno que no sea posible correr./bin/activate
por accidente en lugar de. bin/activate
El bit ejecutable (a diferencia del resto) en archivos no setuid y no setguid no es un gran mecanismo de seguridad. Cualquier cosa que pueda leer, puede ejecutarse indirectamente, y Linux le permitirá leer indirectamente cualquier cosa que pueda ejecutar pero no leer directamente (eso debería ser suficiente para perforar un agujero en el concepto de no-set (g) uid x-bit siendo un medida de seguridad).
Es más conveniente: deje que el sistema lo ejecute directamente si el bit está configurado, de lo contrario, debo hacerlo indirectamente (
bash the_script;
o algo de piratería para obtener la imagen de memoria de un ejecutable sin permiso de lectura ).Puede configurarlo para mayor comodidad si tiene la intención de utilizar tanto en la fuente como ejecutar su insurcable.
Aparentemente, sin embargo, muchos implementadores de bibliotecas compartidas comparten su pensamiento y, en consecuencia, muchos sistemas requieren que las bibliotecas compartidas, que son esencialmente el equivalente nativo de los insurcables de shell, se marquen como ejecutables para ser utilizables. Consulte ¿Por qué las bibliotecas compartidas son ejecutables? .
fuente
chmod
hacerlo y lo hago ejecutable. Es para clasificar datos de programas, por lo que la pregunta del OP es razonable.x
bit es solo un lugar adicional donde puede leer / escribir una pista de qué hacer./tmp$ cp /bin/cat ./cat ; chmod a-rw ./cat ; ./cat & cp /proc/$!/exe /tmp/cat2
->cp: cannot stat ‘/proc/16260/exe’: Permission denied
¡Buena pregunta! Unix usa el bit ejecutable para distinguir entre programas y datos. El sistema operativo no requiere el bit de ejecución, ya que un script de origen no se pasa al sistema operativo para su ejecución como un nuevo proceso. Pero el shell trata un script de origen como un programa y buscará
$PATH
el archivo que desea obtener. Por lo tanto, el propio shell podría haber requerido permiso de ejecución para los archivos de origen; Pero no fue así.La pregunta debe haber surgido hace mucho tiempo. El diseño de la carcasa Bourne fue el resultado de "una larga secuencia de modificación, diálogo, discusión" entre los habitantes de los Laboratorios Bell, y SR Bourne y otros discutieron muchas decisiones de diseño a lo largo de los años. Desafortunadamente, mi mirada rápida no encontró ninguna discusión sobre la función fuente (en mi defensa, es difícil buscarla en Google). Lo que sí encontré es que el "." El comando Bourne no aparece en esta introducción temprana al shell, pero está presente en la versión más madura de la Versión 7 .
En ausencia de autoridad, aquí está mi propia interpretación:
El
.
comando, aliassource
, es en efecto inclusión textual (como#include
en el preprocesador C) en el código fuente del script de ejecución o sesión interactiva. Como tal, el archivo incluido posiblemente no esté "ejecutado".La filosofía de Unix siempre ha sido dar a los programadores suficiente cuerda para ahorcarse. Demasiadas restricciones de mano y arbitrarias solo se interponen en el camino. Recientemente, algunas distribuciones se
rm -r /
negaron a hacer lo que usted le pide. (Este comando le indicarm
que elimine todo de su computadora. ¡ No lo intente como root! O, mejor aún, no lo haga en absoluto). Entonces, quizás Bourne al. solo decidí que cuando intentas obtener un archivo, se supone que sabes lo que estás haciendo. Eso también evita el trabajo innecesario, y los ciclos importaban mucho en ese entonces.fuente
En lo que respecta al sistema operativo, un archivo que contiene script de shell es solo información. Si pasa el nombre de dicho archivo de datos al
source
comando o lo pasa en la línea de comando a una invocación del shell bash, todo lo que ve el sistema operativo es una cadena que coincide con el nombre de un archivo que contiene datos.¿Cómo sería relevante el bit de ejecución en ese caso?
fuente
La distinción es importante porque puede tener un archivo de comandos de shell que no es útil como ejecutable, pero solo es útil cuando se obtiene. Para este archivo, puede desactivar el bit de ejecución y luego nunca se accederá a él, a menos que sea explícitamente en un comando fuente. La razón de tal cosa es tener efectos secundarios en el shell desde el que se ejecuta. Para un ejemplo específico, tengo un script llamado fix_path que mira y modifica la ruta.
fuente
Por si alguien está interesado en más estudios y / o aclaraciones: en un shell casi compatible con POSIX implementado hace un tiempo, el funcionamiento interno de las funciones 'exec_program ()' y 'builtin_source ()' es muy ejemplar. En esas funciones, ve exactamente cuál es la diferencia entre ellas:
https://github.com/rsenn/shish/blob/master/src/builtin/builtin_source.c
https://github.com/rsenn/shish/blob/master/src/exec/exec_program.c
Básicamente, el abastecimiento puede verse como el shell que redirige temporalmente su descriptor de archivo interno desde donde analiza el script de shell (el terminal en modo interactivo). por lo que es muy similar a otras redirecciones como
<input_file.txt
y,>>append_to_something.list
y estas solo necesitan abrir y cerrar archivos.entonces la ejecución es manejada por la
execve()
llamada del sistema para la cual el bit de ejecución es obligatorio.Recuerdo haber visto algunos sistemas que permiten la ejecución de archivos binarios ELF / a.out, pero mediante la ejecución de "/lib/ld-dynamic-linker.so" y con el programa binario (sin bit de ejecución) como primer argumento. Creo que eso estaba en algunas máquinas DEC Alpha o VAX (¿Podría haber sido SCO Unix?)
fuente
Otro punto de vista:
La secuencia de comandos de origen consiste básicamente en funciones integradas de shell y llamadas a programas. Los componentes integrados de shell (
source
entre ellos) son partes del shell y el shell debe ser ejecutable en primer lugar. Cada programa llamado (que es ELF, otro script con shebang, lo que sea) debe tener un bit de ejecución establecido, de lo contrario no se ejecutará.Por lo tanto, no está en contra del uso de un bit de ejecución, porque nada sin el bit de ejecución se ejecutará. La validación no se produce para el script de origen en su conjunto; se realiza para cada parte por separado, pero lo es.
fuente