IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:Bash

共 41 篇相关文章

IT 累计浏览 46

Linux 备份和恢复 docker volume 脚本分享

这是一组用于自动化备份与恢复 Docker 数据卷的 Bash 脚本。备份脚本(docker-volume-dump.sh)会遍历宿主机上所有 Docker 卷,使用一个轻量级的 Alpine 容器挂载每个卷,通过 `tar` 命令将其内容打包并压缩为 `.tar.gz` 文件,统一存储在指定目录。恢复脚本(docker-volume-restore.sh)则反向操作,它会遍历备份目录,检查同名卷是否存在(若存在则删除并重建),然后再次利用 Alpine 容器将压缩包解压并写入到对应的数据卷中。整个方案利用容器作为隔离的操作环境,无需在宿主机安装额外依赖,实现了对 Docker 持久化数据的便捷备份与灾难恢复,适用于需要定期保存数据库、应用配置等关键卷数据的运维场景。

IT 累计浏览 43

类unix系统上如何快速批量重命名文件

在macOS中文环境下,系统生成的文件名常带空格,这对终端操作很不友好。这篇分享从作者的实际痛点出发,详细讲解了如何将文件名中的空格批量替换为下划线。 文中提供了两种清晰的方案:一个`rename1`函数专门处理当前目录,另一个更强大的`rename22`函数则利用`find`命令递归处理子目录。关键点在于`find`的`-execdir`选项,它确保命令在文件所在目录执行,避免了路径问题。代码示例完整,解释了参数含义,甚至考虑了文件名含特殊字符的情况。 作者在开头特别提到,这类具体场景的解决方案,如今通过向AI大模型精准提问,往往能快速找到线索或思路。这不仅是一篇实用的Shell脚本指南,也侧面提醒我们,善用AI工具能有效拓展解决实际问题的能力边界。

IT 累计浏览 4,752

一句话crontab实现防ssh暴力破解

这篇讲的是如何用一条crontab命令,为公网VPS搭建一道自动化的SSH暴力破解防火墙。 针对公网VPS即便更换非标准端口也难免被扫描和试探的问题,作者提出了一种轻量却高效的解决方案:将一条Bash命令放入crontab定时任务,实现自动监控与封禁。这条命令会通过`journalctl`查询最近24小时内的SSH登录日志,用`awk`统计出失败次数超过5次的来源IP,最后自动将这些“坏人”IP追加到`/etc/hosts.deny`黑名单中。 文章最巧妙的地方在于,用短短三个管道符串联起日志查询、统计分析与访问控制,既利用了系统原生日志工具,又结合了简单的文本处理,最终实现了从发现到封禁的全自动闭环。作者还贴心地指出,命令可根据是否使用systemd系统灵活调整日志来源,增强了实用性。 对于运维人员或个人站长而言,这提供了一个零成本、即刻生效的防护思路,无需依赖额外软件,用系统自带工具就能构筑起第一道安全防线。

IT 累计浏览 2,239

Bash 中的 & 符号和文件描述符

这篇讲的是 Bash 中 `&` 符号和文件描述符的深入应用,远不止于用 `&` 把进程丢到后台那么简单。作者从大家熟悉的 `>` 重定向出发,点明了其背后的实质——文件描述符 `1`(标准输出)。接着,文章系统地梳理了 `0`(标准输入)、`1`(标准输出)和 `2`(标准错误)这三个标准文件描述符,并展示了如何用它们精准控制命令的输出流向。 文章的核心亮点在于剖析了文件描述符操作的“顺序陷阱”。例如,`find ... 1>services.txt 2>&1` 能成功将所有结果(包括错误)写入文件,但仅仅调换顺序变成 `2>&1 1>services.txt`,错误信息就会直接打印到终端。作者通过 Bash 从左到右的处理逻辑解释了其中的原因:文件描述符是“通道”,在打开 `1` 指向文件之后,再将 `2` 导向 `1`,错误才会正确流入文件。 最后,文章回归到 `&` 的另一个关键角色,介绍了 `&>` 这个简洁的语法糖,它等价于 `2>&1`,能一步到位地合并标准输出和标准错误。掌握文件描述符的工作原理,是写出健壮、可控的 Bash 脚本的重要一步。

IT 累计浏览 2,436

在 Linux 中运行特定命令而无需 sudo 密码

