unix 高级_UNIX高级用户的最佳机密

如果您想知道为什么我戴着深色墨镜,假胡须和棒球帽(带有专业冰壶队的标志,The Floating Stones),那我就行了。 我在躲避黑色的遥控直升机,白色的系统管理员以及许多守护程序的联合力量,以带给您一些UNIX®高级用户最了解的秘密。 穿上你的铝箔帽子,继续读下去。

保存环境变量

大多数UNIX用户会在shell启动文件中聚集设置,例如.bashrc(对于Bash shell)和.zshrc(对于Z shell),一次又一次地创建首选的shell环境。 启动文件可以创建别名,设置外壳程序选项,创建函数以及设置环境变量。 基本的环境变量包括HOME(指向您的主目录),PATH(枚举在其中搜索应用程序的目录)和MANPATH(列出在其中搜索手册页的目录)。 要查看在shell中设置了哪些环境变量,请输入printenv 。 有关可用环境变量的完整列表,请参考您的Shell手册页。

像外壳一样,您可以通过环境变量自定义许多其他UNIX应用程序。 例如,Java™子系统要求您定义JAVA_HOME指向Java运行时的根。 同样,Amazon Web Services(AWS)实用程序套件要求使用AWS_CREDENTIAL_FILE指向具有有效私钥凭证的文件。 各个应用程序也提供环境变量。 诀窍是发现变量。 幸运的是,这项工作不必涉及中断和进入。 取而代之的是,只需查阅该实用程序的手册页,然后查找标题为“环境变量”的单独部分。

例如,pager实用程序less定义许多有用的环境变量:

  • 环境变量LESS存储命令行选项,从而减少了每次调用寻呼机时键入的内容。 例如,如果您阅读了大量的日志文件,请将以下内容放入shell启动文件中:
    export LESS='--RAW-CONTROL-CHARACTERS --squeeze-lines --ignore-case'

    这些选项分别解释控制字符(通常为语法着色),将空白行减少为一行,并忽略字符串匹配中的大小写。 如果使用代码,请尝试以下选项:

    export LESS='--LINE-NUMBERS --quit-if-one-screen --quit-on-intr'
  • 名为LESSKEY的环境设置指向一个键绑定文件。 您可以使用键绑定来自定义less的行为,例如,以匹配另一个页面调度程序或编辑器的行为。
  • 与shell一样, less可以维护两次调用之间的历史记录。 设置LESSHISTFILE和LESSHISTSIZE分别指向一个持久性命令文件并设置要记录的最大命令数。

在GNU编译器集合(GCC)中可以找到环境变量的另一个很好的应用程序。 GCC定义了各种环境变量来定制其操作。 顾名思义,LIBRARY_PATH是目录列表,用于搜索要链接到的库; COMPILER_PATH的工作方式与shell的PATH非常相似,但是GCC在内部使用它来查找在编译过程中使用的子程序。

如果为单个平台编写代码并生成二进制文件,则可能永远不会使用这些环境变量。但是,如果为多个平台交叉编译相同的代码,则此类变量对于访问每个平台的各种标头和库至关重要。 您可以将变量设置为一种机器的一组值,而将值设置为另一种类型的系统的另一组。

实际上,您可以从GCC中获得启发:每个应用程序维护多组环境变量,并根据当前工作从一个池切换到另一个池。 一种方法是保持环境初始化文件中的每个项目目录和source它作为必要的。 例如,许多Ruby开发人员使用这种解决方案在Ruby版本之间进行切换,并根据需要更改环境变量PATH,GEM_HOME和GEM_PATH,以从一个版本跳转到另一个版本。

点缀风景

与环境变量非常相似,许多Linux®和UNIX应用程序都提供了一个点文件(一个名称以点开头的小文件)进行自定义。 但是,与捕获少量标志或相对少量信息的环境变量不同,点文件可以具有自己独特的语法规则甚至自己的编程语言,其扩展范围甚至更大。 点文件是保留选项和设置的方便位置,因为(根据UNIX传统)以点开头的文件名不会出现在标准目录列表中。 (使用ls -a查看这些所谓的隐藏文件 。)除特殊名称外,点文件是纯文本文件。

通常在您的主目录中找到一个点文件,但是某些实用程序也在当前工作目录中查找一个点文件。 如果应用程序支持多个点文件,则该程序通常会应用优先级规则,以使一个文件优先于另一个文件。 通常,“本地”点文件(在当前工作目录中找到一个)具有最高的先例,其次是您的主目录中的文件,然后是系统范围的配置。 这些文件可以不存在,一个或全部,并且应由应用程序将文件视为互斥或增量文件。 在前一种情况下,在先例链中找到的第一个点文件是确定的。 在后一种情况下,配置可能会级联或调和为最终结果。

一个简单的点文件的示例是less的键绑定文件,该文件位于$ HOME / .lesskey中。 文件中的每一行都是一对(一个按键和一个命令),类似于下面的代码片段:

\r        forw-line
\n        forw-line
e         forw-line
j         forw-line
^E        forw-line
^N        forw-line
k         back-line
y         back-line
^Y        back-line

