Stank es una biblioteca y colección de utilidades de línea de comandos para olfatear archivos para identificar scripts de shell como Bash, SH, ZSH, KSH, etc., esos gotas de Garbaggio de Funky Farmfresh; versus otros archivos más sabrosos como RB, PY, PL.
Lo creas o no, los scripts de shell son notoriamente difíciles de escribir bien, por lo que le corresponde a un desarrollador escribir scripts de shell en idiomas más seguros, o de bien El problema es que, en proyectos grandes, uno nunca puede estar muy seguro de qué archivos son honestos para los guiones de shell que cumplen con Dog Posix, y cuáles son pretendientes. CSH, TCSH, FISH, ION, RC y la mayoría de los otros no derivados de BASH tienden a no ser compatibles con Posix. Si eres lo suficientemente geek como para haber seguido hasta ahora, ¡obtengamos crackalackin con algunos ejemplos afrutados maldita sea!
El sistema PANCH incluye la Biblioteca Stank Go, así como varias utilidades de línea de comandos para conveniencia. La aplicación stank escanea los directorios y archivos para scripts de shell derivados de POSIX e imprime sus rutas, diseñadas como un filtro conveniente conveniente para pelucas grandes colecciones de código fuente.
$ cd examples
$ stank .
.profile
.shrc
.zlogin
... La línea de comandos stank busca rutas de archivo para scripts de shell que pueden justificar la pelusa.
Stank se integra con revestimientos externos, lo que ayuda a alimentarles un conjunto más enfocado de rutas de archivos para analizar dentro de directorios de proyectos más grandes.
$ stank -print0 . | xargs -0 -n 1 shellcheck
In welcome.sh line 1:
#!bash
^----^ SC2239 (error): Ensure the shebang uses an absolute path to the interpreter.
For more information:
https://www.shellcheck.net/wiki/SC2239 -- Ensure the shebang uses an absolu... Los archivos generados por la ametralladora, incluidos los archivos de muestra de git de git *.sample , se omiten automáticamente.
Consulte stank -help para opciones adicionales.
https://github.com/mcandre/stank/releases
$ go install github.com/mcandre/stank/...@latesthttps://pkg.go.dev/github.com/mcandre/stank
El funk Live informa olores extraños que emanan de los scripts, como las terminaciones de línea inadecuadas, la presencia de marcadores de orden de bytes en algunos scripts Unicode.
$ funk examples
Ambiguous launch style. Either feature a file extensions, or else feature executable bits: examples/.shrc
Tokenize like `unset IFS` at the top of executable scripts: examples/.shrc
Control program flow like `set -euf` at the top of executable scripts: examples/.shrc
Tokenize like `unset IFS` at the top of executable scripts: examples/badconfigs/zprofile
Control program flow like `set -euf` at the top of executable scripts: examples/badconfigs/zprofile
Missing shebang: examples/blank.bash
Traps may reset in subshells: examples/cleanup.sh
Missing shebang: examples/goodbye.sh
Missing shebang: examples/greetings.bash
Control program flow like `set -euf` at the top of executable scripts: examples/hello-commented
$ funk -modulino examples
Configuration features shebang: examples/badconfigs/.bash_profile
Configuration features executable permissions: examples/badconfigs/zprofile
Missing final end of line sequence: examples/blank.bash
Missing shebang: examples/blank.bash
Interpreter mismatch between shebang and extension: examples/derp.zsh
Missing shebang: examples/greetings.bash
Missing final end of line sequence: examples/hello-crlf.sh
CR/CRLF line ending detected: examples/hello-crlf.sh
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/hello-crlf.sh
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/howdy
Missing shebang: examples/howdy.zsh
Missing shebang: examples/just-eol.bash
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/lo
Missing final end of line sequence: examples/lo-cr.csh
CR/CRLF line ending detected: examples/lo-cr.csh
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/pipefail
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/shout.sh
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/wednesday
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/wednesday-bom
Leading BOM reduces portability: examples/wednesday-bom
Modulino ambiguity. Either have owner executable permissions with no extension, or else remove executable bits and use an extension like .lib.sh: examples/welcome
$ funk -help
-cr
Report presence/absence of final end of line sequence (default true)
-eol
Report presence/absence of final end of line sequence (default true)
-help
Show usage information
-modulino
Enforce strict separation of application scripts vs. library scripts
-version
Show version information Tanto stank como funk tienen la capacidad de seleccionar scripts de bajo nivel y no posezo, como los scripts CSH/TCSH utilizados en FreeBSD.
Tenga en cuenta que Funk no puede advertir de manera confiable por los shebangs perdidos si también falta la extensión; Por lo general, los autores de script usan uno u otro para marcar archivos como scripts de shell. Al carecer de un shebang y una extensión de archivo, significa que un archivo podría contener código para muchos idiomas, lo que dificulta determinar la naturaleza posixy del código. Incluso si se aplica un conjunto exhaustivo de ASTS para probar el contenido del archivo para la validez sintáctica en las docenas de lenguajes de shell disponibles, existe una gran posibilidad en los archivos más cortos de que el contenido es simplemente sintaxis de script, aunque la intención del archivo no es operar como un script de shell Posix. Los scripts cortos y no posibles, como CSH/TCSH, podrían activar fácilmente una coincidencia de sintaxis "Posix". En cualquier caso, sepa que el shebang es un requisito para garantizar que sus guiones se interpreten adecuadamente.
Tenga en cuenta que FUNK puede no presentar advertencias de permisos si los scripts se encuentran en sistemas de archivos no Unix, como NTFS, donde a menudo faltan bits ejecutables en los metadatos del archivo por completo. Al almacenar scripts de shell, asegúrese de establecer los permisos de archivo apropiados y transferir los archivos como un paquete en un tarball o similar a la salvaguardia contra los permisos retirados.
Tenga en cuenta que Funk puede advertir sobre desajustes de intérpretes para scripts con puntos extraños en el nombre de archivo. En lugar de .envrc.sample , nombra el archivo sample.envrc . En lugar de wget-google.com , nombra el archivo wget-google-com . Appending .sh también es una opción, así que update.es.cluster renames a update.es.cluster.sh .
El indicador opcional -modulino a funk permite una separación estricta de las tareas de script, en scripts de aplicación distintos frente a scripts de biblioteca. Los scripts de aplicación generalmente se ejecutan invocando la ruta, como ./hello o ~/bin/hello o simplemente hello cuando $PATH se modifica adecuadamente. Los scripts de aplicación cuentan con permisos ejecutables del propietario, y tal vez grupos y otros también dependiendo de las necesidades de configuración del sistema. Por el contrario, los scripts de la biblioteca están destinados a importarse con Dot ( . ) O source en shells de usuario u otros scripts, y deben presentar una extensión de archivo como .lib.sh , .sh , .bash , etc. mediante el uso de convenciones de nomenclatura separadas, nos comunicamos más rápidamente con los usuarios aguas abajo cómo interactuar con un script de shell. En particular, al soltar extensiones de archivos para aplicaciones de script de shell, alentamos a los autores a elegir nombres de script más significativos. En lugar del genérico build.sh , elija build-docker . En lugar de kafka.sh , elija start-kafka , kafka-entrypoint , etc.
Finalmente, stink imprime un registro de la posición de cada archivo, incluidos los campos interesantes que identificó en el camino. Tenga en cuenta que algunos campos pueden ser valorados por cero si el hedor de Posix o el ruido de la no posez de posez es un análisis abrumador de cortocircuito. Esta característica de cortocircuito acelera dramáticamente la forma en que stank busca grandes proyectos.
Tenga en cuenta que los permisos se transmiten como decimales, debido a las limitaciones en el formato Integer JSON (no queríamos usar un campo de cadena octal personalizado). Use echo 'obase=8;<some integer> | bc para mostrar estos valores en Octal.
Tenga en cuenta que los sistemas heredados, los paquetes y los scripts de shell que hacen referencia a "SH" pueden referirse a una gran cantidad de capas pre-Posix. Los sistemas modernos cambian de nombre "sh" a "lksh", "tsh", "etsh", etc. para evitar confusiones. En general, la suite Stank asumirá que la mayoría de los scripts escaneados están dirigidos a la tecnología posterior a 1971, así que use su intuición y contexto humanos para notar cualquier legado Thompson Unix V6 "SH", etc. Scripts. La mayoría de los linters modernos no podrán analizar tales guiones de ninguna complejidad, ni los reconocerán por los guiones heredados que son, a menos que los shebangs de los guiones se rinden con los modernos intérpretes retro "LKSH", "TSH", "ETSH", etc. para el despliegue en sistemas UNIX modernos. Casi se podría usar las estadísticas FS para modificar/cambio para tratar de identificar estos valores atípicos heredados, pero esta es una suposición prácticamente poco realista, excepto el arqueólogo más obsesivo, asegurando diligentemente sus guiones heredados continúan presentando los metadatos de 1970 incluso después de modificaciones de contenido experimental. Por lo tanto, el sistema PIST simplemente despejará y asumirá SH -> Posix SH, KSH -> KSH88 / KSH93 en aras de la modernidad y el equilibrio.
Del mismo modo, el viejo Bourne Shell, también conocido como "SH", también conocido como "BSH", presenta dificultades de identificación del idioma. Los viejos guiones de Bourne Shell tienen más probabilidades de presentar shebangs "SH", lo cual está bien, ya que Bourne SH y KSH88/PDKSH/KSH sirvieron como las bases para el estándar Posix SH. Algunos sistemas modernos pueden presentar un shell Bourne como un binario "SH" o "BSH". El primero presenta pocos problemas para la identificación de STANK, aunque "BSH" es complicado, ya que la mayoría de sus usos hoy en día no están asociados con el Bourne Shell sino con el Java Beanshell. Por lo tanto, Stank puede tratar los scripts bsh como no posixy, y se recomienda a tales guiones de shell de Bourne que presenten shebangs bash o sh , y tal vez extensiones .sh o .bash , para autoidentificarse como scripts modernos y compatibles con Posix.
$ stink examples/hello
{"Path":"examples/hello","Filename":"hello","Basename":"hello","Extension":"","Shebang":"#!/bin/sh","Interpreter":"sh","LineEnding":"n","FinalEOL":false,"ContainsCR":false
,"Permissions":509,"Directory":false,"OwnerExecutable":true,"BOM":false,"POSIXy":true,"AltShellScript":false}
$ stink -pp examples/hello
{
"Path": "examples/hello",
"Filename": "hello",
"Basename": "hello",
"Extension": "",
"Shebang": "#!/bin/sh",
"Interpreter": "sh",
"LineEnding": "n",
"FinalEOL": false,
"ContainsCR": false,
"Permissions": 509,
"Directory": false,
"OwnerExecutable": true,
"BOM": false,
"POSIXy": true,
"AltShellScript": false
}
$ stink -pp examples/hello.py
{
"Path": "examples/hello.py",
"Filename": "hello.py",
"Basename": "hello.py",
"Extension": ".py",
"Shebang": "#!/usr/bin/env python",
"Interpreter": "python",
"LineEnding": "n",
"FinalEOL": false,
"ContainsCR": false,
"Permissions": 420,
"Directory": false,
"OwnerExecutable": false,
"BOM": false,
"POSIXy": false,
"AltShellScript": false
}
$ stink -help
-cr
Report presence/absence of any CR/CRLF's
-eol
Report presence/absence of final end of line sequence
-help
Show usage information
-pp
Prettyprint smell records
-version
Show version information Los examples/ directorio incluidos demuestran muchos casos de borde, como scripts vacíos, scripts sin shebang, scripts extensados y sin extensiones, y varias aplicaciones de Hello World en muchos lenguajes de programación. Algunos archivos, como examples/goodbye pueden contener contenido de script de shell Posix 100% válido, pero no se autoidentifican con shebangs o extensiones de archivos relevantes. En un proyecto grande, dichos archivos pueden tratarse erróneamente como formato Whoknowswhat, o simplemente texto sin formato. Quizás los métodos estadísticos podrían ayudar a identificar las gramáticas POSIX, pero incluso un archivo vacío es técnicamente POSIX, que es inútil desde un punto de vista de clasificación confiable. En cualquier caso, examples/ con suerte cubren los casos de borde más comunes.
Una forma de pensar en stank es un cazador de recompensas para guiones de conchas.
Dado que Shell tiende a ser más frágil que los lenguajes de programación de nivel superior, entonces es una buena idea reescribir el código de shell como aplicaciones dedicadas. Ir y Rust son opciones especialmente buenas para los idiomas de aplicación.
El lenguaje de programación de óxido tiene el mejor rendimiento, confiabilidad y seguridad de clase. El lenguaje de programación GO tiene un rendimiento, confiabilidad y seguridad comparables en la mayoría de los contextos. Tanto el óxido como el GO admiten la compilación cruzada y los ejecutables estáticos, por lo que es mucho más fácil desarrollar, probar, empaquetar y distribuir aplicaciones de óxido/GO en comparación con los scripts de shell. La mayoría de los codificadores de shell descuidan considerar problemas sutiles de bloqueo de proveedores con la sintaxis de la carcasa y los indicadores utilizados para comandos individuales. Rust tiene una curva de aprendizaje más pronunciada que algunos codificadores están dispuestos a dedicar tiempo. A menudo, Go puede servir como un compromiso. Al ser idiomas compilados, tanto Rust y Go están protegidos de muchas dificultades de tiempo de ejecución que invitan los proyectiles y otros idiomas interpretados.
De todos modos, el lenguaje de programación particular es una preocupación menos importante, siempre que no sea Shell. Los lenguajes de programación notoriamente peligrosos como JavaScript y Perl, siguen siendo más seguros que Shell. Shell (cualquier sabor) es un fuego de basura que espera una chispa.
Afortunadamente, la lista de scripts de shell que stank emitidos, puede ayudar a los ingenieros a identificar a los candidatos de programas a reescribir en lenguajes de programación más maduros.
Cláusula BSD-2
(Ninguno)
Para obtener más detalles sobre el desarrollo de Atk en sí, ver Desarrollo.md.
Tenga en cuenta que muchos componentes de software tienen el mal hábito de alentar los fragmentos de script de shell en línea en archivos de script que no son de carcasa. Por ejemplo, las configuraciones de trabajo de CI/CD, DockerFile ejecutan pasos, recursos de Kubernetes y Make. La mayoría de las herramientas de enlace (para scripts de shell y otros idiomas) tienen un soporte muy limitado o inexistente para los fragmentos de script de shell en línea.
En consecuencia, mueva los fragmentos de script de shell a un archivo de script de shell dedicado. Y luego haga que el componente de software ejecute el script shell. Luego podrá vincular el código de shell con más herramientas y, por lo tanto, elevar el nivel de calidad de su sistema.
Algunos archivos bastante oscuros, como el código fuente de Lisp Common con multiline, shebangs políglotos y sin extensión de archivos, pueden activar falsamente la biblioteca de apestas y las aplicaciones apestosas y aturdidas, que cortocircuitando en la primera línea del shebang hacky. ¡Dichos archivos pueden identificarse falsamente como código "Posix", que en realidad es el comportamiento previsto! Esto se debe a que el políglot shebang es un truco para trabajar en torno a las limitaciones en el lenguaje LISP común, que normalmente no acepta los comentarios de Posix Shebang, para que los scripts LISP comunes sean patrocibles en Bash. Para esta situación, es mejor proporcionar una extensión de archivo adecuada a dichos archivos.
$ head examples/i-should-have-an-extension
#!/usr/bin/env sh
#|
exec clisp -q -q $0 $0 ${1+"$@"}
|#
(defun hello-main (args)
(format t "Hello from main!~%"))
;;; With help from Francois-Rene Rideau
;;; http://tinyurl.com/cli-args
$ stink -pp examples/i-should-have-an-extension
{
"Path": "examples/i-should-have-an-extension",
"Filename": "i-should-have-an-extension",
"Basename": "i-should-have-an-extension",
"Extension": "",
"BOM": false,
"Shebang": "#!/usr/bin/env sh",
"Interpreter": "sh",
"LineEnding": "n",
"POSIXy": true
} Quizás agregue una extensión .lisp a dichos archivos. O separar el Modulino en módulos de línea de comandos transparentes versus módulos de línea. O extraer la interacción de shell en un script dedicado. O convencer a los mantenedores del idioma para que traten los shebangs como comentarios. Escribe a tu congresista. Sin embargo, usted resuelve esto, sepa que la situación actual está lejos de la norma y es probable que se rompa de una manera adecuadamente arcana y dramática. Con Wyverns y mares y portentos en llamas de todos los malos casos.
Estos malos bois ayudan a apuntalar sus guiones de shell. Aunque están diseñados para trabajar en archivos individuales, asegúrese de atacar proyectos más grandes y colocar los resultados a xargs [-0] [-n ... shellcheck .
ACK ofrece las banderas --shell [-f] que actúan de manera similar al de stank , con la advertencia de que ACK incluye conchas sin posez como CSH, TCSH y FISH en estos resultados; Pero al momento de escribir esto, no incluye conchas Posix como Ash, Dash, Posh, PDKSH, KSH93 y MKSH. ACK también depende de Perl, por lo que es más pesado para los microservicios de Docker y otras plataformas restringidas.
Kirill identifica los documentos JSON.
El lingüista, el extraordinario esfuerzo de Github para identificar en qué lenguaje se escriben cada uno de sus millones de repositorios. Si bien este proyecto de GO ANTHY no emplea lingüista en el análisis automatizado, vale la pena mencionar con fines forenses, si alguna vez se encuentra con un archivo fuente extraño, no identificado (o mal identificado!).
Linterías, un wiki de revestimientos de lenguaje de programación común y herramientas SAST.
Periscope advierte en los paquetes de NPM sin cable.
Sail identifica archivos de código fuente C/C ++.
Slick ofrece verificación de sintaxis sh -n contra la sintaxis pura de Posix, mientras que sh real en la mayoría de los sistemas se ajustan a Syminks to Bash.
Unmake, un enlace de Makefiles.