我想打开一个讨论,该讨论将积累您的Linux命令行(CLI)最佳实践和技巧。
我已经搜索了这样的讨论以分享以下评论,但没有找到评论,因此发布了这篇文章。
我希望大家都能从中学到东西。
欢迎您分享Bash技巧,grep,sed,AWK,/ proc和所有其他相关的Linux / Unix系统管理,shell编程最佳实践,以使我们所有人受益。
我想打开一个讨论,该讨论将积累您的Linux命令行(CLI)最佳实践和技巧。
我已经搜索了这样的讨论以分享以下评论,但没有找到评论,因此发布了这篇文章。
我希望大家都能从中学到东西。
欢迎您分享Bash技巧,grep,sed,AWK,/ proc和所有其他相关的Linux / Unix系统管理,shell编程最佳实践,以使我们所有人受益。
Answers:
Use screen,这是GNU Project开发的免费终端多路复用器,可让您将多个终端合二为一。
您可以开始一个会话,并且即使连接断开也可以保存您的终端,因此您可以稍后或在家中恢复。
SSH!
SSH是最重要的命令-我认为它是最有价值的整体命令。这些选项可能非常艰巨,但似乎我一直在不断学习对SSH使用新的命令行选项,而我从未认为这是不必要的。在这一点上,我可能已经用尽了它们。
使用的次数越多,您就会学到更多。您可以使用它来做一些令人惊奇的事情。
注意:所有这些操作都可以在远程运行,而无需运行ssh服务器,而无需在服务器上进行任何设置。
通过Internet挂载文件系统
在网上搜索SSHFS
转发命令。
SVN + SSH协议是从远程客户端到服务器的Subversion转换,上面没有运行DEAMON!SVN命令通过ssh shell启动服务器,并通过现有管道来回传递信息。rsync程序执行相同的操作,通过SSH自身启动没有rsync守护程序的服务器。编写自己的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上指定命令。我已经以一些有趣的方式使用了它-就像当远程服务器上的编译失败时,我会将它SSH到我的计算机中并播放声音文件)。
请记住,您可以重定向远程命令的输出,并在本地批处理文件中使用它,因此您也可以在本地跟踪服务器上运行的编译器。
内置于Mac
服务器和客户端都内置在mac和linux中。对于Mac和Ubuntu,启用服务器就像找到正确的复选框一样简单。
在PC上安装cygwin或cygwin / X(cygwin / X允许您将x窗口输出从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服务器配置为不允许文本密码(仅密钥)以提高安全性。
ssh-copy-id
,它很简单ssh-copy-id user@someserver
我最近发现了pv
命令(管道查看器),该命令类似于cat但具有传输详细信息。
所以代替
$ 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
因此,您将不知道何时完成操作,现在知道了!
tee(1)
。
按Ctrl-R并开始输入命令(或其任何部分)-它会搜索命令历史记录。再次按Ctrl-R将跳至下一个匹配项,按Enter键执行当前显示的命令,并且右箭头(至少)将使您首先对其进行编辑。
$ (reverse-i-search)`svn': svn status
在学习Linux之前,我已经将Linux作为主要操作系统使用了大约7年,但是现在我知道了,它非常方便。
stty -ixon
首先关闭XON / XOFF流控制含义(这也使Ctrl-Q可用,默认情况下它已映射为与Ctrl-V quoted-insert相同,但是您可以将其更改为其他内容)。请参阅man stty
和man readline
了解更多信息。该stty
命令可以添加到您的~/.bashrc
命令行很有趣。我认为您只能自己学习很多,其余的则是偶然地使用命令行监视其他人而学到的。
多年来,我一直在使用Shell手动输入目录名称。有一天,我看着一个朋友在一个系统上乱七八糟,他一直按着Tab键。我问“为什么要打标签?”。答:它尝试完成目录或文件名。谁能猜到-制表符完成!键入文件或目录的一部分,单击选项卡,它将尝试完成您键入的内容(但是,行为取决于哪个shell)。
一天,他说朋友在命令行上看着我,看着我键入类似以下内容的内容:
coryking@cory ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
coryking@cory /etc $ popd
~/trunk/mozi
coryking@cory ~/trunk/mozi $
谁能猜到!他从来不知道popd
/ pushd
。猜猜我们甚至...
有时即使退出后仍使程序运行仍然很有用。我已经看到一些为此目的使用nohup甚至screen的解决方案。我所知道的最简单的是:
$ your_command_here & disown
您还可以分离正在运行的程序:
$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown
这个技巧将使您的CLI更加舒适(至少对我而言是如此):
创建具有以下内容的〜/ .inputrc文件:
"\e[A": history-search-backward
"\e[B": history-search-forward
重新加载bash(例如,键入“ exec bash”)。当您键入命令的前缀并按向上箭头时,您将浏览以前缀开头的命令,例如,如果键入ssh,它将显示以前与远程Shell的连接。如果提示为空,则向上箭头将以正常方式浏览历史记录。
exec bash
man readline
并记住它的默认快捷键
bind -f ~/.inputrc
可以重新加载inputrc,而无需启动新的bash并清除当前环境。
一次执行多个命令时使用&&
代替;
。发生错误时它将停止,并且不执行其他命令。
经典示例:
./configure && make && make install
dosomething && echo "success" || echo "teh fail"
当在bash上的命令行上编写循环时,我经常在带有风险的命令前加上“ echo”命令。
for item in items; do echo something-risky; done
这样,在提交运行之前,我可以完整地看到“危险的东西”。当您的冒险命令包含变量扩展名和全局名时会有所帮助。编写bash脚本时,“ set -x”非常有用。
'set -x'启用调试。有关bash调试的信息,请参见http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html。
您需要测试2台服务器之间的最大带宽。
在SERVER1上执行:
nc -u -l 54321 > /dev/null
在SERVER2上执行:
dd if=/dev/zero bs=1MB | nc -u SERVER1 54321 &
pid=$(pidof dd)
while (( 1 )); do kill -USR1 $pid; sleep 2; done
您将看到如下输出:
182682000000 bytes (183 GB) copied, 1555.74 seconds, 117 MB/s
182920+0 records in
182919+0 records out
117 MB / s是此处的有趣因素,它显示了实际的网络传输带宽。
说明:
随着数据包开始在网络上流动,您将能够在SERVER2上看到带宽统计信息,这是对两个服务器之间实际最大可能带宽的不错估计。
通过UDP复制(以防止TCP开销)。
复制到从存储器(的/ dev /零)上SERVER1 到上SERVER2存储器(的/ dev / null的),从而防止磁盘I / O从成为瓶颈。
有关日志查看的一些小建议:
tail -f
您可以一次观看多个日志!例如:tail -f log1.txt -f log2.txt
我很久以前从朋友那里学到了一个技巧,可以轻松更改文件的扩展名:
mv my_filename.{old,new}
Shell扩展会将其扩展为:
mv my_filename.old my_filename.new
这也可以用于通过其他方式重命名文件,例如在以下位置添加内容:
mv my_{,cool_}filename
ls -l /bin/c
然后按Alt-Shift- {,它将完成此操作,如ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}
您所愿。
使用“ tar xf”提取压缩的存档。不需要bzip2的j和gzip的z,因为tar将检测档案的文件类型。参数前都不是“-”号。您将节省大量时间(超过一千年;-)。
最好还是使用unfoo通过单个命令提取任何存档,而无需任何不必要的参数。
alias ut="tar xf"
–使提取档案更加容易。
我经常使用这些
ALT-。(在某些终端中为ESC +。)复制上次使用的参数(超级有用)
CTRL-W删除单词
CTRL-L清除终端(类似于清除命令,但速度更快)
ALT-B(某些终端为ESC + B)向后移动一个字
ALT-F(某些终端为ESC + F)向前移动一个字
CTRL-E跳至EOL
CTRL-A跳至BOL
历史记录中的CTRL-R搜索
在bash中,我经常使用!$。它重复最后一个命令的最后一个参数:
ls /really/long/command/argument/that/you/dont/want/to/repeat.txt
vi !$
它会运行ls,然后,如果要编辑它,则不必重新输入,只需使用!$。这对于长路径/文件名非常有用。此外,!*会重复先前命令的所有参数。我没有用太多,但看起来很有用。
我知道已经提到过它们,但是我经常使用vim,screen和cd。
我忘记了夜色:
set -o noclobber
来自man bash:
如果设置,bash不会使用>,>&和<>重定向运算符覆盖现有文件。使用重定向操作符> |创建输出文件时,可以覆盖此方法。而不是>。
Alt-.
。
从bash切换到zsh,发现您的工作效率有所提高:
Google会告诉您更多好处。
老派,将目录树从一个地方移到另一个地方,保留符号链接,权限和所有这些好东西:
tar cBf - . | (cd /destination; tar xvBpf -)
或整个网络
tar cBf - . | rsh foo.com "cd /destination; tar xvBpf -)
新学校:
rsync -urltv . /destination
或整个网络
rsync -urltv -e ssh . foo.com:/destination
tar xvBpf - -C /destination
== (cd /destination; tar xvBpf -)
少键入内容,并且比ssh更易于使用。
rsync -avh
最好在一台机器上使用- h
确保硬链接正确传输而无需将每个链接转换为单独的文件,但是如果您有大量文件,则可能会占用大量内存。rsync -avzh . foo.com/destination
是等效于网络的,通常您不需要,-e ssh
因为rsync会知道使用ssh。
rsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
要求:您有一个目录,其中包含要删除的大量文件。rm -r将失败!
例
find /var/spool/mqueue/ | wc -l
191545
rm -f /var/spool/mqueue/*
-bash: /bin/rm: Argument list too long
解决方案:
find /var/spool/mqueue/ -xdev -exec command rm -f '{}' +
说明:
编辑:修复@ephemient注释后的解释。
find将通过允许的最大参数为rm提供参数。这将允许rm批量删除文件,这是我所知道的最快的技术,而无需使用find本身的-delete操作。相当于
find /var/spool/mqueue -xdev -print0 | xargs -0 rm -f
如果您find
不支持该功能,则可能会发现有用-exec ... +
。
\;
为+
:然后find
将执行xargs
默认情况下的操作,即尽可能多地对参数进行批处理(不会超出参数列表限制)。或只使用-delete
intead -exec rm
(两者都需要GNU Findutils)
find ... -delete
,如果您的发现如此有才。
我经常使用这两个技巧,所以我认为分享是一个好主意:
!foo
将以“ foo”开头启动历史文件中的最后一个命令(!gcc
例如,我经常在编译时使用它。)
另一个是键盘快捷键(Ctrl + O而不是Return),它将执行命令并在历史记录文件中显示下一个命令。例如,当我编译和测试文件时,我总是执行3或4条命令,将cd转到测试的目录,然后运行测试,将cd转到makefile的目录。使用Ctrl + O可以使此任务容易得多:)
希望有帮助!
如何在Linux上使用Subversion而不使用可能无法使用的精美图形界面。
svn co <repo-url> . # Checks out project into current folder
svn update # Get latest changes from server
svn status # Shows what files have changed locally
svn add <path/filename> # Add some file to the repo
svn commit # Commit your changes to the repo
奇怪的是,这使许多开发人员无法使用Linux。
最被忽视的老式命令: find
昨天我修复了一个总权限错误:
for u in nr dias simonpj; do
sudo -u $u find . -type d -exec chmod g+s '{}' ';'
done
chmod 644 $(find . -type f)
,chmod 755 $(find . -type d)
-perm
选择以find
某种方式设置权限的文件的选项。
grep是我的朋友。说真的
列出.rb
包含以下文本的文件class foo
:
grep -l "class foo" .rb
列出.rb
的文件不包含文本class foo
:
grep -L "class foo" *.rb
列出.rb
的文件不包含富或酒吧(您可以使用带有-e任何正则表达式,但你需要躲避运营商):
grep -L -e "foo\|bar" *.rb
Shell替换使用^
以下命令执行:
/home/eugene $ ls foo.txt
foo.txt
/home/eugene $ ^ls^rm
rm foo.txt
/home/eugene $ ls foo.txt
ls: cannot access foo.txt: No such file or directory