在另一个极端,考虑fetchmail 。 该实用程序从多个远程源中提取电子邮件,并在本地传递消息。 该实用程序的操作仅通过$ HOME / .fetchmailrc进行控制。 (有关许多选项,请参见手册页。) crongitvi和许多其他命令也可以识别点文件。 再次,阅读应用程序的手册页,以了解您在点文件中配置的内容。 一些点文件足够丰富,可以保证使用单独的手册页,例如crontab

SSH的秘密

Secure Shell(SSH)是一个丰富的子系统,用于安全地登录到远程系统,复制文件和穿越防火墙。 由于SSH是一个子系统,因此它提供了很多选项来自定义和简化其操作。 实际上,SSH提供了一个名为$ HOME / .ssh的完整“点目录”,以包含其所有数据。 (您的.ssh目录必须为模式600,以防止他人访问。600以外的其他模式会干扰正常操作。)具体来说,文件$ HOME / .ssh / config可以定义许多快捷方式,包括机器名的别名。 -主机访问控制等。

这是在$ HOME / .ssh / config中找到的典型块,用于为特定主机自定义SSH:

Host worker
HostName worker.example.com
IdentityFile ~/.ssh/id_rsa_worker
User joeuser

〜/ .ssh / config中的每个块都配置一个或多个主机。 用空行分隔各个块。 该块使用四个选项: HostHostNameIdentityFileUserHostHostName指定的计算机建立一个昵称。 昵称允许您键入ssh worker而不是ssh worker.example.com 。 此外, IdentityFileUser选项规定了如何登录worker 。 前一个选项指向与主机一起使用的私钥。 后一个选项提供登录ID。 因此,此块等效于命令:

ssh joeuser@worker.example.com -i ~/.ssh/id_rsa_worker

一个强大而鲜为人知的选项是ControlMaster 。 如果设置,则到同一主机的多个SSH会话共享一个连接。 一旦建立第一个连接,后续连接就不需要凭据了,从而避免了每次连接到同一台计算机时都要输入密码的麻烦。 ControlMaster非常方便,您可能需要为每台计算机启用它。 使用主机通配符*可以轻松完成此操作:

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p

您可能会猜到,标记为Host *的块适用于每个主机,即使那些未在配置文件中明确命名的主机也是如此。 ControlMaster auto尝试重用现有连接,但如果找不到共享连接,则会创建一个新连接。 ControlPath指向一个文件,以持久保存控件套接字以进行共享。 %r替换为远程登录用户名, %h替换为目标主机名, %p代表用于连接的端口。 (您也可以使用%l ;它会替换为本地主机名。)上面的规范创建的控制套接字的文件名类似于:

master-joeuser@worker.example.com:22

断开与远程主机的所有连接后,将删除每个控制套接字。 如果您想随时知道要连接到哪台计算机,只需键入ls ~/.ssh并查看控制套接字( %h )的主机名部分。

SSH配置文件非常庞大,它也有自己的手册页。 键入man ssh_config以查看所有可能的选项。 这是一个聪明的SSH技巧:您可以通过SSH从本地系统隧道到远程系统。 使用的命令行如下所示:

$ ssh example.com -L 5000:localhost:3306

该命令说:“通过example.com连接,并在本地计算机上的端口5000和名为'localhost的计算机上的端口3306 [MySQL服务器端口]之间建立隧道。”因为localhost在example.com上被解释为隧道建立后, localhost是example.com。 建立出站隧道(通常称为本地转发)后 ,本地客户端可以连接到端口5000并与在example.com上运行的MySQL服务器进行通信。

这是隧道的一般形式:

$ ssh proxyhostlocalport:targethost:targetport

在这里, proxyhost是一台您可以通过SSH访问的机器,并且具有到targethost的网络连接(而不是通过SSH)的targethostlocalport是本地系统上的非特权端口(大于1024的任何未使用的端口),而targetport是要连接的服务的端口。

上面的命令从您的机器隧道出来到外面的世界。 您还可以使用SSH进行隧道连接,或从外部连接到本地系统。 这是入站隧道的一般形式:

$ ssh user@proxyhost -R proxyport:targethosttargetport

建立入站隧道( proxyhost称为远程转发)时 , proxyhosttargethost的角色相反:目标是本地计算机,代理是远程计算机。 user是您在代理服务器上的登录名。 此命令提供了一个具体示例:

$ ssh joe@example.com -R 8080:localhost:80

该命令显示为“以joe连接到example.com,并将远程端口8080连接到本地端口80。” 此命令为example.com上的用户提供了通往Joe机器的隧道。 远程用户可以连接到8080,以在Joe的计算机上访问Web服务器。

除了分别用于本地和远程转发的-L-R之外,SSH还提供-D来在远程计算机上创建HTTP代理。 有关正确的语法,请参见SSH手册页。

用历史重写

如果您在shell提示符下花费大量时间,则记录shell历史记录可以节省时间和键入内容。 但是,如果不进行修改,还会有一些历史烦恼:“历史”记录重复的命令,并且多个shell实例会破坏彼此的历史。 两种并发症都很容易克服。 在您的.bashrc中添加两行:

