题 Linux命令行最佳实践和提示?


我想打开一个会积累Linux命令行(CLI)最佳实践和技巧的讨论。

我搜索过这样的讨论,分享下面的评论,但没有找到一个,因此这篇文章。

我希望我们都能从中吸取教训。

欢迎您分享您的Bash技巧,grep,sed,AWK,/ proc和所有其他相关的Linux / Unix系统管理,shell编程最佳实践,以造福我们所有人。


112
2018-03-02 21:23




为什么只有Linux?许多提示可能对几乎所有类型的Unix都有用。 - mouviciel
这个问题可能有点广泛 - Linux / Unix命令行的最佳实践足以填满整本书...... - Jonik
我同意可以应用于linux的unix技巧也非常受欢迎,我写的是因为A.这就是我们在这里工作的东西。 B.因为它近年来获得了更广泛的公众曝光率。 - Maxim Veksler
我认为编写人们使用的最有用和最有趣的命令列表是个好主意。
这些都是相关的吗? refspecs.freestandards.org


答案:


使用 屏幕,GNU项目开发的免费终端多路复用器,允许您将多个终端合二为一。

您可以开始一个会话,即使您的连接丢失,您的终端也会被保存,因此您可以在以后或在家中恢复。


111
2018-03-02 22:52



我使用的最常见的开关是'screen -D -R'用于分离和恢复我的上一次屏幕会话,'screen -x'用于从多个登录中查看相同的屏幕会话。另外,从中获取一个漂亮的.screenrc dotfiles.org/.screenrc - Nick Devereaux
关于屏幕的另一个好处是,当您想要使用屏幕-x进行协作时,您可以与其他人共享终端 - gareth_bowles


SSH!
SSH是上帝的命令 - 我认为这是最有价值的总体命令。选项可能相当令人生畏,但似乎我不断学习使用SSH的新命令行选项,我从未想过这是必要的。我可能在这一点上使用过它们。

你使用的越多,你学到的就越多。你可以用它做一些惊人的事情。

注意:除了运行ssh服务器之外,所有这些都可以在服务器上进行远程操作。

通过Internet挂载文件系统 

在网上搜索SSHFS

转发命令

SVN + SSH协议是Subversion从远程客户端到运行NO DEAMON的服务器! SVN命令通过ssh shell启动服务器,并在现有管道中来回传递信息。 rsync程序执行相同的操作,通过SSH启动一个本身,对没有rsync deamon的服务器运行。编写自己的bash文件很容易做类似的技巧。

链接通过防火墙 

我一直用这个来跳过家里的linux服务器到我的mac。

转发端口:
在您意识到可以通过家庭防火墙反弹并在家中工作时将路由器配置为在家庭网络中这样做之前,似乎只是适度有用。

转发X请求: 

这是另一个惊人的。无论是否在远程系统上运行X服务器,您都可以运行x-windows程序,该窗口将显示在本地屏幕上。只需使用开关-X,就是这样!

由于您不必在远程服务器上运行X服务器,因此CPU对服务器的影响很小,您可以使用TINY Linux服务器为运行Windows和cygwin / X的功能强大的游戏PC提供大量应用程序。

当然VI和EMACS通过SSH工作,但是当我在家里跑步时,有时我想要更多。我使用ssh -X来启动Eclipse的副本!如果您的服务器比您的笔记本电脑更强大,那么您的笔记本电脑上就有GUI,但编译是在您的服务器上完成的,因此不必担心系统负载。

在批处理文件中运行 

(意味着运行在其他系统上“填充”的本地批处理文件):

两件事情相结合,使这个很酷。一种是您可以使用(更安全的)加密密钥来消除密码提示。第二种是您可以在SSH CLI上指定命令。我以一些有趣的方式使用它 - 比如当远程服务器上的编译失败时,我会将它连接到我的计算机并播放声音文件)。

请记住,您可以重定向远程命令的输出并在本地批处理文件中使用它,因此您也可以在本地拖尾在您的服务器上运行的编译。

内置于Mac

