当前位置: 首页 > 科技观察

Bash系统管理员指南

时间:2023-03-18 16:48:49 科技观察

使Bash更好地工作的技巧。每个行业都有该行业的大师最常使用的工具。对于许多系统管理员来说,这个工具就是他们的外壳。在大多数Linux和其他类Unix系统上,默认的shell是Bash。Bash是一个相当古老的程序——它起源于1980年代后期——但它建立在许多更古老的shell之上,例如至少10年前它的前身Cshell(csh)。因为shell的概念太古老了,所以有大量神秘的知识等待系统管理员吸收,以使他们的生活更轻松。让我们回顾一些基础知识。谁在某个时候不小心以root身份运行命令并导致了某种问题?举起手来我很确定我们中的很多人都曾经是那个人。好痛。这里有一些非常简单的提示,可以防止您再次遇到此类问题。使用别名首先,为mv和rm等命令设置别名,指向mv-i和rm-i。这将确保至少在运行rm-f/boot时需要您的确认。在RedHatEnterpriseLinux中,如果您使用root帐户,这些别名是默认设置的。如果您还想为普通用户帐户设置这些别名,只需将这两行放入主目录中名为.bashrc的文件中(这些也适用于sudo):aliasmv='mv-i'aliasrm='rm-i'让您的Root提示符脱颖而出为防止意外发生,您可以采取的另一个步骤是确保您清楚地知道您正在使用root帐户。在我的日常工作中,我通常让root提示从我每天使用的提示中脱颖而出。如果将以下内容放入root主目录的.bashrc文件中,您将看到黑色背景上的红色root提示,这是您(或其他任何人)应谨慎操作的明确标志。exportPS1="\[$(tputbold)$(tputsetab0)$(tputsetaf1)\]\u@\h:\w#\[$(tputsgr0)\]"其实你应该试试是的可以避免以root身份登录,而是通过sudo运行大多数系统管理命令,但这是另一回事了。在使用一些技巧来防止使用root帐户时的“意外副作用”之后,让我们看看Bash可以帮助您在日常工作中做的一些好事。控制您的历史您可能知道,在Bash中,您可以按向上箭头来查看和重用所有(好吧,大部分)以前的命令。这是因为命令已保存到主目录中名为.bash_history的文件中。这个历史文件带有一组有用的设置和命令。首先,你可以通过输入history来查看整个最近的命令历史,也可以通过输入history30来限制最近30条命令。但是这个技巧太平淡了(LCTT译注:vanilla本来是vanilla,后来扩展为unexpanded,standard,common,例如vanillaC++compiler表示标准C++编译器)。您可以更好地控制Bash保存什么以及如何保存。例如,如果将以下内容添加到.bashrc中,任何以空格开头的命令都不会保存到历史列表中:HISTCONTROL=ignorespace如果需要以明文形式将密码传递给命令,这将很有用。(是的,这很可怕,但它仍然会发生。)如果您不想频繁执行的命令淹没历史记录,请使用:HISTCONTROL=ignorespace:erasedups这样每次使用命令时,它都会从历史记录中删除所有以前的同一命令的出现将从日志文件中删除,只有最后一次调用被保存到历史列表中。我最喜欢的历史记录设置是HISTTIMEFORMAT设置。这将为历史文件中的所有条目添加一个时间戳。例如,我使用:HISTTIMEFORMAT="%F%T"当我输入history5时,我会得到像这样的完整信息:10092018-06-1122:34:38cat/etc/hosts10102018-06-1122:34:40echo$foo10112018-06-1122:34:42echo$bar10122018-06-1122:34:44sshmyhost10132018-06-1122:34:55vim.bashrc这使它我更容易浏览我的命令历史记录并找到我两天前用来建立到我的家庭实验室的SSH连接的SSH连接(我一次又一次地忘记了......)。Bash最佳实践我列出了编写Bash脚本时的11个最佳(或者至少是好的,我并不是说无所不知)最佳实践。11.Bash脚本可能会变得复杂,但注释也很方便。如果您正在考虑添加评论,请添加评论。如果你在周末之后回来并且不得不花时间弄清楚你上周五想做什么,那么你忘记添加注释了。10.用花括号将所有变量名括起来,例如${myvariable}。养成使用${variable}_suffix的习惯,提高整个脚本的一致性。9.计算表达式时不要使用反引号;请改用$()语法。所以使用:forfilein$(ls);做而不是:forfilein`ls`;前者是可嵌套的,更容易阅读,并且取悦于一般的系统管理员社区。不要使用反引号。8.一致性好。选择一种风格并在整个脚本中坚持使用。显然,我喜欢人们选择$()语法而不是反引号,并将他们的变量用大括号括起来。我更喜欢人们用两个或四个空格而不是制表符缩进,但即使你选择了错误的方式,也要始终如一地出错。7.Bash脚本使用适当的shebang如果文件中有文件,类Unix操作系统的程序加载器会分析文件的内容,将内容作为解释器指令,调用指令,并使用包含该文件作为该解释器参数的文件的路径)。由于我正在编写Bash脚本并且只打算用Bash执行它们,所以我经常使用#!/usr/bin/bash作为我的伙伴。不要使用#!/bin/sh或#!/usr/bin/sh。您的脚本将被执行,但它将以兼容模式运行——这可能会产生许多意想不到的副作用。(当然,除非你想要兼容模式。)6.当比较字符串时,在if语句中引用变量是个好主意,因为如果你的变量为空,Bash会为这样一行抛出错误:if[${myvar}==“富”];然后echo"bar"fi对于这样的一行,它会被评估为false:if["${myvar}"=="foo"];thenecho"bar"fi此外,如果您不确定变量的内容(例如,在解析用户输入时),请引用该变量以防止某些特殊字符被解释并确保该变量被视为单个单词,即使它包含空格。5.我想这是个人喜好问题,但我更喜欢使用双等号(==),即使在Bash中比较字符串时也是如此。这是一个一致性问题,即使对于字符串比较只有等号有效,我的脑海里立刻想到“一个=是一个赋值运算符!”4.使用适当的退出代码。确保如果您的脚本无法执行某些操作,它会向用户显示书面失败消息(最好提供问题的解决方案)并发送非零退出代码:#wehavefailedecho"Processhasfailedtocomplete,you需要手动重新启动whatchamacallit“exit1”这使得从另一个脚本以编程方式调用您的脚本并验证它是否成功完成变得更加容易。3.使用Bash的内置机制为变量提供合理的默认值,或者如果您希望定义的变量未定义则抛出错误:#thissetsthevalueof$myvartoredhat,andprints'redhat'echo${myvar:=redhat}#如果$myvar未定义${myvar:?Thevariablemyvarisundefined,亲爱的读者}2.特别是如果你正在编写一个大型脚本,或者如果您正在与其他人一起开发这个大型脚本,请考虑在函数内部定义变量时使用local关键字。local关键字将创建一个仅在该函数内可见的局部变量。这限制了变量冲突的可能性。1.每个系统管理员有时必须这样做:在控制台上调试一些东西,它可能是数据中心的真实服务器,也可能是虚拟化平台上的虚拟服务器。如果您必须以这种方式调试脚本,您会感谢自己记住了这一点:不要让脚本中的行太长!在许多系统上,控制台的默认宽度仍然是80个字符。如果您需要在控制台上调试脚本并且该脚本有很长的行,那么您将成为一只悲伤的熊猫。此外,行数较短的脚本(默认仍为80个字符)在普通编辑器中也更易于阅读和理解!