这篇讲的是如何在自动化运维场景中,为特定Linux用户开放免密执行sudo命令的权限。作者从一个实际问题出发:在AWS的Ubuntu服务器上,需要一个每分钟运行的脚本来检查并自动重启某个服务,但执行启动命令必须使用sudo权限,而交互式输入密码与自动化目标冲突。 文章的核心方案是通过编辑`/etc/sudoers`文件,使用`visudo`工具安全地为指定用户(如`sk`)添加一条规则,例如`sk ALL=NOPASSWD:/bin/mkdir`。这样,该用户执行这条特定命令时便无需输入密码。作者详细演示了如何为命令添加多个以逗号分隔的权限项(如同时为`mkdir`、`chmod`和`apt`命令授权),并特别强调了必须使用命令的绝对路径(可通过`whereis`命令查找)。 此外,文章还介绍了如何混合配置免密和需密命令(如在配置行中加入`PASSWD:`前缀来指定需要密码的命令),以及如何撤销这些权限。最后,作者给出了重要的安全警告:免密码执行sudo命令是一把双刃剑,配置不当(例如为`rm`命令开放权限)可能导致数据误删等严重后果,使用时务必谨慎。整篇文章提供了一个清晰、可操作的自动化运维技巧,同时也强调了安全边界。

IT 累计浏览 3,312

详解Linux bash中的变量

这篇详细拆解了Linux bash中的五种核心变量类型:本地变量、局部变量、环境变量、位置变量和特殊变量。作者从实际的运维与脚本编写场景出发,不仅区分了每种变量作用域的差异——例如本地变量作用于整个bash进程,而局部变量(通过local定义)仅限于当前代码段——还深入讲解了它们具体的用法与约束。 文章特别强调了环境变量如何通过`export`传递给子进程,以及位置变量($1, $2...)和`shift`命令在参数处理中的配合使用。对于日常脚本编写至关重要的特殊变量,如`$?`(上一条命令的返回值)、`$#`(参数个数)和`$*`与`$@`的区别,也都有清晰的示例说明。这些细节对比,能帮助你准确选择和使用不同变量,避免脚本中出现作用域混淆或参数传递错误的问题。

IT 累计浏览 1,894

awk调用shell,并将变量传递给shell

这篇讲的是在awk脚本中调用Shell并传递变量的一个具体技巧。作者从一个常见的开发场景切入:当awk处理流程需要借助外部Shell命令完成时,如何让Shell能“感知”到awk上下文中的变量。 文章聚焦于实现这一操作的核心函数`system()`,并指出了一个容易忽略但至关重要的语法细节:调用Shell脚本时,命令字符串的拼接需要特别注意空格的使用,正确的写法是`system("sh my.sh " $var)`。通过提供的简单示例,可以清晰看到变量是如何从awk环境传递到Shell脚本内部,并被正确处理的。 对于经常编写文本处理流水线或复杂运维脚本的开发者来说,掌握这种跨语言调用的变量传递方法,能极大增强脚本的灵活性和自动化能力,是提升工作效率的一个实用知识点。

IT 累计浏览 9,060

Bash脚本15分钟进阶教程

这篇教程源自谷歌内部广受欢迎的“Testing on the Toilet”材料,系统梳理了编写健壮、可维护的Bash脚本的进阶技巧。它从脚本安全的开篇三行代码讲起,解释了如何通过`set -o nounset`和`set -o errexit`来避免引用未定义变量和忽略执行失败这两个常见坑点,并指出了其例外情况。 文章的核心在于提升代码质量。它强调了函数在增强可读性和结构化方面的作用,并推荐将大部分代码封装其中。在变量处理上,提倡善用`local`和`readonly`注解来明确作用域和防止意外修改。此外,教程对比了几种Bash语法:推荐用更清晰、不易混淆的`$()`替代反引号,以及用功能更强大的双中括号`[[]]`替代单中括号`[]`进行条件测试,并列举了后者在字符串比较和逻辑运算上的优势。 整篇文章没有空泛的理论,而是通过具体代码示例,直接提供了能立刻用在生产脚本中的最佳实践,帮助读者从“能跑就行”迈向编写更专业、更可靠的自动化脚本。

IT 累计浏览 3,454

bash代码注入的安全漏洞