服务器和客户端都内置在mac和linux中。对于Mac和Ubuntu,启用服务器就像找到正确的复选框一样简单。

在PC上安装cygwin或cygwin / X(cygwin / X将允许您将x-window输出从Linux机器转发到Windows PC - 它安装X服务器)

重要提示/配置文件

切勿在防火墙上使用端口22。你会得到很多黑客攻击,这是不值得的。只需让防火墙向服务器转发不同的端口即可。

有大量配置选项可以显着简化ssh命令。以下是我工作的一个例子:

Host home
    hostname billshome.hopto.org
    Port=12345
    user=bill
    LocalForward=localhost:1025 mac:22

当我键入“ssh home”(没有其他内容)时,它就像我输入的那样:

ssh -p 12345 bill@billshome.hopto.org

然后将我的本地端口1025转发到我家的系统“mac”。原因是我的文件中有另一个条目:

Host mac
    hostname localhost
    port=1025

所以,一旦我做了“ssh home”并且仍然打开了窗口,我可以输入“ssh mac”,这里工作的计算机实际上会尝试连接到自己的端口1025,它已被转发到“mac: 22“由另一个命令,因此它将通过防火墙连接到我家的Mac。

编辑 - 很酷的脚本!

我挖出了一个我喜欢的旧剧本 - 不得不回来发布给那些可能感兴趣的人。该脚本称为“authMe”

#!/bin/bash
if [ ! -f ~/.ssh/id_dsa.pub ]
then
    echo 'id_dsa.pub does not exist, creating'
    ssh-keygen -tdsa
fi
ssh $1 'cat >>.ssh/authorized_keys' <~/.ssh/id_dsa.pub

如果您的主目录中有此脚本,并且您可以连接到(通过ssh)主机,则可以键入“./authMe hostName”。

如果有必要,它将为您创建一个公钥/私钥对,然后它将ssh到另一台机器并复制您的公钥(ssh命令将提示您输入密码......)

在此之后,SSH命令不应该在连接到该远程系统时再询问您的密码,它将使用公共/私有密钥对。

如果远程计算机并不总是安全的,则应在提示时考虑设置“密码短语”。

您可能还希望将远端的ssh服务器配置为不允许文本密码(仅限密钥)以获得额外的安全性。


101



