Stank هي مكتبة ومجموعة من أدوات سطر الأوامر لاستنشاق الملفات لتحديد البرامج النصية shell مثل Bash و SH و ZSH و KSH وما إلى ذلك ، تلك المزرعة غير التقليدية من Garbaggio ؛ مقابل ملفات أخرى أكثر قبولا مثل RB ، PY ، PL.
صدق أو لا تصدق ، من الصعب أن تكتب البرامج النصية الصدفة بشكل جيد ، لذا فهي تعتبر مطورًا إما كتابة البرامج النصية للقذيفة بلغات أكثر أمانًا ، أو تنظيم البرامج النصية الخاصة بك مع armada من المبيدات. المشكلة هي ، في المشاريع الكبيرة ، لا يمكن للمرء أن يكون متأكدًا جدًا من الملفات الصادقة في البرامج النصية للقذائف المتوافقة مع الكلاب ، والتي هي ذويون. CSH ، TCSH ، FISH ، ION ، RC ، ومعظم غير الممتازين الأخرى من Bash تميل إلى أن تكون متوافقة POSIX. إذا كنت عبقري غريب الأطوار بما يكفي لتتبعه حتى الآن ، فلنحصل على crackalackin مع بعض أمثلة الفواكه اللعنة!
يتضمن نظام Stank مكتبة Stank GO بالإضافة إلى العديد من أدوات سطر الأوامر للراحة. يقوم تطبيق stank بفحص الدلائل والملفات الخاصة برامج النصوص المشتقة من POSIX وطباعة مساراتها ، المصممة كمرشح مستقل مناسب لتصوير مجموعات كبيرة من رمز المصدر.
$ cd examples
$ stank .
.profile
.shrc
.zlogin
... يبحث سطر الأوامر stank في مسارات الملفات لبرامج النصوص التي قد تضمن Linting.
يتكامل ستانك مع المبيدات الخارجية ، مما يساعد على إطعامهم مجموعة أكثر تركيزًا من مسارات الملفات للتحليل داخل أدلة المشروع الأكبر.
$ 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... يتم تخطي الملفات التي تم إنشاؤها بواسطة الآلة ، بما في ذلك ملفات Git Hook الافتراضية *.sample ، تلقائيًا.
انظر stank -help للحصول على خيارات إضافية.
https://github.com/mcandre/stank/release
$ go install github.com/mcandre/stank/...@latesthttps://pkg.go.dev/github.com/mcandre/stank
تقارير The funk Linter عن روائح غريبة تنبعث من البرامج النصية ، مثل نهايات الخط غير السليمة ، ووجود علامة ترتيب البايت في بعض البرامج النصية 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 يتمتع كل من stank و funk بالقدرة على اختيار البرامج النصية ذات المستوى المنخفض غير المحدد أيضًا ، مثل البرامج النصية CSH/TCSH المستخدمة في FreeBSD.
لاحظ أن Funk لا يمكن أن يحذر بشكل موثوق من فقدان Shebangs إذا كان التمديد مفقودًا أيضًا ؛ عادةً ما يستخدم مؤلفو البرنامج النصي واحدًا أو آخر لتمييز الملفات كبرامج نصية shell. إن عدم وجود كل من Shebang وملحق ملف ، يعني أن الملف يمكن أن يحتوي على رمز للعديد من اللغات ، مما يجعل من الصعب تحديد الطبيعة posixy للرمز. حتى إذا تم تطبيق مجموعة شاملة من ASTS لاختبار محتويات الملفات من أجل الصلاحية النحوية عبر عشرات اللغات المتاحة ، فهناك احتمال قوي في ملفات أقصر مفادها أن المحتويات هي مجرد بناء جملة البرنامج النصي الصحيح بالمناسبة ، على الرغم من أن القصد من الملف لا يعمل على أنه برنامج Posix Shell. يمكن أن تؤدي البرامج النصية القصير غير المحبوب مثل CSH/TCSH بسهولة إلى تشغيل بناء جملة "posix". على أي حال ، اعلم أن Shebang ضرورية لضمان تفسير البرامج النصية الخاصة بك بشكل صحيح.
لاحظ أن Funk قد تفشل في تقديم تحذيرات الأذونات إذا كانت البرامج النصية موجودة على أنظمة الملفات غير يونيكس مثل NTFs ، حيث غالبًا ما تكون البتات القابلة للتنفيذ مفقودة من بيانات تعريف الملف تمامًا. عند تخزين البرامج النصية Shell ، تأكد من تعيين أذونات الملفات المناسبة ، ونقل الملفات كحزمة في لعبة Tarball أو شبيه بحماية ضد الأذونات المسقطة.
لاحظ أن Funk قد يحذر من عدم تطابق المترجمين للبرامج النصية ذات النقاط الغريبة في اسم الملف. بدلا من .envrc.sample ، اسم الملف sample.envrc . بدلاً من wget-google.com ، قم بتسمية ملف wget-google-com . Applending .sh هو أيضًا خيار ، لذلك update.es.cluster Renames to update.es.cluster.sh .
يتيح علامة -modulino الاختيارية إلى Funk الفصل الصارم في واجبات البرنامج النصي ، في البرامج النصية للتطبيقات المتميزة مقابل البرامج النصية للمكتبة. hello تنفيذ البرامج النصية ~/bin/hello عمومًا عن طريق استدعاء المسار $PATH مثل ./hello ميزة البرامج النصية لميزة مالك أذونات قابلة للتنفيذ ، وربما المجموعة وغيرها اعتمادًا على احتياجات تكوين النظام. في المقابل ، يُقصد باستيراد برامج النصوص المكتبة باستخدام DOT ( . ) أو source في قذائف المستخدم أو البرامج النصية الأخرى ، ويجب أن تتميز بامتداد ملف مثل .lib.sh ، .sh ، .bash ، إلخ. باستخدام اتفاقيات تسمية منفصلة ، نتواصل بسرعة أكبر إلى مستخدمي المصب كيفية التفاعل مع برنامج البرنامج النصي. على وجه الخصوص ، عن طريق إسقاط ملحقات الملفات لتطبيقات SHELL Script ، نشجع المؤلفين على اختيار أسماء نصية أكثر وضوحًا. بدلاً من build.sh generic ، اختر build-docker . بدلاً من kafka.sh ، اختر start-kafka ، kafka-entrypoint ، إلخ.
أخيرًا ، يقوم stink بطباعة سجل من posixyness لكل ملف ، بما في ذلك أي حقول مثيرة للاهتمام التي حددها على طول الطريق. لاحظ أن بعض الحقول قد لا يتم تقديرها صفريًا إذا كانت رائحة Posix أو Rosy Waft of Nonposix هي تحليل هائل وقصيرة الدائرة. تتميز هذه الدائرة القصيرة بشكل كبير بتسريع كيفية البحث في stank مشاريع كبيرة.
لاحظ أن الأذونات يتم نقلها على أنها العشرية ، بسبب القيود على تنسيق json integer (لم نرغب في استخدام حقل سلسلة أوكتال مخصص). استخدم echo 'obase=8;<some integer> | bc لعرض هذه القيم في الثمانين.
لاحظ أن الأنظمة القديمة والحزم والبرامج النصية Shell التي تشير إلى "SH" قد تشير إلى عدد كبير من قذائف ما قبل البوسكس. أنظمة حديثة إعادة تسمية "sh" إلى "lksh" ، "TSH" ، "ETSH" ، إلخ لتجنب الالتباس. بشكل عام ، سوف يفترض جناح Stank أن غالبية البرامج النصية التي يتم مسحها ضوئيًا تستهدف تقنية ما بعد عام 1971 ، لذا استخدم الحدس البشري والسياق الخاص بك لملاحظة أي Termacy Thompson Unix V6 "SH" ، إلخ. لن تتمكن معظم المبيدات الحديثة من تحليل مثل هذه البرامج النصية من أي تعقيد ، ولن يتعرفوا عليها في البرامج النصية القديمة التي هي عليها ، ما لم يتم تقديم البرامج النصية من Shebangs من خلال المترجمين الفوريين الرجعية "LKSH" ، "TSH" ، "ETSH" ، وما إلى ذلك. يمكن للمرء تقريبًا استخدام إحصائيات FS للتعديل/التغيير لمحاولة تحديد هذه القيم المتطرفة القديمة ، ولكن هذا افتراض غير واقعي من الناحية العملية باستثناء عالم الآثار الأكثر مهووسًا ، مما يضمن بجد أن نصوصها القديمة تستمر في تقديم بيانات التعريف في السبعينيات حتى بعد تعديل المحتوى التجريبي. لذا فإن نظام Stank سيقوم ببساطة بتفكير SH -> Posix SH ، KSH -> KSH88 / KSH93 من أجل الحداثة والتوازن.
وبالمثل ، فإن قذيفة بورن القديمة الملقب "sh" AKA "BSH" تعرض صعوبات في تحديد اللغة. من المرجح أن تقدم نصوص Bourne Shell Old نفسها Shebangs "SH" ، والتي لا بأس بها مثل Bourne SH و KSH88/PDKSH/KSH بمثابة قواعد لمعيار POSIX SH. قد تقدم بعض الأنظمة الحديثة قذيفة بورن كـ "SH" أو "BSH" ثنائية. يعرض السابق مشاكل قليلة لتحديد هوية ستانك ، على الرغم من أن "BSH" صعبة ، لأن غالبية استخداماتها اليوم لا ترتبط بقذيفة بورن ولكن مع جافا بينشيل. لذا ، قد يكون Stank افتراضيًا لعلاج البرامج النصية bsh على أنها غير بنية ، ويُنصح أي برامج نصية من هذه القذيفة بتعرض إما bash أو sh shebangs ، وربما تمديدات .sh أو .bash ، من أجل التعرف على أنفسهم على أنها نصوص حديثة ومتوافقة مع 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 توضح examples/ الدليل المضمّن العديد من حالات الحواف ، مثل البرامج النصية الفارغة ، والبرامج النصية التي لا تقل عن Shebang ، والبرامج النصية التي تم توسيعها ، ومختلف تطبيقات Hello World في العديد من لغات البرمجة. قد تحتوي بعض الملفات ، مثل examples/goodbye ، على محتوى نصوص Posix Shell 100 ٪ ، ولكنها تفشل في التعرف على نفسه مع Shebangs أو ملحقات الملفات ذات الصلة. في مشروع كبير ، قد يتم التعامل مع هذه الملفات عن طريق الخطأ كتنسيق whoknowswhat ، أو ببساطة نص عادي. ربما يمكن أن تساعد الطرق الإحصائية في تحديد قواعد Posix ، ولكن حتى الملف الفارغ هو Posix تقنيًا ، وهو غير مفيد من وجهة نظر تصنيف موثوقة. في أي حال ، examples/ نأمل أن تغطي حالات الحافة الأكثر شيوعًا.
طريقة واحدة للتفكير في stank هي صياد مكافأة لنصوص الصدفة.
بالنظر إلى أن Shell تميل إلى أن تكون أكثر هشاشة من لغات البرمجة ذات المستوى الأعلى ، فمن الجيد إعادة كتابة رمز Shell كتطبيقات مخصصة. GO و RUST هي خيارات جيدة بشكل خاص لغتي التطبيق.
إن لغة برمجة الصدأ أفضل في أداء الفصل والموثوقية والأمن. لغة البرمجة GO لها أداء مماثل وموثوقية وأمان في معظم السياقات. كل من Rust and Go Sof Compilation-Compilation و Static Executables ، بحيث يكون من الأسهل بكثير تطوير تطبيقات الصدأ/GO واختبارها وتوزيعها مقارنةً بنصوص الصدفة. تهمل معظم المبرمجين القلاحين النظر في مشاكل قفل البائعين مع بناء جملة shell والأعلام المستخدمة للأوامر الفردية. الصدأ لديه منحنى تعليمي أكثر حدة من بعض المبرمجين على استعداد لتكريس الوقت ل. في كثير من الأحيان ، يمكن أن تكون GO بمثابة حل وسط. يتم حماية اللغات التي يتم تجميعها ، كل من الصدأ و GO محمي من العديد من المزالق التي تصل إلى وقت التشغيل التي تدعو القذائف واللغات الأخرى المفسرة.
بغض النظر عن ذلك ، فإن لغة البرمجة المعينة هي مصدر قلق أقل أهمية ، طالما أنها ليست قذيفة. لا تزال لغات البرمجة الخطرة السمعة مثل JavaScript و Perl ، أكثر أمانًا من Shell. شل (أي نكهة) هو حريق القمامة في انتظار شرارة.
لحسن الحظ ، يمكن أن تساعد قائمة البرامج النصية Shell التي تنبعث منها stank المهندسين على تحديد مرشحي البرنامج لإعادة كتابة لغات البرمجة الأكثر نضجًا.
BSD-2-COPLE
(لا أحد)
لمزيد من التفاصيل حول تطوير ستانك نفسه ، انظر Development.md.
لاحظ أن العديد من مكونات البرمجيات لها عادة سيئة لتشجيع مقتطفات SHELL المضمّنة في ملفات نصوص غير قشرة. على سبيل المثال ، تكوينات وظيفة CI/CD ، و Dockerfile Run Steps ، و Kubernetes Resources ، و Make. تحتوي معظم أدوات Linter (على البرامج النصية القذيفة واللغات الأخرى) على دعم محدود أو غير موجود لتصوير قصاصات البرنامج النصي المضمّنة.
وفقًا لذلك ، قم بنقل قصاصات SHELL SCRIPT إلى ملف البرنامج النصي مخصص. ثم اطلب من مكون البرنامج تنفيذ البرنامج النصي shell. بعد ذلك ، ستتمكن من ترتبات رمز shell بمزيد من الأدوات ، وبالتالي رفع مستوى جودة نظامك.
قد تؤدي بعض الملفات الغامضة إلى حد ما ، مثل رمز مصدر LISP الشائع مع shebangs متعددة الأليفة ، وعدم امتداد الملفات ، إلى أن تؤدي كذباً إلى مكتبة Stank ، وتطبيقات Stink و Stank ، التي تقترب من السطر الأول من Shebang المتسلل. قد يتم تحديد هذه الملفات كمز كود "POSIX" ، وهو في الواقع السلوك المقصود! وذلك لأن polyglot shebang هو اختراق للتغلب على القيود في لغة LISP المشتركة ، والتي عادة لا تقبل تعليقات Posix Shebang ، من أجل الحصول على البرامج النصية الشائعة لتكون قابلة للتخلي عن النقل في باش. بالنسبة لهذا الموقف ، من الأفضل توفير ملحق ملف مناسب لمثل هذه الملفات.
$ 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
} ربما إلحاق ملحق .lisp لمثل هذه الملفات. أو افصل Modulino إلى وحدات سطر أوامر Clear Library مقابل. أو استخراج تفاعل الصدفة في نص مخصص. أو إقناع محفوظات اللغة بمعالجة Shebangs كتعليقات. اكتب عضو الكونغرس الخاص بك. ومع ذلك ، فإنك تحل هذا ، واعلم أن الوضع الحالي خارج القاعدة ، ومن المحتمل أن يكسر بطريقة غامضة ودرامية بشكل مناسب. مع Wyverns والبحار المشتعلة والوابات من جميع السيئة.
تساعد هذه BOIS السيئة على شحن نصوص Shell الخاصة بك. على الرغم من أنها مصممة للعمل على الملفات الفردية ، فاحرص على ذلك من مشاريع أكبر من stank-effore وتوفير النتائج إلى xargs [-0] [-n ... shellcheck .
تقدم ACK-أعلام --shell [-f] التي تعمل بشكل مشابه لـ stank ، مع التحذير الذي يتضمن ACK قذائف غير محمية مثل CSH و TCSH و FISH في هذه النتائج ؛ ولكن اعتبارًا من هذه الكتابة ، تفشل في تضمين قذائف Posix مثل Ash و Dash و Posh و PDKSH و KSH93 و MKSH. يعتمد ACK أيضًا على Perl ، مما يجعله أكثر ثقلًا للخدمات المجهرية للرسائل المجهرية وغيرها من المنصات المقيدة.
يحدد كيريل وثائق JSON.
اللغوي ، الجهد غير العادي لـ Github لتحديد اللغة التي يتم كتابتها في كل ملايين المستودعات. في حين أن مشروع GO المذهل هذا لا يستخدم لغويًا في التحليل الآلي ، إلا أنه من الجدير بالذكر لأغراض الطب الشرعي ، إذا واجهت أي وقت مضى ملفًا غريبًا وغير محدد (أو غير محدد!).
يتبطين ، ويكي من مخططات لغة البرمجة الشائعة وأدوات SAST.
يحذر Periscope من حزم NPM غير المتواضعة.
تحدد SAIL ملفات رمز المصدر C/C ++.
يقدم Slick فحص sh -n بناء جملة ضد بناء جملة POSIX النقي ، في حين أن sh الفعلي على معظم الأنظمة Synlinks to bash.
Unskake ، linter ل makefiles.