Hack 和 / - Lightning Hacks Strike Twice

作者:Kyle Rankin

整整一年前,我写了我的第一篇 Lightning Hacks 专栏。这个专栏的灵感来源于会议上经常出现的闪电演讲。在闪电演讲中,不是由一位演讲者进行一小时的演讲,而是由不同的人进行 5-10 分钟的演讲。其理念是,许多人正在进行很酷的项目,但可能没有一小时的材料可以展示。而且,观众可以快速了解几个不同的主题,而不是一个冗长的讲座。

闪电技巧背后的想法是类似的——我可以介绍一些我认为有趣但不足以写成完整专栏的快速技巧。例如,在第一篇 Lightning Hacks 专栏 [2008 年 6 月] 中,我谈到了一个扩展的 wmctrl 脚本,它可以将我的所有窗口重置为默认位置和大小,另一个脚本可以在我连接到投影仪时切换我的笔记本电脑输出,最后,我讨论了如何使用 rdiff 为大型二进制文件创建小的 diff 文件。现在一年过去了,我认为是时候让闪电再次击中了。

切换到上一个目录

这是一个快速技巧。我向很多人提到过这个技巧,我得到了两种回应。这是那种技巧之一(就像 bash 中的 Ctrl-R shell 扩展),要么你已经知道并且觉得很明显,要么你不敢相信自己花了这么长时间才发现。

如果你在命令行上花费了很多时间,你可能听说过 pushd 和 popd 脚本。这些脚本让你创建一个堆栈,你可以将目录推入堆栈,然后在你想返回上一个目录时弹出它们。这个脚本很酷,但你必须提前知道你想保存一个目录并推送它,这样你才能在以后弹出它——我似乎总是记不住。一般来说,我需要的是一些快速返回上一个目录的方法。我很幸运,bash 的 cd 内置了这个功能。我所做的只是输入

$ cd -

Bash 将您当前的工作目录保存在 $CWD 变量中,并将您的上一个目录保存在 $OLDPWD 中。如果您输入cd -,bash 会将 - 替换为 $OLDPWD。虽然你当然可以直接输入cd $OLDPWD, cd -但 `cd -` 更快且更容易记住。

SSH 密钥单行命令

如果您必须管理大量服务器或在 cron 中运行远程脚本,SSH 密钥是救命稻草。能够ssh到一台机器并立即登录而无需输入密码真是太好了。当然,该过程中更烦人的部分之一可能是在远程主机上设置 SSH 密钥。通常,该过程如下:本地运行ssh-keygenscp~/.ssh/id_rsa.pub 到远程服务器,然后ssh到远程服务器并将该密钥附加到您的远程 ~/.ssh/authorized_keys 文件。

上述方法有效,但是如果您可以用一行命令完成整个事情,为什么不这样做呢?这是 SSH 单行命令,它会将您的本地 SSH 密钥复制到远程主机,因此您在整个过程中只需输入一次密码

$ ssh user@server.example.net "cat >> ~/.ssh/authorized_keys" 
 ↪< ~/.ssh/id_rsa.pub
通过 SSH 镜像驱动器

有很多很棒的镜像工具可用,但对我来说,仍然很难击败 dd(除非您的驱动器正在损坏,在这种情况下您应该使用 ddrescue)。它是如此强大、直接、古老的 UNIX 工具,很难不爱它。如今,我不会镜像太多驱动器。我使用 kickstart 进行服务器部署,并在我想迁移文件时使用 rsync。也就是说,当我想对主机执行取证时,我仍然会镜像驱动器。

当您镜像驱动器时,您经常遇到的一个问题是您的服务器可能位于数百或数千英里外的数据中心。即使服务器就在附近,您也可能无法即时添加额外的驱动器。在任何一种情况下,大多数系统管理员最终都会通过网络镜像驱动器。传统上,这是通过 netcat 完成的,但如今,您总是必须找出一些可以使用的端口,这些端口不会被防火墙阻止。另一个问题是 netcat 会以明文形式通过网络传输潜在的敏感数据。解决这个问题的现代方案是使用 SSH。现在许多服务器都运行了 SSH 并且开箱即可用,而且凭借现代处理器速度,加密开销也不会太糟糕。