+1非常好,紧凑的帖子 - Karsten
关于端口22的SSH的一个小注意事项:如果你有一个很好的root密码而你的用户没有可怕的密码,只需运行fail2ban(或类似的东西)就足以阻止破解尝试。我发现将SSH保留在另一个端口上真的很烦人。 - David Wolever
它有时会很刺激,但连接的数量只是可怕的。我知道他们不应该通过,但有点像你有人走到你的房子,每分钟摆弄你的门把手 - 只是让人不安。
在大多数ssh版本中都有一个内置版本的最后一个命令,现在称之为 ssh-copy-id,就像它一样简单 ssh-copy-id user@someserver - JamesHannah
执行'ssh mac'技巧的另一种方法是在.ssh / config文件中使用ProxyCommand指令。主机mac ProxyCommand ssh -q home“nc%h%p”这将在home上运行netcat(nc)并将你的ssh连接直接重定向到mac。我发现那些更容易链接(例如,如果你需要连接到'home'来到'工作堡垒'去'工作web服务器'。 - toppledwagon


我喜欢用

cd -

切换到上一个目录。很有用!


73



我从来不知道这个!谢谢!在相关的说明中,pushd和popd通过构建一堆dirs来做类似的事情。当您在深度目录结构中导航时,这些技巧会有所帮助。
这绝对是一种启发。 - Manuel Ferreria


我最近发现了 pv 命令(管道查看器),它像猫一样但具有传输细节。

而不是

$ gzip -c access.log > access.log.gz

您可以使用

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

所以你不会知道你的手术什么时候结束,现在你知道了!

由Peteris Krumins提供 


69



$ gzip -c access.log> access.log.gz为什么不呢:$ gzip access.log
哦,这工作:)我刚从Peteris的网站上拿了例子。 - Nick Devereaux
这看起来很古老 tee(1)。 - Daniel C. Sobral
非常有用的实用工具,我总是忘记:-( - Patrick


sudo !!

以root身份重新运行上一个命令。

[网站上当前的顶级命令 http://www.commandlinefu.com,一个以这个问题为主题的网站。]


53



披露 - 我运行commandlinefu.com - codeinthehole
它会保存这个人16个字符: xkcd.com/149


按Ctrl-R 并开始键入命令(或其任何部分) - 它搜索命令历史记录。再次按Ctrl-R将跳转到下一个匹配,enter执行当前显示的命令,右箭头(至少)将允许您先编辑它。

$ (reverse-i-search)`svn': svn status

在学习这个之前,我已经使用Linux作为我的主要操作系统已经使用了7年,但是现在我知道它,它非常方便。


46



谢谢。我一直在使用反向搜索,但一直无法弄清楚如何跳转到下一场比赛。 - Adam
Ctrl-S跳转到下一场比赛。你可能不得不这样做 stty -ixon 首先关闭XON / XOFF流控制意义(这也使得Ctrl-Q可用,默认情况下它被映射为与Ctrl-V引用插入相同,但您可以将其更改为其他内容)。看到 man stty 和 man readline 了解更多信息。该 stty 命令可以添加到您的 ~/.bashrc - Dennis Williamson


命令行很有趣。我认为你只能自己学习这么多,其余的你是通过使用命令行偶然看别人而学到的。

我使用shell多年来手工输入目录名称。有一天,我在一个系统上看着一个朋友乱七八糟的东西,他一直按着标签键。我问“你为什么要打标签?”。答:它试图完成目录或文件名。谁会猜到 - 标签完成!键入一些文件或目录,单击选项卡,它将尝试完成您键入的内容(行为取决于哪个shell)。

有一天,说朋友在命令行上看着我,看着我打字:

coryking@cory ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
coryking@cory /etc $ popd
~/trunk/mozi
coryking@cory ~/trunk/mozi $

谁会猜到的??他从来不知道 popd / pushd。猜猜我们甚至......


45



对我来说,标签完成看起来像“显而易见”,非常基本,但我也不知道popd / pushd。确实有趣。 :) - Jonik
另请参阅此答案,以便能够比命令,文件和目录更多地完成选项卡: stackoverflow.com/questions/603696//603919#603919 - Jonik
那是真的。我通过观察某人了解了bash的后向历史搜索(ctrl-r)。我后来才意识到它是一个readline功能,并且在其他包含readline(mysql,gdb,python -i,clisp等)的程序中也是如此。 - sigjuice
你怎么能使用“shell”多年而不知道tab完成? - prestomation
处理pushd / popd时不要忘记提及命令 迪尔斯。它显示了pushd / popd堆栈上的内容。 - slm


学习Vim。

它(可以说)是最好的编辑器,但肯定是裸Linux服务器上最好的编辑器。


41



gvim也是windows上最好的文件浏览器;)
这也非常有用,因为一旦你知道vim,你可以将大多数shell放入vi模式,导航变得非常容易和快速 - Patrick


即使在您注销后,让程序保持运行有时也很有用。我见过一些使用nohup甚至屏幕的解决方案。我所知道的最简单的是:

$ your_command_here & disown

您还可以分离正在运行的程序:

$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown

38



使用屏幕非常棒,因为您可以在以后的任何地方“重新连接”该应用程序。 - prestomation
+1,我没有听说过被拒绝。 - user18911
虽然我已经对屏幕做了同样的事情,但是同上了 - Andy


当我想确保使用实际命令而不是别名时,我使用前导反斜杠:

\rm -rf ~/tmp

38



这与“command rm -rf~ / tmp”相同吗? - Maxim Veksler
我不知道“命令”,但它看起来一样。 - mouviciel
好吧,是的,除非“命令”不是别名,在这种情况下你必须使用\ command rm -rf~ / tmp在这种情况下\ rm -rf~ / tmp更好 - Jamol
@presario,您认为可以为“/”创建别名吗?可惜我不能赞成评论:)
另见类似的命令“builtin”。 - Dennis Williamson