11个稳定版本

使用旧的Rust 2015

4.3.1 2024年3月24日
4.3.0 2022年6月26日
4.2.0 2022年3月11日
4.1.3 2021年11月7日
3.2.0 2018年6月5日

#7 in 文本编辑器

Download history 239/week @ 2024-05-01 235/week @ 2024-05-08 238/week @ 2024-05-15 211/week @ 2024-05-22 211/week @ 2024-05-29 179/week @ 2024-06-05 145/week @ 2024-06-12 174/week @ 2024-06-19 164/week @ 2024-06-26 364/week @ 2024-07-03 220/week @ 2024-07-10 219/week @ 2024-07-17 252/week @ 2024-07-24 215/week @ 2024-07-31 256/week @ 2024-08-07 156/week @ 2024-08-14

920每月下载量

MPL-2.0 许可证

195KB
3.5K SLoC

Rust 2.5K SLoC // 0.1% comments BASH 1K SLoC // 0.1% comments

Build and test status

Shellharden

Shellharden是一个语法高亮器和半自动重写脚本的工具,以ShellCheck规范为目标,主要关注引号。

默认操作模式类似于cat,但具有前景颜色的语法高亮和背景颜色的建议性更改

real-world example

上图:Shellharden高亮的xdg-desktop-menu的选定部分。前景颜色是语法高亮,而背景颜色(绿色和红色)显示Shellharden如果使用--transform选项会添加或删除的字符。下图:一个人工示例,显示更多复杂情况和特殊功能。

artificial example

为什么

bash中的变量就像一个手榴弹——去掉它的引号,它就开始计时。因此,bash陷阱的规则零:总是使用引号。

名称

Shellharden可以做Shellcheck做不到的事情:应用建议的更改。

换句话说,强化易受攻击的shell脚本。内置假设是脚本不依赖于易受攻击的行为——用户负责代码审查。

Shellharden以前被称为"Naziquote"。在正确的行话中,那是最棒的名字,但对外人来说,它太误导性了,难以启齿。

我也不能称之为"bash cleaner",因为在挪威语中,这意味着“粪尿涂抹者”。

先例

  • Shellcheck 是一个检测易受攻击bash代码并给出一般建议的奇妙工具。唯一缺少的是可以说“是”的东西,并应用那些建议(当然假设适当的审查)。

  • 我提出了一个这样的SO问题,要求一个可以重写bash脚本并使用正确引号的工具。一个回答者比我更快地回答了。但如果是我,我会在同一个工具中做一个语法高亮器(作为一种查看解析器是否迷失方向的方法,并最大限度地利用解析器,因为bash就像量子力学一样——没有人真正知道它是如何工作的)。

获取

发行版包

Packaging status

官方Rust包:

cargo install shellharden

从源代码构建

cargo build --release

安装

mv target/release/shellharden ~/.local/bin/

运行测试

cargo test

(需要bash)

测试覆盖率

env RUSTFLAGS="-C instrument-coverage" LLVM_PROFILE_FILE='run-%m.profraw' cargo test
grcov . --binary-path ./target/debug/ -s . -t html -o ./coverage/
rm run-*.profraw
open coverage/src/index.html

模糊测试

cargo install cargo-afl
cargo afl build --release
cargo afl fuzz -i moduletests/original -o /tmp/fuzz-shellharden target/release/shellharden ''

使用建议

不要盲目地应用 --transform;代码审查仍然是必要的:一个依赖于未引用行为(隐式单词分割和变量及命令替换的通配符扩展)以按预期工作的脚本,在经过 --transform 处理后将不会做任何这些!

在这种情况下,问问自己脚本是否有必要执行这样的操作。很多时候,这仅仅是一个经典的shell脚本产品,并且最好通过使用数组等方式进行重写。即使在相反的情况下,比如业务逻辑涉及单词分割;仍然可以在不调用通配符的情况下完成。简而言之:总有比禁止的语法(如果不是更明确)更好的方法,但有时,必须有人介入进行重写。参见如何,在随附的 如何在bash中安全地做事

无运行时依赖