通过 SSH 镜像驱动器的单行命令与我上面用于 SSH 密钥的单行命令非常相似。它利用了这样一个事实:如果您在命令行上将数据管道传输或重定向输入到 SSH,它会将其转发到远程连接。因此,如果我想将本地机器上的 /dev/sda 镜像到 server.example.net 上名为 /media/disk1/sda-image.img 的文件,我将输入以下内容

$ sudo dd if=/dev/sda | ssh user@server.example.net "cat 
 ↪> /media/disk1/sda-image.img"

如果我不想镜像到文件,而是想直接镜像到 server.example.net 上的驱动器,我可以简单地将 /media/disk1/sda-image.img 替换为该设备文件(我只需要以 root 用户身份登录)。

因为您可以通过 SSH 镜像驱动器,所以您可以使用命令的变体将您的镜像恢复到驱动器。这是上述命令的倒置版本,如果我想将我创建的 /media/disk1/sda-image.img 镜像恢复到 /dev/sda,我将使用它

$ ssh user@server.example.net "cat /media/disk1/sda-image.img" 
 ↪| sudo dd of=/dev/sda
旋转您的屏幕

我的笔记本电脑兼作平板电脑,即使我不经常使用平板电脑模式,但当我使用它时,我希望能够将屏幕旋转到纵向模式并返回。现在,存在一些 dock 应用程序可以通过几次点击来完成此操作,而且我总是可以尝试记住正确的 xrandr 命令,但我写了一个小脚本,然后将其绑定到笔记本电脑显示器上的硬件按钮之一。每次我按下按钮时,它都会运行脚本并将屏幕再旋转 90 度。

脚本的关键是跟踪您当前的屏幕方向。当 xrandr 旋转时,它只会向左、向右、倒置或正常旋转,因此如果您已经旋转到左侧并再次向左旋转,它不会改变。为了实现这一点,我只是将当前方向写入一个临时文件。列表 1 显示了完整脚本。

列表 1. 屏幕旋转脚本

#!/bin/sh

export ORIENTATION=`cat /tmp/.orientation`

if [ $ORIENTATION -eq "90" ]; then
        xrandr --auto
        xrandr --output LVDS --rotate inverted 
        echo 180 > /tmp/.orientation
        echo "180" | osd_cat --shadow=2 --align=center \
        --pos=bottom --color=green --delay=2 \
        --font=lucidasanstypewriter-bold-24 \
	--offset 40 &
elif [ $ORIENTATION -eq "180" ]; then
        xrandr --auto
        xrandr --output LVDS --rotate left 
        echo 270 > /tmp/.orientation
        echo "270" | osd_cat --shadow=2 --align=center \
        --pos=bottom --color=green --delay=2 \
        --font=lucidasanstypewriter-bold-24 \
        --offset 40 &
elif [ $ORIENTATION -eq "270" ]; then
        xrandr --output LVDS --rotate normal 
        echo "Normal" | osd_cat --shadow=2 --align=center \
        --pos=bottom --color=green --delay=2 \
        --font=lucidasanstypewriter-bold-24 \
        --offset 40 &
        echo 0 > /tmp/.orientation
else
        xrandr --auto
        xrandr --output LVDS --rotate right 
        echo 90 > /tmp/.orientation
        echo "90" | osd_cat --shadow=2 --align=center \
        --pos=bottom --color=green --delay=2 \
        --font=lucidasanstypewriter-bold-24 \
        --offset 40 &
fi

请注意,在列表 1 中,我还添加了一个管道传输到 osd_cat 的 echo。这是可选的,只是在我的屏幕上显示当前方向。如果您想使用它,请确保您拥有 osd_cat 实用程序(它包含在 Debian 和 Ubuntu 的 xosd-bin 软件包中)。脚本的设置方式是,它将按顺序运行每个方向,然后再返回正常。由于临时文件将在机器重启时被删除,因此我确保将默认模式设置为旋转 90 度。

Kyle Rankin 是旧金山湾区的高级系统管理员,也是 O'Reilly Media 的多本书籍的作者,包括 Knoppix HacksUbuntu Hacks。他目前是 North Bay Linux Users' Group 的总裁。

加载 Disqus 评论