export HISTCONTROL=ignoreboth
shopt -s histappend

第一行从您的Shell历史记录中删除连续的重复命令。 如果要删除所有与序列无关的重复项, ignoreboth erasedups更改为erasedups 。 第二行在退出时将外壳的历史记录附加到您的历史记录文件中。 默认情况下,Bash历史记录文件的名称是(是一个点文件) 〜/〜/ .bash_history。 您可以通过设置(是,环境变量)HISTFILE来更改其位置。 如果要将外壳程序的最新10,000个命令保存在具有100,000个条目的历史记录文件中,请将export HISTSIZE=10000 HISTFILESIZE=100000到您的外壳程序启动文件中。 要查看shell的历史记录,请在任何提示下键入history

如果您无法回忆起,保存命令历史记录几乎没有用。 这就是外壳的目的! 或bang运算符:

  • !! (“ bang bang”)完全重复最后一个命令。
  • !:0是上一个命令的名称。
  • !^是上一个命令的第一个参数。 !:2!:3等,以!$结尾,是上一个命令的第二,第三和最后一个参数。
  • !*是最后一个命令的所有参数,命令名称除外。
  • ! n ! n重复历史上编号为n的命令。
  • ! handle ! handle重复最后一个以handle的字符串开头的命令。 例如, !ca将重复以字符ca开头的最后一个命令,例如cat README
  • !? handle !? handle重复最后一个包含 handle 中的字符串的命令。 例如, !?READ也将匹配cat README
  • ^ original ^ substitution替换第一次出现的originalsubstitution 。 例如,如果先前的命令是cat README ,则命令^README^license.txt将产生一个新的命令cat license.txt
  • !:gs/ original / substitution替换所有出现的originalsubstitution 。 ( !:gs表示“全局替换”。)
  • !-2是倒数第二个命令, !-3是最近的第三条命令,依此类推。

您甚至可以结合历史记录表达式来产生符号汤,例如!-2:0 -R !^ !-3:2 ,它将扩展为倒数第二个命令的命令名称,后跟-R ,即上一个命令的第一个参数命令,以及最近的第三条命令的第二个参数。 为了使此类隐秘命令更具可读性,您可以在键入内容时扩展历史记录引用。 在任何提示符下键入命令bind Space:magic-space ,或将其添加到启动文件中以将Space键绑定到功能magic-space,这将内联扩展历史记录替换。

Expand-o-Matic

互联网上有如此多的可用代码,您每天可能会下载数十个文件。 而且,所有这些文件的打包方式都有可能不同-这里的ZIP文件,那里的RAR文件和压缩包,尽管每个文件都使用不同的实用程序压缩。 记住如何解压缩和扩展每种包格式可能会很麻烦。 那么,为什么不在单个命令中捕获所有这些任务呢? 此功能可在许多示例点文件中广泛使用:

ex () {
  if [ -f $1 ] ; then
    case $1 in
      *.tar.bz2)   tar xjf $1        ;;
      *.tar.gz)    tar xzf $1     ;;
      *.bz2)       bunzip2 $1       ;;
      *.rar)       rar x $1     ;;
      *.gz)        gunzip $1     ;;
      *.tar)       tar xf $1        ;;
      *.tbz2)      tar xjf $1      ;;
      *.tgz)       tar xzf $1       ;;
      *.zip)       unzip $1     ;;
      *.Z)         uncompress $1  ;;
      *.7z)        7z x $1    ;;
      *)           echo "'$1' cannot be extracted via extract()" ;;
    esac
  else
    echo "'$1' is not a valid file"
  fi
}

这个函数ex扩展了11种文件格式,如果您处理其他软件包类型,则可以扩展。 定义好后(例如,在shell启动文件中),您只需键入ex somefile ,其中somefile以命名扩展名之一结尾:

$ ls
source
$ tar czf source.tgz source
$ ls -1
source
source.tgz
$ rm -rf source
$ ex source.tgz
$ ls -1
source
source.tgz

顺便说一句,如果您放错了今天下载的内容,请运行find进行查找:

$ find ~ -type f -mtime 0

命令-type f查找纯文件, -mtime 0查找从当天午夜开始创建的文件。

更多的秘密

还有更多的专家机密被发现。 在Web上搜索“外壳自动完成”以了解有关自动完成的更多信息,该功能在您键入命令时提供上下文相关的扩展。 另外,搜索“ shell提示”以了解如何自定义您的shell提示。 您可以使它丰富多彩; 您可以显示当前的工作目录或Git分支; 您还可以显示历史记录编号-如果您想起很多历史记录可以方便参考。 有关工作示例,请在Github中搜索“点文件”。 许多专家在Github上发布了他们的shell配置。

现在,如果您能原谅我,我必须找到我的假发和古铜色。 像格劳乔·马克思(Groucho Marx)一样,很难藏起来。


翻译自: https://www.ibm.com/developerworks/aix/library/au-spunixpower.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值