这篇文章深入剖析了2014年被称为“Shellshock”的Bash代码注入漏洞。作者从继“心脏流血”后又一“毁灭级”安全事件切入,详细拆解了漏洞的检测方法与技术原理。核心在于Bash处理环境变量时,会错误地执行函数体定义之外的恶意代码——这个缺陷从Bash 1.14一直延续到4.3版本。 文章不仅解释了CVE-2014-6271和随后被发现修复不彻底的CVE-2014-7169,更关键的是,作者澄清了“该漏洞影响有限”的误解。他指出,只要服务器端应用(如PHP调用系统shell命令)会衍生出Bash子进程,就可能在传递环境变量时被注入恶意指令,这意味着许多现代系统都存在风险。 这不仅仅是对一个历史漏洞的技术复盘,更是对安全观念的提醒:看似底层的工具链漏洞,其冲击力可能远超想象,影响面覆盖了从Web服务到系统管理的广泛场景。

IT 累计浏览 1,716

在一个列表里选定主机名后直接 SSH 登陆

运维或开发人员常会遇到这样的场景:即使有配置管理工具,仍免不了需要手动SSH登录单台服务器排查问题。反复查IP、复制、切换窗口的操作既繁琐又容易出错。 这篇文章介绍了一个简洁实用的解决方案:一个名为warp的Bash脚本。它的核心思路很直接——将常用服务器的主机名或IP地址整理在一个文本文件中,通过运行脚本即可调用Vi/Vim进行选择式登录。用户只需在列表中上下移动光标,按下回车便能自动完成连接,省去了手动输入的麻烦。 warp的设计亮点在于其灵活性。配置文件格式自由,支持使用注释(如“#”或“--”)对服务器进行分组和说明,既清晰又便于维护。工具本身仅是一小段脚本,无需复杂安装。更巧妙的是,如果同时选中多行,它还能配合csshx工具实现批量操作,进一步提升效率。 这种将机械性操作自动化的思路,虽然工具简单,却能有效优化日常工作流,减少重复劳动。对于经常需要管理多台服务器的团队来说,是个不错的效率小工具。

IT 累计浏览 24,410

Bash的模式和配置文件加载

这篇讲的是Bash启动时如何加载配置文件的“冷知识”,作者坦言自己早年也一知半解,于是从`man`手册出发,把这个绕人的机制捋清楚了。核心在于理解运行中的Bash有两种“模式”:交互式(是否直接与终端对话)和登录式(是否作为用户登录会话的起点)。两者独立组合,决定了启动时加载哪些文件。 文章清晰列出了加载路径:登录Shell会依次尝试`/etc/profile`、`~/.bash_profile`等;而交互式非登录Shell则主要加载`~/.bashrc`。这些规则直接解释了日常中的两个典型困惑:为什么在`crontab`里配置的环境变量常常不生效?因为非交互、非登录的Shell压根不会加载这些配置文件。同样,为什么在Mac终端里修改`~/.bashrc`没反应?因为它的终端默认启动的是登录Shell(`$0`以`-`开头),本应配置`~/.bash_profile`,而不像某些Linux发行版那样在`~/.profile`里隐式地加载了`~/.bashrc`。 搞清楚这个加载逻辑,就能精准定位Shell脚本的环境问题,无论是定时任务还是跨平台开发。作者用亲身踩坑的例子把这份“手册知识”讲得生动实用,帮读者建立起正确的心智模型。

IT 累计浏览 6,001

Bash如何取得当前正在执行的脚本的绝对路径?

这篇讲的是Shell脚本中一个看似简单却容易掉坑里的问题:如何可靠地获取当前执行脚本的绝对路径。 作者从实际开发中经常需要使用脚本自身路径的场景出发,重点澄清了两种广为流传但并不正确的“常见误区”。一个是直接使用 `pwd` 命令,它只能获取当前的工作目录,与脚本所在位置无关;另一个是过度依赖特殊变量 `$0`,它的值会随 bash 的调用方式而变化,不一定就是脚本的绝对路径。 文章的核心价值在于对比和辨析。它详细解释了为什么这些方法会失效,并给出了一个经过验证的正确解决方案:`basepath=$(cd \`dirname $0\`; pwd)`。这个方案通过组合 `dirname` 和 `cd` 再加上 `pwd`,巧妙地规避了 `$0` 可能不完整的问题,确保无论从哪个目录调用脚本,都能稳定地返回脚本自身所在的绝对路径。对于编写需要灵活部署、不依赖用户预配置的工具脚本来说,这个技巧非常实用。

IT 累计浏览 9,607

linux中设置alias永久生效

这篇讲的是如何让Linux终端的alias别名设置永久生效。很多人在使用alias时都遇到过同样的困扰:明明在当前终端设置了快捷命令,一关窗口就失效了,下次还得重新输入。作者从这个常见痛点出发,给出了一个简单直接的解决方案。 关键在于将别名定义写入用户目录下的`.bashrc`文件。文章以Ubuntu系统为例,展示了如何用`ls -a`找到这个隐藏文件,并用编辑器打开它。在文件的后半部分,我们能看到系统预设的一些别名(如`ll`、`la`),在这里添加自定义的别名,比如`alias log='cd /apache-tomcat/logs'`。保存文件后,只需执行`source ~/.bashrc`命令,新设置的别名就会立即生效,且之后每次打开终端都无需重复配置。 这个方法避免了每次手动设置的麻烦,把常用的目录跳转或复杂命令固化成简短的别名,能显著提升命令行工作效率。文章步骤清晰,对于经常使用终端的开发者来说,是一个能立即上手的实用技巧。

IT 累计浏览 12,826

高效Linux用户需要了解的命令行技能

这篇从Quora问答出发的实用指南,系统梳理了高效使用Linux命令行的关键技能。作者并非简单罗列命令,而是从日常工作的实际场景切入,将技巧分为基本操作、效率提升和数据处理等模块。 文章亮点在于细节的呈现:例如,介绍了如何用一行脚本实现SSH无密码登录,利用`!!`和`!$`快速复用历史命令,以及用`set -x`进行Bash脚本调试。在数据处理部分,展示了如何巧妙组合`sort`和`uniq`命令来完成集合的交并补运算,甚至提到了通过设置`LC_ALL=C`能显著提升排序性能。 更深入的,文章涵盖了系统调试的利器,如使用`strace`追踪程序行为、`dmesg`排查硬件问题。这些工具的介绍都紧扣“解决什么问题”,而非单纯的语法说明。 对于希望提升终端操作效率、摆脱图形界面依赖的开发者而言,这是一份非常扎实的技能清单。

IT 累计浏览 8,314

你可能不知道的Shell

这篇讲的是Shell里那些常被忽略但极其实用的“冷知识”和高效命令。作者从Shell的历史冷知识切入——它比所有流行的Linux内核都要年长,是先有Shell再有Kernel;并且在全球编程语言排名中,shell家族稳居前列,在GitHub上的项目数占比高达8%,与Java相当,印证了它在实战工程中的“宝刀不老”。 文章的核心部分分享了一系列能显著提升效率的命令行技巧。比如用“!$”快速引用上一条命令的最后一个参数,用“sudo !!”一键重跑上条命令并提权,或是用“cd -”在前后两个目录间快速切换。此外,还有像“^old^new”替换历史命令字符串、查看ASCII码表、远程执行脚本等数十个具体用法,每一个都配有清晰的使用场景。 这些技巧并非教科书上的基础内容,而是能立即应用于日常开发、运维工作的“甜点”。无论是想提升命令行效率的新手,还是希望查漏补缺的老手,都能从中找到立刻上手尝试的实用技巧。

IT 累计浏览 4,274

bash shell - sed, awk文本捕获及替换

这篇文章探讨了在 bash shell 中处理复杂文本捕获与替换任务时,sed 与 awk 的实际能力差异。作者从一个具体需求出发:如何在一段包含多个 `background-image: url(...)` 的 CSS 字符串中,为每个图片路径(如 `a.jpg` 和 `b.jpg`)统一追加一段签名串。 虽然 bash 本身支持正则表达式,但作者指出,标准工具 `sed` 在应对这种“单次操作中匹配并处理多个目标”的场景时显得力不从心。他通过代码示例表明,用 sed 编写一句命令来同时捕获多个图并替换,实现起来相当困难。这引出了对更强大工具的需求。 文章的核心对比点在于 `awk` 的灵活性。作者展示了如何利用 awk 的字段分割和模式匹配能力,更优雅地遍历和处理这类包含重复模式的数据。与 sed 的行处理流不同,awk 能够将整个字符串视为可灵活操作的输入,从而轻松实现“捕获一个,处理一个”的逻辑,完美满足需求。 最终,作者提供了一个基于 awk 的完整脚本作为解决方案。这篇文章的价值在于,它并非泛泛地介绍工具,而是通过一个真实的字符串处理困境,具体地对比了 sed 和 awk 的适用边界,为遇到类似文本“捕获-替换”问题的开发者提供了清晰的技术选型参考。

IT 累计浏览 1,485

人肉解析riak_admin join

这篇讲的是 Riak 数据库中一个常用命令 `riak_admin join` 的底层实现解析。作者没有停留在命令行使用层面,而是采用“人肉”的方式,直接追踪源码,一步步揭开这个命令背后发生了什么。 他发现 `riak_admin` 本质上只是一个 bash 脚本,当执行 `join` 操作时,脚本会调用 Riak 核心的 Erlang 代码,最终路由到 `riak_kv_console` 模块的 `join` 函数来完成集群节点加入的实际工作。文章清晰地展示了从用户敲下命令到系统执行核心逻辑的完整调用链。 这种深挖源码的分析,不仅让读者知其然,更知其所以然。它绕过了官方文档的简略说明,直接展示了 Riak 内部如何优雅地将命令行接口与核心业务逻辑解耦,对于想深入理解分布式数据库管理命令实现原理的工程师来说,提供了非常扎实的技术细节。

IT 累计浏览 2,245

什么是导出(export)环境变量

这篇讲的是 Linux 和 macOS 系统中 `export` 命令的底层作用与实际效果。作者从“为什么我定义的变量在子进程里不见了”这个常见困惑出发,拆解了 Shell 环境变量的继承机制。 核心对比在于:一个普通的 Shell 变量只在当前会话内存中生效,而一旦用 `export` 导出,它就被标记为“环境变量”,并会通过 `fork()` 系统调用复制给子进程的环境块。文章用具体例子演示了不加 `export` 时,脚本或子 Shell 读不到父 Shell 变量的典型场景,也解释了 `env`、`printenv` 与 `export -p` 三者查看环境变量的区别。 作者还提到,`export` 不仅用于添加变量,也能用来修改已存在于环境中的值,这对于临时覆盖路径(如 `PATH`)或配置项非常实用。文章强调,理解“变量作用域”与“环境继承”是写可靠 Shell 脚本的基础,能避免许多诡异的“它明明在那里却找不到”的问题。

IT 累计浏览 4,224

小心grep 的buffer

这篇文章分享了一个作者在Linux管道命令中遇到的典型坑:在实时监控MySQL查询次数时,一个由`mysql`、`grep`和`awk`组成的管道命令输出延迟严重。作者起初怀疑是`awk`的缓冲问题,但调整无效。 通过`strace`追踪,他发现根源竟在`grep`。`grep`读取了数据,但默认是“行缓冲”还是“全缓冲”呢?文章的妙处就在这里。当管道下游是慢速设备或程序时,`grep`为了提高效率,会积累多行数据后才一次性输出。这导致`awk`长时间收不到输入,屏幕上自然一片空白。 解决方法出奇地简单:在`grep`命令后加上`--line-buffered`选项,强制它每匹配一行就立刻输出。问题随之迎刃而解。这个案例生动地说明了,管道中每个工具的缓冲行为都可能成为性能陷阱,而`grep`的`--line-buffered`正是为解决这类实时处理需求而生的关键选项。

IT 累计浏览 3,158

FreeBSD更改csh为bash产生错误的解决办法

这是一篇故障排查类文章,记录了作者在FreeBSD 8.0上试图将默认Shell从csh改为bash时遇到的问题及解决过程。 问题起因是典型的“顺序错误”。作者因为不习惯csh,急于切换到熟悉的bash,却忘记先通过 `make install clean` 完成bash的安装,便直接执行了 `chsh` 命令更改默认Shell。这一疏忽导致系统重启后无法找到 `/usr/local/bin/bash`,从而无法正常登录。 文章详细记录了从发现问题到最终修复的完整步骤。解决方法是通过启动菜单进入单用户模式,在依次执行 `fsck` 和 `mount -a` 准备好文件系统后,使用 `chpass -s /bin/csh` 命令将默认Shell改回系统自带的csh,从而恢复登录能力。之后,作者再正常安装bash,并提供了编辑 `/etc/profile` 自定义 `PS1` 提示符的配置代码,使bash的命令行提示符显示更符合个人习惯。 整个过程清晰地展示了一个因操作步骤颠倒而引发的系统配置错误,并给出了从紧急恢复到最终实现的详实方案,对接触FreeBSD的新手颇具参考价值。