Linux集锦大全【持续更新】

文章目录

Linux集锦大全【持续更新】

Linux最常用的几个归档和压缩命令

仅个人想法,会持续不间断更新和改进。

繁忙的世界中,偶尔也需要放空一下自己,找寻一下自我。

简而言之,就是要解压一下。

那么在Linux的世界里,也是有不少的解压方法的。

解压方法之一 tar

Linux的tar命令可以用来压缩或者解压缩文件。

官方定义为:

tar - an archiving utility

语法

bash 复制代码
$ tar optionA [optionsB] filename

使用该命令时,optionA 选项是必须要有的,它告诉tar要做什么事情,optionsB选项是辅助使用的,可以选用。

其中optionsA主要为:

  • -c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。相当于打包。
  • -x 从档案文件中释放文件。相当于拆包。
  • -t 列出档案文件的内容,查看已经备份了哪些文件。

不过需要注意的是,这三个参数仅仅能存在一个。

辅助选项常用的为:

  • -z :是否同时具有 gzip 的属性,有的话压缩文件格式为:++filename.tar.gz++
  • -j :是否同时具有 bzip2 的属性,有的话压缩文件格式为:++filename.tar.bz2++
  • -v :压缩的过程中显示文件,这个基本都需要带上
  • -p :使用原文件的原来属性(属性不会依据使用者而变)
  • --exclude FILE:在压缩的过程中,不要将 FILE 打包!

压缩文件

接下来的命令为把a,b,c,d压缩到文件test.tar.gz中。

bash 复制代码
$ tar czvf test.tar.gz a b c d
a
b
c
d

查看压缩文件的内容

接下来的命令将列出压缩文件的内容,但是不解压,所以可以先确定,再解压不迟

bash 复制代码
$ tar tzvf test.tar.gz a b c d
-rw-rw-r-- oper/oper           12 2010-05-24 22:51 a
-rw-rw-r-- oper/oper           18 2010-05-24 22:51 b
-rw-rw-r-- oper/oper           15 2010-05-24 22:51 c
-rw-rw-r-- oper/oper           28 2010-05-24 22:51 d

解压文件

接下来就可以解压操作了。

bash 复制代码
$ tar zxvf test.tar.gz
a
b
c
d

解压方法之一 zip

Linux zip命令的功能是用于压缩文件,解压命令为unzip

通过zip命令可以将很多文件打包成.zip格式的压缩包,里面会包含文件的名称、路径、创建时间、上次修改时间、权限等信息,与tar命令相似。

对于类似文本文件而言,压缩比基本可以达到2:1到3:1.

官方的定义为:

zip - package and compress (archive) files

语法

zip的参数超级的多,各种设置也是很巧妙,不过常用的就几个,其他的放在后面再说。

bash 复制代码
$ zip  [-aABcdDeEfFghjklLmoqrRSTuvVwXyz!@$] [--longoption ...]  [-b path] [-n suffixes] [-t date] [-tt date] [zipfile [file ...]]  [-xi list]

参数

  • -r--recurse-paths :遍历整个目录 for example:

  • -j--junk-paths: 仅保存文件名,而不保存路径。默认情况下zip将保存整个路径

参考实例

将指定目录及其内全部文件都打包成zip格式压缩包文件:

bash 复制代码
$ zip -r backuptest.zip /etc
  adding: etc/resolv.conf (stored 0%)
  adding: etc/fonts/ (stored 0%)
  adding: etc/fonts/conf.d/ (stored 0%)
  adding: etc/fonts/conf.d/65-0-wqy-zenhei-sharp.conf (deflated 88%)
  adding: etc/fonts/conf.d/59-liberation-mono.conf (deflated 57%)
  adding: etc/fonts/conf.d/57-paratype-pt-sans.conf (deflated 66%)
  adding: etc/fonts/conf.d/59-liberation-sans.conf (deflated 74%)
  adding: etc/fonts/conf.d/65-0-ttf-arphic-uming.conf (deflated 87%)
  adding: etc/fonts/conf.d/65-1-vlgothic-gothic.conf (deflated 74%)
  adding: etc/fonts/conf.d/65-0-lohit-nepali.conf (deflated 57%)
  adding: etc/fonts/conf.d/20-unhint-small-dejavu-sans.conf (deflated 43%)
  adding: etc/fonts/conf.d/61-urw-d050000l.conf (deflated 71%)
  adding: etc/fonts/conf.d/57-dejavu-sans.conf (deflated 77%)
  ...

zip还支持通配符的表达,比如将当前工作目录内所有以.jpg为后缀的文件打包:

bash 复制代码
$ zip -r backuptest.zip *.jpg
  adding: test0.jpg (deflated 56%)
  adding: test10.jpg (deflated 56%)
  adding: test12.jpg (deflated 56%)
  adding: test14.jpg (deflated 56%)
  adding: test16.jpg (deflated 56%)
  adding: test18.jpg (deflated 56%)
  adding: test20.jpg (deflated 56%)
  adding: test2.jpg (deflated 56%)
  adding: test22.jpg (deflated 56%)
  adding: test24.jpg (deflated 56%)
  adding: test26.jpg (deflated 56%)
  adding: test28.jpg (deflated 56%)

仅保存文件名

zip默认情况下会保存路径信息,如果加上-j将不保存路径信息,而仅仅保存文件。

这个情况可以在希望把同一类文件放在一起时比较有用。

bash 复制代码
$ zip -j foo foo/*

解压命令之一 unzip

Linux unzip命令用于解压缩zip文件。

官方的定义为:

unzip - list, test and extract compressed files in a ZIP archive

基本命令

bash 复制代码
$ unzip file.zip

unzip 只需在命令后跟上要解压的文件名,如 file.zip,将该压缩文件解压缩到当前目录。

指定目录解压

如果需要指定解压缩的目标目录,可以使用 -d 参数:

bash 复制代码
$ unzip archive.zip -d /path/where/to/extract

这样就会把压缩文件解压到指定的目录中。

不解压某些文件

如果压缩的文件巨大,而不想解压其中的某些,可以用下面的命令

bash 复制代码
$ unzip file.zip -x data

这个命令的意思为,解压file.zip,但是不把里面的data解压。

解压命令之一 gzip

gzip用于对后缀为gz文件进行解压:

bash 复制代码
$ gzip -d data.gz

这个命令将解压examplefile.gz,并且在当前目录下生成一个名为data的解压后的文件。

但特别需要留意的是,这个操作会删除源文件,会删除源文件,会删除源文件。

所以如果你想保留原始压缩文件,一定记得使用-k选项:

bash 复制代码
$ gzip -dk data.gz

这会保留原始的data.gz文件,并生成一个解压后的data文件。

Linux最危险的几个命令

仅个人想法,会持续不间断更新和改进。

Linux系统中的命令最美妙也最危险。

如果几个操作系统(Windows/MacOSX/Linux)的危险水平有段位,那么Linux应该首当其冲。

如若使用不当,轻则伤筋动骨摔键盘,重则历年数据烟消云散。

本文本着大家熟悉其危险性,尽量避免一些误操作。

为什么Linux最危险呢?那主要是因为root 用户对系统具有绝对的操作权限,可以执行任何命令、任何操作,所以会产生任何后果。

所以在以 root 用户身份进行操作时,尤其一定要特别小心。

如果不确定命令的执行结果,可以在虚拟环境线操作一下,再在生产环境执行。

危险命令介绍

如果单纯按照熟悉或者段位来讲,rm首当其冲,轻则丢点数据,重则系统崩溃。目前看到的很多删库跑路的程序员大多就因为这个。

特别是rm -rf /,不要执行,不要执行,不要执行,重要的事情说三遍,这个命令会导致整个系统被毁坏

随后的应该就是chmod和chown,特别是对于重要的数据,一般建议对于新手而言,仅仅具备只读权限即可;

接下来的dd以及mkfs命令,可能不太常见,但是也具备一定的杀伤力。

fork炸弹暂且不表,总之随便来的命令不要随便执行。

删除文件和目录命令rm

rm 命令用于删除文件或者目录。官方定义为:

remove files or directories

删除当前目录下的所有文件及目录,命令行为:

bash 复制代码
$ rm  -r  * 

文件一旦通过rm命令删除,则无法恢复,所以必须格外一定切记小心地使用该命令。

因为发生过很多欲哭无泪的故事。。。

主要的痛点就在如果是在root账户权限下,rm无所不能呀

Linux 的 dd 命令

dd这个命令一直没有弄明白缩写的含义,这个命令应该归到Linux炫技里面,因为我也是很晚才用到,不过有些功能还可以尝试一下。

官方含义为:

dd - convert and copy a file
从官方含义来看,是不是定义为cc比较合适,^_^

dd命令用于复制文件,转换或者格式化文件,这里也是危险所在,如果使用dd对设备进行低级别的复制和转换操作时,如果命令行参数错误,可能导致数据丢失。

比如 dd if=/dev/random of=/dev/sda:这个命令将设备(例如硬盘)的内容重写为随机数据,导致设备上所有数据的永久丢失。

mkfs 格式化硬盘分区

万万不要制定了错误的硬盘,切记切记。

这个命令格式化的很彻底。

shutdown

在root账户下,可以直接立即关闭系统,很容易造成数据没有保存,一般需要延迟个1分钟,不要使用shutdown -h now来立即关闭系统。

> file

> file:这个命令会清空文件内容。若对关键的系统文件使用这个命令,可能会破坏系统。

Linux最常用的几个时间日期命令

桃花谢了春红,太匆匆,无奈朝来风雨晚来风。

时光只解催人老,不信多情,长恨离亭,泪滴春衫酒易醒。

时间就在指缝间,悄然的离去了。

一日难再晨及时当勉励 date

date命令可以用来打印显示亦或者更改日期和时间。

看看官方的定义如下:

date - print or set the system date and time

用法如下:

bash 复制代码
$ date [OPTION]... [+FORMAT]
$ date [-u | --utc| --universal] [MMDDhhmm[[CC]YY][.ss]]

较常用的OPTION为:

  • -R : 显示时区
  • -u, --utc, --universal:打印或者设置世界协调时
  • -d, --date=STRING:显示STRING的时间

默认输入

date 命令默认情况下为CST时区,

bash 复制代码
$ date
Mon Jun  5 15:11:44 CST 2014

显示时区

如果加上 -R参数就可以带上时区,比如我们的东八区

bash 复制代码
$ date -R
Mon, 05 Jun 2014 15:15:25 +0800

世界协调时

选项-u, --utc, --universal可以显示世界协调时

bash 复制代码
$ date -u
Mon Jun  5 07:15:46 UTC 2014

$ date --utc
Mon Jun  5 07:15:48 UTC 2014

$ date --universal
Mon Jun  5 07:15:55 UTC 2014

格式化日期

可以通过不同的参数来格式化日期,这里需要注意的是:不同的大小写代表的是不同的含义

比较常用的日期和时间如下:

bash 复制代码
# 显示年月日时分秒
$ date  +%Y-%m-%dT%H:%M:%S
2013-01-17T18:01:08

# 或者 下面一样的效果

$ data +%FT%T
2013-01-17T18:02:12

时光总是催人老 time

Linux time命令的用途,在于测量指定命令消耗的时间。

最常用的在于大概评估一个程序的运行时间。

这个命令很容易给人的印象是与date混淆起来

官方定义为:

time - time a simple command or give resource usage

可以给出包括系统的粗略时间。

语法

bash 复制代码
$ time [options] command [arguments...]

参数

​ - 可以认为没有参数

示例

会显示程序或命令执行的消耗时间

bash 复制代码
$ time ls /var
account  crash  games     lib    log  ......

real    0m0.014s
user    0m0.003s
sys     0m0.010s


$ time ps -aux
root     295490  0.0  0.0      0     0 ?        S    Feb20   0:10 [ldlm_cb00_019
root     297717  0.0  0.0      0     0 ?        S<   Jan29   0:04 [kworker/58:1H
root     304801  0.0  0.0      0     0 ?        S    Mar19   0:00 [kworker/1:1]
root     311110  0.0  0.0      0     0 ?        S    Mar20   0:00 [kworker/66:0]
root     313146  0.0  0.0      0     0 ?        S    Mar20   0:01 [kworker/73:2]
root     313461  0.0  0.0      0     0 ?        S<   Jan29   0:00 [kworker/44:2H
root     313914  0.0  0.0      0     0 ?        S    Feb21   0:10 [kworker/9:2]
root     314118  0.0  0.0      0     0 ?        S    Feb21   3:34 [kworker/18:1]
root     315801  0.0  0.0      0     0 ?        S    Mar20   0:00 [kworker/79:2]

real    0m0.180s
user    0m0.019s
sys     0m0.114

唯一需要留意的是上面的三个含义:

  1. real : 程序从开始调用到最后终止之间经过的实时时间
  2. user : 程序本身,以及它所调用的库中的子例程使用的CPU 时间
  3. sys : 程序直接或间接调用的系统调用执行的CPU 时间

休息一会 sleep

Linux sleep命令可以用来将目前动作延迟一段时间。

sleep的官方定义为:

sleep - delay for a specified amount of time

或许你觉得计算机太累,让它稍事休息,亦或许过个个把钟头需要喝杯水,此时sleep就有点小作用了。

其用法如下:

bash 复制代码
$ sleep [--help] [--version] number[smhd]

除了帮助和版本信息,基本没有参数了。

其中的number是必须的,也就是sleep多久的数字,默认为s秒。其他的几个含义为:

  • s second 秒
  • m minute分钟
  • h hour 小时
  • d day 天

休息5分钟

工作太累了,学习太累了,躺着太累了,休息5分钟

bash 复制代码
$ sleep 5m

1小时后提醒我

bash 复制代码
$ sleep 1h

时分秒搭配使用

当然,sleep也是支持时分秒搭配使用的,如下所示:

bash 复制代码
$ sleep 1h 2m 3s

将会sleep 1个小时2分钟3秒。

倒计时计时器

当然也可以做个循环计时器,通过sleep 1

bash 复制代码
$ echo "five"   && sleep 1 && echo "four"   && sleep 1 && sleep 1 && echo "three"   && sleep 1 && echo "two" && sleep 1 && echo "one" && echo "Stop"

结合脚本

sleep在程序里面使用比较频繁,特别是单片机的走马灯等。而Linux的sleep,也是比较常与bash脚本来配合使用,如下:

bash 复制代码
#!/bin/bash
echo -e "start to sleep 15 seconds......"
sleep 15
echo -e "continue to run program......"
./program

Linux中最常用的目录导航命令

仅个人想法,会持续不间断更新和改进。

在Linux世界中,为了更加高效地浏览和定位文件,需要一些常用的目录导航命令。

探索未知世界的cd

... note::

月桥花院,琐窗朱户,只有春知处。

宋 辛弃疾《青玉案·元夕》

cd 命令应该是除了 ls 命令外用的最多的命令了。除非你大门不出二门不迈,做个大家闺秀。

cd 命令的含义为

cd - change directory

可以让我们访问不同的文件夹。

最简单的用法为:

bash 复制代码
$ cd /the/path/you/want/to/go/

接下来说一些技巧,让效率加倍。

让cd命令对参数大小写不敏感

如果你需要同时显示大写和小写的目录名(即便是你给的参数只是小写的),执行下面的bind命令,此时就可以避免Linuxlinux的尴尬。

bash 复制代码
$ bind "set completion-ignore-case on"

进入刚才的目录

想要进入刚才进入的地方(目测没有很多人再用,但是真的很好用)运行:

bash 复制代码
$ cd --

快速返回家目录

需要快速地回到你的家目录,输入cd即可,这里其实不用一级一级的进入

bash 复制代码
$ cd

进入某用户的家目录

这个需要你有root权限

bash 复制代码
cd ~username

进入username的家目录。

这些是一些比较基础和入门的,还有一些高级一点的,这些技巧可能用的比较少,不过也是很有帮助的。

结合CDPATH的妙用

变量CDPATH定义了目录的搜索路径:

bash 复制代码
$ export CDPATH=/the/path/you/add/:/another/path/

现在,不用输入cd /the/path/you/add/hello/ 这样长了,我可以直接输入下面的命令进入 /the/path/you/add/hello/

bash 复制代码
$ cd html

!$

这个命令目测,用的人不多,其实比较有用,且有效。

bash 复制代码
$ cd !$

表明的意思是将上一个命令的参数作为cd的参数来使用。

用shopt --s cdspell自动纠正cd命令的目录名输入错误

使用shopt -s cdspell可以自动修正cd时拼写错误的目录名。

如果你在输入时经常犯些错误,这个命令是很有用的。详见以下示例:

bash 复制代码
# cd /etc/mall

-bash: cd: /etc/mall: No such file or directory

# shopt -s cdspell

# cd /etc/mall

# pwd

/etc/mail

注: 当我错误的把mail敲成了mall,用这个命令mall就自动被换成了mail

最常用的且没有之一的 ls

... note::

寻寻觅觅,冷冷清清,凄凄惨惨戚戚。

宋 李清照《声声慢·寻寻觅觅》

如果linux命令来个排名,ls命令应该是最常用的命令,除非你像黄蓉的母亲,有过目不忘的本领,惹得黄药师抱憾终身。

ls命令是list的缩写,通过ls命令,我们可以查看目录的内容,确定各种重要文件和目录的属性。

命令格式

ls [参数] [路径]

不加任何参数

如果不加任何参数,默认列出当前目录的内容。

bash 复制代码
$ ls /etc/sysconfig/network-scripts
ifcfg-em1
ifcfg-em2
ifcfg-em3
ifcfg-em4   
....

使用-l显示更多细节

-l 就是使用long listing format长格式,来显示更多的内容信息。

bash 复制代码
$ ls -l /etc/sysconfig/network-scripts
total 264
-rw-r--r--. 1 root root   341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root   294 May 13  2016 ifcfg-em2
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em3
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em4
......

使用-t按照时间排序

如果希望看到最近创建的文件,就需要用到-t参数了。

bash 复制代码
$ ls -lt /etc/sysconfig/network-scripts/
total 264
-rw-r--r--. 1 root root   341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root   294 May 13  2016 ifcfg-em2
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em4
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em3
...

使用-r按照时间逆序

如果希望删除很早以前的文件,看到最早创建的文件,就需要用到-r参数了。

bash 复制代码
$ ls -ltr /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em3
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em4
-rw-r--r--. 1 root root   294 May 13  2016 ifcfg-em2
-rw-r--r--. 1 root root   341 Nov 30 10:56 ifcfg-em1

使用-S根据文件大小排序

bash 复制代码
$ ls -lS /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root   341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root   294 May 13  2016 ifcfg-em2
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em3
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em4

查看目录命令pwd

pwd命令的作用是查看当前目录,没有参数,输入后回车即可显示当前绝对路径。

官方定义为:

pwd - print name of current/working directory

所以pwdP rint W orking Directory第一个字的缩写。

唯二需要了解的参数如下:

  • -L, --logical:打印逻辑路径,与pwd一致
  • -P, --physical:打印物理路径,这里可以从超级链接直达原处

实例展示

此时比如我们进入一个目录,然后在打印出来,如下:

bash 复制代码
$ cd /etc/sysconfig/network-scripts/

$ pwd
/etc/sysconfig/network-scripts

可以看到pwd将输出完全路径

逻辑与物理路径

比如如下:

bash 复制代码
$ pwd
/opt/test

$ ls -l
总用量 1
lrwxrwxrwx  1 root root   14 Jan 15 2012 dir -> source/dir
drwxrwxrwx  1 root root   14 Jan 15 2012 source

可以看到此时的路径在++/opt/test/++ 里面有两个目录++source++ 和++dir++ ,其中++dir++ 链接到++source++里面的dir。

接下来对比一下-L和-P的区别。

bash 复制代码
$ cd dir

$ pwd
/opt/test/dir

$ pwd -L
/opt/test/dir

$ pwd -P
/opt/test/source/dir

从上面的输出可以发现,-P参数会显示文件最原始的路径;而-L则是逻辑上的路径。

Linux tree命令

Linux tree命令以树状图列出目录的内容。

执行tree指令,它会列出指定目录下的所有文件,包括子目录里的文件。

官方定义为:

tree - list contents of directories in a tree-like format.

使用方法为:

bash 复制代码
$ tree  [-acdfghilnpqrstuvxACDFQNSUX] [-L level [-R]] [-H baseHREF] [-T title] [-o filename] [--nolinks] [-P pattern] [-I pat‐
       tern] [--inodes] [--device]  [--noreport]  [--dirsfirst]  [--version]  [--help]  [--filelimit  #]  [--si]  [--prune]  [--du]
       [--timefmt format] [--matchdirs] [--fromfile] [--] [directory ...]

参数比较多,也比较复杂。其中常用的选项为:

  • -d 显示目录名称而非内容。
  • -D 列出文件或目录的更改时间。

实例 默认显示

默认显示当前目录的信息,比如tree和tree .的含义一样。命令有如下输出结果:

bash 复制代码
$ tree   
.
├── a
├── aa
│   ├── aab
│   ├── aac
│   ├── aad
│   └── aae
├── b
├── bb
│   └── bbb
├── c
├── d
├── e
└── f

2 directories, 11 files

只显示目录

bash 复制代码
$ tree -d         
.
├── aa
└── bb

显示具体的修改时间

bash 复制代码
$ tree -D
.
├── [Apr 7 22:34]  a
├── [Apr 7 22:37]  aa
│   ├── [Apr 7 22:35]  aab
│   ├── [Apr 7 22:35]  aac
│   ├── [Apr 7 22:35]  aad
│   └── [Apr 7 22:35]  aae
├── [Apr 7 22:34]  b
├── [Apr 7 22:39]  bb
│   └── [Apr 7 22:39]  bbb
├── [Apr 7 22:34]  c
├── [Apr 7 22:34]  d
├── [Apr 7 22:33]  e
└── [Apr 7 22:33]  f

2 directories, 11 files

默认情况下tree可能没有安装,可以通过apt/yum install tree来安装。

Linux最有趣的几个命令

仅个人想法,会持续不间断更新和改进。

这次介绍一些好玩有趣的命令,不过说实话,实用性倒不是很大,纯粹好玩,给单调的命令行界面增加了一些童趣和欢乐。

命运的小火车sl

发现这个命令是在输入ls命令的时候,一不小心敲反了,直接命运的小火车开始跑了起来。

sl 是一个 "Steam Locomotive" 的缩写,它会显示一个老式的蒸汽火车在终端中穿梭。

bash 复制代码
$ sl


  (  ) (@@) ( )  (@)  ()    @@    O     @     O     @      O
@)




______                ___________
      \__I_I_____===__|_________|
______/ |   |        =|___ ___|      _________________
  |     |   |         ||_| |_||     _|                \_____A
__--------------------| [___] |   =|                        |
__|_____/[][]~\_______|       |   -|                        |
-I_____I [][] []  D   |=======|____|________________________|_
=====O=====O\ ____Y___________|__|__________________________|_
 ||    ||    |_____/~\___/          |_D__D__D_|  |_D__D__D_|
/  \__/  \__/      \_/               \_/   \_/    \_/   \_/

点亮终端的艺术之光figlet

在Linux的世界中,figlet是一个神奇的命令,可以将文字艺术化.

特别适合作为标题、口号或者问候语,还有很多软件程序的招呼语,也可以用这个来实现。

比如:

bash 复制代码
$ figlet HELLO          
 _   _ _____ _     _     ___  
| | | | ____| |   | |   / _ \ 
| |_| |  _| | |   | |  | | | |
|  _  | |___| |___| |__| |_| |
|_| |_|_____|_____|_____\___/ 
                              

活灵活现的终端:发掘cowsay

cowsay顾名思义就是一头牛为你加持,一款让命令行界面生动有趣的工具。

cowsay 可说话、可思考,与fortune加持更可以变为一头睿智的牛。

该命令接受一个文本字符串,并输出一个牛说话的图形。

下面是一头牛在说它喜欢 Linux:

bash 复制代码
$  cowsay I love linux.
 _______________ 
< I love linux. >
 --------------- 
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

探索Linux世界的智慧------fortunes命令

在Linux中,有一条神奇的命令连接着智慧与幽默,那就是fortunes命令。

看似普通的指令,背后却藏匿着千言万语,无论是名人箴言还是妙趣横生的笑话,在这里都能找到它们的踪迹。

另外最重要的,还可以根据自己的需求进行增删,目前就用基于唐诗宋词的库。

fortune并非只是简单的一句话,而是承载着古今中外智慧的涌泉。

每次执行,它都会带来截然不同的感受。或许是一位哲人的深刻格言,或是一句调皮的笑话,或者唐诗,或者宋词,与先贤对话,岂不快哉。

最简单的方法就是把这个命令,加到.bashrc文件中,每次启动,总会有触动。

bash 复制代码
$ fortune 
何以称英雄?识以领其先

    - 清·袁枚
$ fortune
一件作品的固有力量从来不会被长期地埋没或禁锢。一件艺术品可能被时间遗忘,可能遭到查禁,可能被埋进棺材,但威力强大的东西总要战胜没有过大前途的东西。

    - 茨威格
$ fortune
Yow!  We're going to a new disco!

缤纷绚烂的终端体验:探索lolcat

lolcat是一款让终端从黑白灰变得缤纷多彩的神奇工具。

通过将文字渲染成彩虹般的颜色,让你的终端充满欢乐与活力。

可以把这个命令替换掉cat,这样你的内容都灵动了起来

比如lolcat /etc/resolv.conf会生成如下信息:

进入数字的魔幻世界:探秘cmatrix

来到黑客帝国的命令cmatrix,这不仅仅是一串字符在终端中的运动,它仿佛是数字的舞蹈,变幻着无穷的图案。从绿色的数字雨到模拟Matrix电影的效果,cmatrix让我们进入了数字的奇妙世界。

显示系统风貌的screenfetch命令

screenfetch命令的神奇之处在于其简单而又直观的功能,该命令能够快速地收集系统信息并以一种富有个性的方式展示出来。

从使用的发行版到内核版本,再到处理器和内存,一目了然地展现系统的全貌。

bash 复制代码
$ screenfetch
                          ./+o+-       oper@localhost
                  yyyyy- -yyyyyy+      OS: Ubuntu 
               ://+//-yyyyyyo      Kernel: aarch64 Linux 6.4.16-linuxkit
           .++ .:/++++++/-.+sss/`      Uptime: 33m
         .:++o:  /++++++++/:--:/-      Packages: 134
        o:+o+:++.`..```.-/oo+++++/     Shell: bash 5.1.16
       .:+o:+o/.          `+sssoo+/    Disk: 32G / 59G (57%)
  .++/+:+oo+o:`             /sssooo.   CPU: 12x Apple
 /+++//+:`oo+o               /::--:.   RAM: 877MiB / 7844MiB
 \+/+o+++`o++o               ++.  
  .++.o+++oo+:`             /dddhhh.  
       .+.o+oo:.          `oddhhhh+   
        \+.++o+o``-````.:ohdhhhhh+    
         `:o+++ `ohhhhhhhhyo++os:     
           .o:`.syhhhhhhh/.oo++o`     
               /osyyyyyyo++ooo+++/    
                   `````+oo+++o\:    
                          `oo++.  

Linux最常用的几个查看硬件信息的命令

仅个人想法,会持续不间断更新和改进。

怎么忽然来硬的呢,因为在Linux的世界中,系统是灵活,但是骨架同样重要。

而跟踪确认硬件信息对于我们同样重要。

查看块设备的lsblk

lsblk 命令可以查看系统中的块设备信息

bash 复制代码
$ lsblk

这个命令会列出系统中所有的块设备(比如硬盘、分区和挂载点)的信息。

默认情况下,它会显示每个设备的名称、大小、类型、挂载点等信息。

如果需要显示更详细的信息,可以使用 -a--all 选项:

bash 复制代码
$ lsblk -a

这会显示完整的块设备信息,包括未挂载的设备。

当然,还可以根据需求,定制化输出,不过单单这个命令,足矣。

显示管理磁盘分区 fdisk

fdisk是用于检查一个磁盘上分区信息最通用的命令。

fdisk可以显示分区信息及一些细节信息,比如文件系统类型等。

设备的名称通常是++/dev/sda、/dev/sdb++ 等。

对于以前的设备有可能还存在设备名为 /dev/hd* (IDE)的设备,这个设备逐步淘汰了。

fdisk也可以用于创建并操控分区表信息,支持主任GPU、MBR、Sun、SGI和BSD。

块设备可以划分为一个或多个称为分区的逻辑磁盘。这种划分的记录会保存在分区表,通常位于磁盘的第 0 扇区。

fdisk的官方解释为:

fdisk - manipulate disk partition table

语法格式为:

bash 复制代码
$ fdisk [options] device

$ fdisk -l [device...]

其中一些常用的参数为:

  • -l 列出指定的外围设备的分区表状况
  • -L, --color[=when] :将输出颜色化,其中when可以指定为auto, never or always. 默认为 auto.

显示当前系统的分区情况

这个也是我唯一推荐入门者使用的 命令,仅仅list显示出目前的系统分区。

万万不要输入fdisk执行其他操作,极易格式化硬盘,切记切记。

bash 复制代码
$ fdisk -l
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/sda: 256.1 GB, 256060514304 bytes, 500118192 sectors # 磁盘空间及扇区信息
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: gpt
Disk identifier: FAF37680-0ECE-4BE7-93FC-E87A8F2F6455

显示硬件信息的hwinfo

hwinfo 又一个用于显示硬件信息的命令。

可以获得 Linux 系统的各种硬件组件(如CPU、内存、显卡、硬盘等)的详细信息。

显示所有硬件信息

bash 复制代码
sudo hwinfo

列出系统上几乎所有可用硬件的详细信息。

指定特定硬件信息

bash 复制代码
sudo hwinfo --cpu
sudo hwinfo --memory
sudo hwinfo --gfxcard
sudo hwinfo --disk

通过在命令后添加 --cpu--memory--gfxcard--disk 等参数,获取特定硬件的信息。

列出系统硬件信息的lshw

lshwHardware Lister 的缩写,直面意思即列出系统硬件信息。

可以显示关于计算机硬件组件(如处理器、内存、硬盘、网卡等)的详细信息,对于系统管理员和用户来说是一个非常有用的工具。

显示所有硬件信息

任何参数都不加的话,可用,信息极多,但是可用信息不多。

bash 复制代码
sudo lshw

这将输出系统中所有可用硬件的详细信息,包括硬件组件的制造商、型号、驱动程序等。

查看摘要硬件信息

显示摘要信息:相对而言,这个反而好一些,简单的就是有用的

bash 复制代码
sudo lshw -short

这将显示硬件的摘要信息,包括设备名、类别、描述等。

查看特定硬件信息(如网络、内存、硬盘等设备)

显示指定类型的硬件信息

bash 复制代码
sudo lshw -C network

上述示例将仅显示网络相关的硬件信息。

比如还可以查看memorycpudisk等信息。

lshw提供了全面的硬件信息,帮助用户了解系统配置和硬件组件的细节。在查看和诊断硬件问题或了解系统配置时,它是一个非常有用的工具。

linux中最常用的帮助命令

仅个人想法,会持续不间断更新和改进。

Linux有好几个关于帮助的命令,可以让我们在不上网的情况下获取一些丰硕的信息。

唯一的要求就是英语好一些,唯二的情况就是不确定的情况下在此确认后再执行。

此man非man的意思

首先,这man是什么意思?

最开始很多人认为是不知道这个什么意思,找man呀。

其实man是manual的缩写,也就是手册的意思。

man命令提供了系统命令的详细帮助信息。

Linux 提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可。这个也是每个程序员必备的功能,在没有网络的情况下,man能解决很多问题和疑惑。

看一下官方定义:

Man - format and display the on-line manual pages

man 的格式

如果要读懂并使用man,首先需要了解man命令输出的格式,下面的几个是比较常用且需要注意的:

同时也可以使用man man 查看man的使用方法。

章节 含义
NAME 命令名称及功能简要说明
SYNOPSIS 用法说明,包括可用的选项
DESCRIPTION 命令功能的详细说明,可能包括每一个选项的意义
OPTIONS 每一选项的意义
EXAMPLES 一些使用示例

man的操作

比如输入man ls 后,跳出下面的内容:

LS(1)                                               User Commands                                              LS(1)

NAME
       ls - list directory contents

SYNOPSIS
       ls [OPTION]... [FILE]...

DESCRIPTION
       List  information about the FILEs (the current directory by default).  Sort entries alphabetically if none of
       -cftuvSUX nor --sort is specified.

       Mandatory arguments to long options are mandatory for short options too.

       -a, --all
              do not ignore entries starting with .

       -A, --almost-all
              do not list implied . and ..

       --author
              with -l, print the author of each file

       -b, --escape
              print C-style escapes for nongraphic characters

       --block-size=SIZE
              scale sizes by SIZE before printing them; e.g., '--block-size=M' prints sizes in  units  of  1,048,576
              bytes; see SIZE format below

       -B, --ignore-backups
 Manual page ls(1) line 1 (press h for help or q to quit)

此时可以通过空格键或者回车键来向后翻屏或者翻页,可以使用b 或者k向前查看。

查看关键词时可以使用:

/关键词 向后查找 n:下一个

?关键词 向前查找 N:前一个

可以通过q来退出。

ls后面还有一个(1),详细的解释可以参考《Linux 安装 man 帮助程序》

类似于whatis命令

man有个参数为-f,就是whatis的功能,比如:

bash 复制代码
$ man -f ls cd file cat more less
ls (1)               - list directory contents
ls (1p)              - list directory contents
cd (1)               - bash built-in commands, see bash(1)
cd (1p)              - change the working directory
cd (n)               - Change working directory
file (1)             - determine file type
file (1p)            - determine file type
file (n)             - Manipulate file names and attributes
cat (1)              - concatenate files and print on the standard output
cat (1p)             - concatenate and print files
more (1)             - file perusal filter for crt viewing
more (1p)            - display files on a page-by-page basis
less (1)             - opposite of more
less (3pm)           - perl pragma to request less of something

与whatis命令完全一致

类似于apropos命令

man有个参数为-k,就是apropos的功能,比如:

bash 复制代码
$ man -k  who
at.allow (5)         - determine who can submit jobs via at or batch
at.deny (5)          - determine who can submit jobs via at or batch
btrfs-filesystem (8) - command group of btrfs that usually work on the whole filesystem
docker-trust-signer (1) - Manage entities who can sign Docker images
ipsec_newhostkey (8) - generate a new raw RSA authentication key for a host
ipsec_showhostkey (8) - show host's authentication key
w (1)                - Show who is logged on and what they are doing.
who (1)              - show who is logged on
who (1p)             - display who is on the system
whoami (1)           - print effective userid

与apropos命令完全一致

使用man的小技巧

如果遇到一个不熟悉或者完全不知道的命令,此时可以通过下面的3个步骤来了解:

  1. 首先用man -k command 查询所有类似帮助文件信息,或许有可能就能找到你需要的信息;
  2. 然后man -f command 查询以command开始的相关帮助信息列表
  3. man N command 通过直接定位N获得详细帮助信息

你是干什么的 whatis

其实整个命令已出现,你的脑海里面应该浮现的是:

What is your name?

如题所述,++这个命令用于查询一个命令到底执行了什么功能,并将查询的结果输出出来,++ 相当于man的一个选项-f

whatis的官方定义为:

whatis - display manual page descriptions

仅仅提供一个比较简单的命令描述.

使用方法也比较简单,如下:

bash 复制代码
$ whatis [options] name

其中的name可以是Linux命令、系统调用、库函数、系统等等内容

以前面的命令为例,执行如下所示:

bash 复制代码
$ whatis ls cd file cat more less
ls (1)               - list directory contents
ls (1p)              - list directory contents
cd (1)               - bash built-in commands, see bash(1)
cd (1p)              - change the working directory
cd (n)               - Change working directory
file (1)             - determine file type
file (1p)            - determine file type
file (n)             - Manipulate file names and attributes
cat (1)              - concatenate files and print on the standard output
cat (1p)             - concatenate and print files
more (1)             - file perusal filter for crt viewing
more (1p)            - display files on a page-by-page basis
less (1)             - opposite of more
less (3pm)           - perl pragma to request less of something

可以看到whatis是支持同时查询多个命令的

拓展

whatis可以通过-w-r以及-C等选项来设定通配符、正则表达式以及配置文件等等,不过最简单的还是简单查看一个命令的简单描述,其他的可以交给man来处理。

指定目录的定位 whereis

Linux whereis 命令用于定位查找一个命令的二进制、源文件或帮助文件。

不过这些文件一般是位于特定目录的。

其他的程序定位可以考虑使用locate命令。

官方的定义为:

whereis - locate the binary, source, and manual page files for a command

使用语法

使用语法如下:

bash 复制代码
$ whereis [options] [-BMS directory... -f] name...

其他的选项可以为:

  • -b : 查找二进制文件

  • -m:查找手册

  • -s:查找源文件

  • -B <directory>  在设置的目录下查找二进制文件。

  • -M <directory>  在设置的目录下查找说明文件。

  • -S <directory>  在设置的目录下查找原始代码文件。

实例

比如查找bash的位置,输入如下命令:

bash 复制代码
$ whereis bash
bash: /usr/bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz

可以看到,以上的输出信息从左至右分别为程序名、bash路径、bash的man帮助手册路径。

单独查找文件

可以通过不同的参数来查找不同的文件,如下:

bash 复制代码
# 查找二进制文件
$ whereis -b bash
bash: /usr/bin/bash /etc/bash.bashrc 

# 查找帮助文件
$ whereis -m bash
bash: /usr/share/man/man1/bash.1.gz

# 查找源文件
$ whereis -s bash
bash:

刚刚好合适的 apropos 命令

apropos的中文含义就是++恰好的、合适的++,奈何这个单词或者命令确实不好记,当然是可以扩充词汇量的。

什么时候会用到这个命令呢,先看看这个命令的定义。

apropos 命令的官方定义为:

search the manual page names and descriptions

意思很明显,如果我不记得命令或者不知道该用什么命令的时候,可以通过关键词来索引查找这些命令,比如我们想用linux绘制图像,但是不知道什么命令,测试可以使用:

bash 复制代码
$ apropos plot

bno_plot (1) -- generate interactive 3D plot of IO blocks and sizes 
gnuplot (1) -- an interactive plotting program 
pbmtoplot (1) -- convert a PBM image into a Unix 'plot' file

或许每个人的输出不同,这个主要取决于安装的软件包和索引的数据库。以上。

再来一个实例,这个应该大部分的都类似:

bash 复制代码
$ apropos who

at.allow (5)         - determine who can submit jobs via at or batch
at.deny (5)          - determine who can submit jobs via at or batch
btrfs-filesystem (8) - command group of btrfs that usually work on the whole filesystem
docker-trust-signer (1) - Manage entities who can sign Docker images
ipsec_newhostkey (8) - generate a new raw RSA authentication key for a host
ipsec_showhostkey (8) - show host's authentication key
w (1)                - Show who is logged on and what they are doing.
who (1)              - show who is logged on
who (1p)             - display who is on the system
whoami (1)           - print effective userid

这个命令平时用的不多,跟whatis类似,因为这些功能都被加到了包罗万象的man命令。

Linux最常用的几个命令

​ Linux系统中的命令那是相当地丰富,不同的版本可能还有不同的命令,不过Linux核心自带的命令大概有几百个,这个不管是什么发行版一般都是共用的。

​ 如果希望探索Linux的所有命令,可能不太实际,因为这个数字可能达到惊人的万计。

​ 不过还好的是,Linux命令的入门只要掌握不到100个命令即可,而如果相对而言行云流水的话也就200个命令足矣。

​ 而如果准备试试Linux,可能只需要下面的几个实用频率最高、功能最关键、也最常用的命令也就基本可以完成日常的工作、学习需要了。

​ 忽然想用姓氏排序的方法,不过感觉不太行,索性就大概按照使用率来统计了。

​ 仅个人习惯,会持续不间断更新和改进。

ls 列出当前目录下的文件📃和文件夹📁列表

​ 个人感觉这个命令,属于名副其实用的最多的命令,我们进入Linux的第一个命令,可能除了输入用户名密码就属它了。

​ 工欲善其事,必先利其器,你欲使用Linux,必先了解当前的文件和内容。

不加任何参数

如果不加任何参数,默认列出当前目录的内容。

bash 复制代码
$ ls /etc/sysconfig/network-scripts
ifcfg-em1
ifcfg-em2
ifcfg-em3
ifcfg-em4   
....

使用-l显示更多细节

-l 就是使用long listing format长格式,来显示更多的内容信息。

bash 复制代码
$ ls -l /etc/sysconfig/network-scripts
total 264
-rw-r--r--. 1 root root   341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root   294 May 13  2016 ifcfg-em2
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em3
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em4
......

使用-t按照时间排序

如果希望看到最近创建的文件,就需要用到-t参数了。

bash 复制代码
$ ls -lt /etc/sysconfig/network-scripts/
total 264
-rw-r--r--. 1 root root   341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root   294 May 13  2016 ifcfg-em2
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em4
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em3
...

使用-r按照时间逆序

如果希望删除很早以前的文件,看到最早创建的文件,就需要用到-r参数了。

bash 复制代码
$ ls -ltr /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em3
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em4
-rw-r--r--. 1 root root   294 May 13  2016 ifcfg-em2
-rw-r--r--. 1 root root   341 Nov 30 10:56 ifcfg-em1

使用-S根据文件大小排序

bash 复制代码
$ ls -lS /etc/sysconfig/network-scripts/
total 264
...
-rw-r--r--. 1 root root   341 Nov 30 10:56 ifcfg-em1
-rw-r--r--. 1 root root   294 May 13  2016 ifcfg-em2
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em3
-rw-r--r--. 1 root root   272 May 10  2016 ifcfg-em4

更多内容参考:https://shaoguangleo.github.io/tags/ls/

cd 改变当前的工作目录

这个命令可能估计能排在第二,类似于Winows的双击,在不同目录件徜徉。

在各个文件夹遍历是我们的习惯和倔强的证明。

cd命令没有太多参数,但是有一些技巧所在,可以N多人从来没有用过。

cd直接使用即可,技巧是下面几个:

进入刚才的目录

想要进入刚才进入的地方(目测没有很多人再用,但是真的很好用)运行:

bash 复制代码
$ cd --

快速返回家目录

需要快速地回到你的家目录,输入cd即可,这里其实不用一级一级的进入

bash 复制代码
$ cd

进入某用户的家目录

这个需要你有root权限

bash 复制代码
cd ~username

进入username的家目录。

更多内容参考:https://shaoguangleo.github.io/tags/cd/

mkdir - 创建目录

说到cd到某个目录,就需要提高创建目录,也就新建文件夹。

参数不过,处理默认什么参数也不加,会一个-p递归创建文件夹即可。

创建一个空目录

bash 复制代码
$ mkdir hello

递归创建多个目录

bash 复制代码
$ mkdir -p a/b/c/d/e/f/g

更多内容参考:https://shaoguangleo.github.io/tags/mkdir/

rm - 删除文件

rm 命令用于删除文件或者目录。

这个命令其实我不想把它归为最常用的命令,因为它也是最危险⚠️的命令之一,文件一旦通过rm命令删除❌,则无法恢复,所以必须格外一定切记小心地使用该命令。因为发生过很多欲哭无泪的故事。。。

文件如果少,可以使用-i 删除前逐一询问确认,确认时比较好用;

而下面的两个参数十分残暴,除非百分之两百确认,否则慎用:

  • -f 即使原档案属性设为唯读,也直接删除,无需逐一确认,是force的意思。
  • -r 将目录及里面的子文件逐一删除。

更多内容参考:https://shaoguangleo.github.io/tags/rm/

cp - 复制文件

cp可以实现文件和目录的复制,如果你只会cp a b,或者加上-r来递归目录,那么你还需要挖掘很多呀,比如只复制不存在或者更新的文件。

以下就是cp常用的选项如下所示:

  • i : 覆盖一个已经存在的文件前,提示用户进行确认
  • r:递归地复制目录及其内容,复制目录的时候必须使用这个参数
  • u:只复制不存在或者更新的文件
  • v:复制文件时,显示复制信息

组合rv - 可以拷贝文件或文件夹

这个在显示复制信息的时候,也可以复制目录

bash 复制代码
$ cp -rv dir1/* dir2/
'dir1/a' -> 'dir2/a'
'dir1/b' -> 'dir2/b'
'dir1/c' -> 'dir2/c'
'dir1/d' -> 'dir2/d'

拷贝时提示确认

这个参数在使用rm的时候已经记得使用,不然就像rm -rf /一样,一个公司没有了。

bash 复制代码
$ cp -i dir1/* dir2/
cp: overwrite 'dir2/a'? y
cp: overwrite 'dir2/b'? y
cp: overwrite 'dir2/c'? y

这个选项在文件超级多时候,慎用!!

只拷贝不存在或更新的文件

u表示update,也就是从一个目录拷贝到另外一个目录时,只会复制那些不存在或者目标目录相应文件的更新文件。

执行下面的命令:

bash 复制代码
$ cp -u dir1/* dir2/

可以得到:

bash 复制代码
$ ll *
dir1:
total 0
-rw-rw-r-- 1 user user 0 Jul 20 21:23 a
-rw-rw-r-- 1 user user 0 Jul 20 21:23 b
-rw-rw-r-- 1 user user 0 Jul 20 21:23 c
-rw-rw-r-- 1 user user 0 Jul 20 21:23 d

dir2:
total 0
-rw-rw-r-- 1 user user 0 Jul 20 21:29 a
-rw-rw-r-- 1 user user 0 Jul 20 21:25 b
-rw-rw-r-- 1 user user 0 Jul 20 21:29 c
-rw-rw-r-- 1 user user 0 Jul 20 21:25 d
-rw-rw-r-- 1 user user 0 Jul 20 21:25 e

如何用cp拷贝指定序号的文件

现在有文件夹filename,内有文档,名字是从1.txt, 2.txt, 3.txt 一直到9999.txt,10000.txt,现在希望从第N组数据即N.txt到第M组数据M.txt的文件拷贝到别的文件夹中,方法如下:

bash 复制代码
$ cp {N..M}.txt   newfilename/

这个方法可是相当的赞呀~(≧▽≦)/~,基本可以秒掉大多数的GUI程序了。

更多内容参考:https://shaoguangleo.github.io/tags/cp/

mv - 文件移动或者叫重命名

如果mv的命令还停留在重命名一个文件或者文件夹,那么就花3分钟看一下。

mv能做的还很多。

比如为了防止误删,mv可以提前做个备份;比如为了防止覆盖,可以考虑只有文件较新的时候才移动。

详细如下:

mv几个比较常用的选项如下:

  • -b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份,文件后缀用~表示;
  • -i或--interactive: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作,一般而言,对于不确定的时候可以用此选项,不过文件或文件夹居多时,最好不要用
  • -f或--force: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件,强制的意思force
  • -n或--no-clobber: 不要覆盖任何已存在的文件或目录。
  • -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。

常规操作

bash 复制代码
$ ls
a.txt

$ mv a.txt b.txt

$ ls
b.txt

直接移动或者叫做重命名,文件夹也类似的操作。

覆盖前备份

bash 复制代码
$ ls
a.txt  a.txt~

$ cp -b ../a.txt a.txt

$ ls
a.txt  a.txt~

可以看到此时多了一个备份文件

增量更新

bash 复制代码
$ cp -u a b	

此时的操作为,只有a比b更新或者b不存在的时候,才会进行更新,否则失败。

这个用法多用在:当横向对比两个文价夹有无重要更新的时候才会用到。

交互提示

bash 复制代码
$ cp -i b.txt a.txt
cp:是否覆盖"a.txt"? 

在文件存在的时候,-i选项会进行提示,此时需要输入y才能覆盖,而输入n就会取消这个操作。

更多内容参考:https://shaoguangleo.github.io/tags/mv/

pwd - 查看目录所在的命令

pwd命令的作用是查看当前目录,没有参数,输入后回车即可显示当前绝对路径, 所以pwdP rint W orking Directory第一个字的缩写。

唯二需要了解的参数如下:

  • -L, --logical:打印逻辑路径,与pwd一致
  • -P, --physical:打印物理路径,这里可以从超级链接直达原处

实例展示

此时比如我们进入一个目录,然后在打印出来,如下:

bash 复制代码
$ cd /etc/sysconfig/network-scripts/

$ pwd
/etc/sysconfig/network-scripts

可以看到pwd将输出完全路径

逻辑与物理路径

比如如下:

bash 复制代码
$ pwd
/opt/test

$ ls -l
总用量 1
lrwxrwxrwx  1 root root   14 Jan 15 2012 dir -> source/dir
drwxrwxrwx  1 root root   14 Jan 15 2012 source

可以看到此时的路径在++/opt/test/++ 里面有两个目录++source++ 和++dir++ ,其中++dir++ 链接到++source++里面的dir。

接下来对比一下-L和-P的区别。

bash 复制代码
$ cd dir

$ pwd
/opt/test/dir

$ pwd -L
/opt/test/dir

$ pwd -P
/opt/test/source/dir

从上面的输出可以发现,-P参数会显示文件最原始的路径;而-L则是逻辑上的路径。

更多内容参考:https://shaoguangleo.github.io/tags/pwd/

...

更多信息

Hi,XDJM们,更多信息欢迎移步我的主页或微信公众号letsProgramming.

linux中最常用的网络命令

仅个人想法,会持续不间断更新和改进。

虚虚假假,真真实实,如何快速的去伪存真,抽丝剥茧。

需要在开放的网络世界掌握一些最基础的命令,让自己知己知彼。

查看网络信息的原初 ifconfig

Linux ifconfig命令用于显示或设置网络设备,在调试或调优的时间经常使用。

官方定义为:

ifconfig - configure a network interface

对于这个命令,一般只要掌握如何查看,如何设置IP地址基本就可以了,对于网络钻的比较深的,还需要更多一些参数。

使用方法为:

bash 复制代码
# 显示
$ ifconfig [-v] [-a] [-s] [interface]

# 设置
$ ifconfig [-v] interface [aftype] options | address ...

一些参数的含义为:

  • -a :显示所有网卡的状态,即使是down的状态
  • -s:显示一个短列表
  • interface mtu N 设置最大传输单元【需要管理员权限】
  • netmask addr:设置掩码地址【需要管理员权限】
  • interface up 激活网卡【需要管理员权限】
  • interface down 关闭网卡【需要管理员权限】
  • interface hw ether xx.xx.xx.xx.xx.xx 设置MAC地址【需要管理员权限】

默认无参数使用

如果不指定任何参数,直接显示当前活动的接口,如下:

bash 复制代码
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.123  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x0<global>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 5634431  bytes 4994127142 (4.6 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 858051  bytes 109858013 (104.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device memory 0xc7320000-c733ffff  

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.6.123  netmask 255.255.255.0  broadcast 192.168.6.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 1547215  bytes 92862867 (88.5 MiB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 3230  bytes 922051 (900.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 219608  bytes 105943591 (101.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 219608  bytes 105943591 (101.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

其中一般希望看到的信息包括:

  • inet:为IP地址
  • ether:为MAC地址
  • MTU:最大传输单元

不加任何参数只会显示已经配置并且活跃的网卡信息,如果使用ifconfig -a就可以显示全部的网卡状态了,即使有些网卡是down的状态。

亦或者指定一个++interface++ ,比如上面的eth1,则只输出这个网卡的信息,如下:

bash 复制代码
$ ifconfig eth1

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.6.123  netmask 255.255.255.0  broadcast 192.168.6.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 1547215  bytes 92862867 (88.5 MiB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 3230  bytes 922051 (900.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

-s显示短列表

如果只想看到MTU以及数据包的状态,可以用该参数,如下:

bash 复制代码
$ ifconfig -s
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0     1500   5665450      0      0 0        867639      0      0      0 BMRU
eth1     1500   3489187217   0 101054 0      501260400     0      0      0 BMU
lo       65536  219708       0      0 0        219708      0      0      0 LRU

输出信息主要包含了MTU值,发送及接收的数据情况。

配置IP地址

如下对eth0网卡配置IP地址、掩码以及广播地址,当然可以分布操作

bash 复制代码
# 给eth0配置IP地址
$ ifconfig eth0 192.168.1.123 

# 给eth0配置IP地址和子网掩码
$ ifconfig eth0 192.168.1.123 netmask 255.255.255.0 

# 给eth0配置IP地址、子网掩码还有广播地址
$ ifconfig eth0 192.168.1.123 netmask 255.255.255.0 broadcast 192.168.1.255

修改MTU

在某些情况下可能需要修改MTU值,比如增到到MTU为9000,如下:

bash 复制代码
$ ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.6.123  netmask 255.255.255.0  broadcast 192.168.6.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 1547215  bytes 92862867 (88.5 MiB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 3230  bytes 922051 (900.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# 修改MTU
$ ifconfig eth1 MTU 9000

$ ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9000
        inet 192.168.6.123  netmask 255.255.255.0  broadcast 192.168.6.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 1547215  bytes 92862867 (88.5 MiB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 3230  bytes 922051 (900.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

已经看到输出的信息已经把mtu更新为了9000.

这个值对网络传输影响很大。

启动关闭网卡

启动关闭主要的应用场景为重新设置了IP地址,或者暂时对某个网卡进行操作。

bash 复制代码
# 关闭eth0
$ ifconfig eth0 down

# 启动eth0
$ ifconfig eth0 up

不过需要注意的是

  1. 很多的设置操作都需要管理员权限;
  2. 很多操作在重启后设置都会还原,如果需要永久设置,需要更改++network++的一些配置文件;
  3. ++这个程序基本被淘汰了++ ,已经不在更新,所有的操作或者用法均可以通过ip来搞定。等明天~。

网络中不中,先看ping行不行

linux 系统里面如果想判断网络的好坏,脑海中蹦出的第一个命令就是ping了。

官方定义为:

ping - send ICMP ECHO_REQUEST to network hosts

ping命令基本是最常用的网络命令,它可以用来测试与目标主机的连通性。

ping使用ICMP传输协议,通过发送++ICMP ECHO_REQUEST++数据包到网络主机,并显示返回的相应情况,根据这些信息就可以判断目标主机是否可以访问,在发送的过程中还会有一个时间戳用来计算网络的状态。

不过有些服务器为了防止通过ping探测到,可能会在防火墙或者内核参数中禁止ping命令,这样的话,可能虽然目标主机可以访问,但是无法ping通,所以并不能说ping不通的网络就是不能访问的。

需要注意linux下的ping和windows下的ping稍有区别,linux下ping不会自动终止,需要按ctrl+c终止或者用参数-c指定要求完成的回应次数。

语法

ping的使用说实话挺复杂,挺多的,不过常用的这篇短文基本就够了。

详细如下:

bash 复制代码
# ALL
$ ping  [-aAbBdDfhLnOqrRUvV46]  [-c  count]  [-F  flowlabel]  [-i  interval]  [-I interface] [-l preload] [-m mark] [-M pmtudisc_option] [-N node‐info_option] [-w deadline] [-W timeout] [-p pattern] [-Q tos] [-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp option] [hop ...] destination

# 较常用的选项如下:
$ ping   [-c  count]   [-i  interval]  destination

参数说明

  • -c <完成次数> 设置完成要求回应的次数。

  • -i interval 指定收发信息的间隔时间。

不加任何参数

如果不加任何参数,查看是否ping

bash 复制代码
$ ping www.baidu.com   
PING www.a.shifen.com (115.239.210.27) 56(84) bytes of data.
64 bytes from 115.239.210.27: icmp_seq=1 ttl=52 time=6.06 ms
64 bytes from 115.239.210.27: icmp_seq=2 ttl=52 time=5.56 ms
64 bytes from 115.239.210.27: icmp_seq=3 ttl=52 time=5.67 ms
64 bytes from 115.239.210.27: icmp_seq=4 ttl=52 time=5.82 ms
64 bytes from 115.239.210.27: icmp_seq=5 ttl=52 time=5.70 ms
64 bytes from 115.239.210.27: icmp_seq=6 ttl=52 time=5.79 ms  
^C # 此处输入了Ctrl+C强制退出
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.152/0.159/0.172/0.017 ms

可以看到可以ping通www.baidu.com,时延还算比较OK,几个毫秒量级。

这里看一下几个字段的含义,其中:

56(84) bytes of data:表示默认的数据包长度为56字节;

time=5.56ms:表示响应的时间,值越小,证明连接越快;

TTL=52:TTL是Time To Live的缩写,表示DNS记录在DNS服务器上存在的时间,是IP协议包的一个值,告诉路由器啥时候抛弃这个数据包,(大体上可以通过这个值来判断目标类型的操作系统。)

发送指定数目

可以通过 参数-c 来发送指定数目的包后停止

bash 复制代码
$ ping www.baidu.com -c 5
PING www.a.shifen.com (115.239.211.112) 56(84) bytes of data.
64 bytes from 115.239.211.112: icmp_seq=1 ttl=52 time=6.03 ms
64 bytes from 115.239.211.112: icmp_seq=2 ttl=52 time=5.96 ms
64 bytes from 115.239.211.112: icmp_seq=3 ttl=52 time=5.79 ms
64 bytes from 115.239.211.112: icmp_seq=4 ttl=52 time=5.79 ms
64 bytes from 115.239.211.112: icmp_seq=5 ttl=52 time=6.21 ms

5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 5.791/5.958/6.215/0.186 ms

此时将在发送5次数据包以后自动停止,在Linux里面,如果不加这个参数,是会一直发送运行的。

设定发送时间间隔

可以通过 参数 -i N指定每个++N++ 秒发送一次信息,如下将每隔3秒发送一次ping信息。

bash 复制代码
$ ping www.baidu.com -i 3
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=1 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=2 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=3 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=4 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=5 ttl=55 time=28.6 ms
64 bytes from 14.215.177.38 (14.215.177.38): icmp_seq=6 ttl=55 time=28.6 ms
^C
6 packets transmitted, 6 received, 0% packet loss, time 15041ms
rtt min/avg/max/mdev = 28.650/28.670/28.697/0.139 ms

如上,每隔3秒会发送一次,对于需要持续检测或者记录的可以考虑适当加大这个时间间隔。

注意,只有管理员可以设置小于0.2秒的时间间隔。所以这个数值可以是浮点数~

组合使用

上面的几个例子是可以配合使用的,比如

bash 复制代码
$ ping www.baidu.com -c 4 -i 5 
PING www.a.shifen.com (14.215.177.39) 56(84) bytes of data.
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=1 ttl=55 time=29.4 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=2 ttl=55 time=29.3 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=3 ttl=55 time=29.4 ms
64 bytes from 14.215.177.39 (14.215.177.39): icmp_seq=4 ttl=55 time=29.4 ms

5 packets transmitted, 5 received, 0% packet loss, time 20045ms
rtt min/avg/max/mdev = 29.396/29.428/29.461/0.110 ms

这个例子为:每个5秒查询一次,一共查询4次,然后退出。

Linux ip命令

Linux ip 命令与 ifconfig 命令类似,但比 ifconfig 命令更加强大,主要用于显示或设置网络设备。

已经在Linux 2.2 加入到了内核。所以ip是加强版的网络配置工具,用来替代ifconfig并强化其他功能。

官方定义为:

ip - show / manipulate routing, devices, policy routing and tunnels

对于这个命令,命令集是相当的多。先说一些基础的,其他就要自己摸索了。

使用方法为:

bash 复制代码
$ ip [ OPTIONS ] OBJECT { COMMAND | help }

$ ip [ -force ] -batch filename
   
# OBJECT的取值   
# OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm | netns | l2tp | tcp_metrics | token | macsec }

# OPTIONS的取值  
# OPTIONS := { -V[ersion] | -h[uman-readable] | -s[tatistics] | -d[etails] | -r[esolve] | -iec | -f[amily] { inet | inet6 | ipx | dnet | link } | -4 | -6 | -I | -D | -B | -0 | -l[oops] { maximum-addr-flush-attempts } | -o[neline] | -rc[vbuf] [size] | -t[imestamp] | -ts[hort] | -n[etns] name | -a[ll] | -c[olor] }

COMMAND 的值主要取决于OBJECT ,可能有所不同,一般可以使用adddeleteshow(或者list),均可以输入help来进行查询。

OBJECT中常用的为:

  • link 网络设备
  • address 设备上的协议地址
  • -s, -stats, -statistics 统计化输出

显示网络设备

bash 复制代码
# 显示网络设备
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN mode DEFAULT group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

# 显示IP等更多信息
$ ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.123/24 brd 192.168.254.255 scope global noprefixroute eno1
       valid_lft forever preferred_lft forever
    inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

命令中的show为默认,也可以直接使用ip link或者ip address,结果一致。

设置IP地址

可以通过ip addr add/del xxx.xxx.xxx.xxx dev interface 来设置或者删除IP地址。

如下设置or删除eth0的IP地址。

bash 复制代码
# 设置IP地址
$ ip addr add 192.168.0.1/24 dev eth0 

# 删除IP地址
$ ip addr del 192.168.0.1/24 dev eth0 

启动关闭网卡

与ifconfig类似,也使用up与down来进行启动和关闭,具体如下:

bash 复制代码
# 开启网卡
$ ip link set eth0 up             

# 关闭网卡
$ ip link set eth0 down           

统计方便阅读

选项-s可以统计一些信息方便我们阅读,如下看看网络的情况:

bash 复制代码
$ ip -s link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    RX: bytes  packets  errors  dropped overrun mcast   
    871883256468 251700492 0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    871883256468 251700492 0       0       0       0       
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast   
    64930085920632 50955323447 0       613156  0       472190933 
    TX: bytes  packets  errors  dropped carrier collsns 
    17534345850354 17448077191 0       0       0       0       
3: eno2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq state DOWN mode DEFAULT group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast   
    0          0        0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    0          0        0       0       0       0  

可以看到对输出进行了一些格式化,看起来更直观。

探索网络连接的netstat

在Linux系统中,网络是至关重要的部分,而netstat命令是管理和监视网络连接的强大工具之一。

它提供了关于网络接口和路由表的详细信息,有助于了解网络连接状态、统计信息以及网络协议的使用情况。

也更方便我们对网络的管理、故障排除以及安全监控等等。

基本概述

netstat命令比较简单,通过简单的参数组合,可以获得各种网络相关的信息。

以下是一些常用的参数及其功能:

  • -a:显示所有连接和监听端口。
  • -t:仅显示TCP连接。
  • -u:仅显示UDP连接。
  • -n:以数字形式显示地址和端口号。
  • -p:显示进程标识符和程序名称。
  • -r:显示路由表。
  • -s:显示统计信息。

非交互的下载工具 wget

Linux系统中的wget是一个下载文件📀的命令行工具,特别普遍 。

对于Linux用户是必不可少的工具,对于经常要下载一些软件或从远程服务器恢复备份到本地服务器,这个命令尤为重要。

wget支持很多协议,比如HTTPHTTPSFTP协议,还可以使用HTTP代理。

wget的有诸多特点,比如

  • 自动下载 wget支持自动下载,即wget可以在用户退出系统的之后在后台执行。这意味着你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,这是个牛气冲天的功能。
  • 完全重建 wget 可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作"递归下载"。在递归下载的时候,wget 遵循Robot Exclusion标准(/robots.txt). wget可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。
  • 高稳定 wget 非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget会不断地尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

命令格式

bash 复制代码
$ wget [参数] [URL地址]

用于从网络上下载资源,没有指定目录,下载资源会默认为当前目录。wget虽然功能强大,但是使用起来还是比较简单:

使用范例

wget的命令参数很多,不过常用的为下面几个,详细的可以看进阶。

使用wget下载单个文件

比如,我们下载个Ubuntu的最新版本,试下效果如何

bash 复制代码
$ wget http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

在下载的过程中会显示进度条,包含(下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间)。

使用wget -O下载并以不同的文件名保存

这个对于动态链接的下载比较有用,特别是有些文件的名字实在是太...长了

bash 复制代码
$ wget -O wordpress.zip http://www.ubuntu.com/download.aspx?id=1234
使用wget -c断点续传
bash 复制代码
$ wget -c http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

# or

$ wget --continue http://releases.ubuntu.com/16.04/ubuntu-16.04-desktop-amd64.iso

使用wget -c重新启动下载中断的文件,对于我们下载大文件时突然由于网络等原因中断非常有帮助,我们可以继续接着下载而不是重新下载一个文件。需要继续中断的下载时可以使用-c参数。

使用wget -o把下载信息存入日志文件
bash 复制代码
$ wget -o download.log URL

不希望下载信息直接显示在终端而是在一个日志文件,可以使用,特别注意需要与-O来区分开~

Linux中最常用的搜索命令

仅个人想法,会持续不间断更新和改进。

在Linux的庞大世界中,搜索犹如明灯,可以拨开云雾见青天,照亮我们前行大道路。

无论你是在浩瀚的代码库中搜索一个特定的函数,还是在庞大的文件系统中寻找一个文件,搜索命令着实是不可或缺尤为重要的工具。

而其中最绕不开的当属以下几个。

一切皆可查的 find

find命令用来在指定目录下查找文件,功能相当之强大。

官方定义为:

find - search for files in a directory hierarchy

Linux的哲学是一切皆文件 ,那么find的使命就是一切皆可查

语法

使用语法为:

bash 复制代码
$ find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

比较常用的几个参数为:

  • -exec <执行指令>:假设find指令的回传值为True,就执行该指令;
  • -size <文件大小>:查找符合指定的文件大小的文件;
  • -mtime <24小时>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
  • -type <文件类型>:只寻找符合指定的文件类型的文件;

无参数

如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部进行显示。

bash 复制代码
$ ls -l
total 310M
-rw-rw-r-- 1 user user  10M Mar 21 20:01 a
drwxrwxr-x 2 user user   22 Mar 21 20:01 aa
-rw-rw-r-- 1 user user 100M Mar 21 20:01 b
-rw-rw-r-- 1 user user 200M Mar 21 20:01 c


$ find 
.
./a
./b
./c
./test

查找小于,等于和大于100MB的文件

通过-size大小来查找文件

bash 复制代码
$ find . -size -100M
.
./a
./aa
$ find . -size 100M
./b
$ find . -size +100M
./c
./aa/d

查找多长时间修改过

可以通过参数-mtime来查找文件的修改时间,比如如下可以查找当前目录下最近60天没有被修改的文件。

bash 复制代码
$ find . -mtime +60

# 最近2天以内未修改
$ find . --mtime -2

稍微复杂但是很有用的命令

我经常把 find 命令和他的选项 exec一起使用,比如我想查找一个目录中的所有文件并将其更改其权限。可以通过以下简单命令完成:

bash 复制代码
$ find /path/ -type f -exec chmod 644 {} \;

这个命令会递归搜索指定目录内++/path/++ 下的所有文件,并对找到的文件执行 chmod 命令。

精准快速定位的locate

... note::

众里寻他千百度,蓦然回首,那人却在灯火阑珊处

Linux locate命令用于查找符合条件的文档、程序、目录等等。这个命令会在数据库中查找符合条件的各种信息。

一般情况我们只需要输入 locate name 即可查找。

官方定义为:

locate - list files in databases that match a pattern

使用方法为:

bash 复制代码
$ locate  [-d  path  |  --database=path]  [-e  | -E | --[non-]existing] [-i | --ignore-case] [-0 | --null] [-c |
       --count] [-w | --wholename] [-b | --basename] [-l N | --limit=N] [-S | --statistics] [-r | --regex ] [--regex‐
       type  R] [--max-database-age D] [-P | -H | --nofollow] [-L | --follow] [--version] [-A | --all] [-p | --print]
       [--help] pattern...

看着很复杂,不过常用的参数倒是不多,基本为:

  • -n : 至多显示 n个输出。
  • -i, --ignore-case : 忽略大小写

默认无参数

默认情况下,locate直接跟上需要查找的信息就可以了,如下所示:

bash 复制代码
$ locate set_vis.cpp
/home/user/mycode/src/set_vis.cpp

# 以查找apropos为例
$ locate apropos
/usr/bin/apropos
/usr/local/difmap/help/apropos.hlp
/usr/share/emacs/24.3/lisp/apropos.elc
/usr/share/man/de/man1/apropos.1.gz
/usr/share/man/es/man1/apropos.1.gz
/usr/share/man/fr/man1/apropos.1.gz
/usr/share/man/id/man1/apropos.1.gz
/usr/share/man/it/man1/apropos.1.gz
/usr/share/man/ja/man1/apropos.1.gz
/usr/share/man/man1/apropos.1.gz
/usr/share/man/nl/man1/apropos.1.gz
/usr/share/man/pl/man1/apropos.1.gz
/usr/share/man/ru/man1/apropos.1.gz

太多需要简单化

如果输出的信息很多,仅仅希望看到前面的几个,使用-n参数既可

bash 复制代码
# 仅仅查看前的3个
$ locate -n 3 apropos
/usr/bin/apropos
/usr/local/difmap/help/apropos.hlp
/usr/share/emacs/24.3/lisp/apropos.elc

不区分大小写

部分情况下,可能有大小写混淆的情况,此时使用-i参数既可

bash 复制代码
$ $ locate -i set_vis.cpp
/home/user/mycode/src/set_vis.cpp
/home/user/mycode_CPP/src/set_VIS.cpp

说明

不过刚按照的系统,这个命令并不一定有输出,主要是因为locatefind 不同, find 直接在硬盘找,而locate 只在数据库中查找。

这个数据库在CentOS系统默认的为 ++/var/lib/mlocate/mlocate.db++ 中,所以 locate 的查找会比较快,但并一定是实时的,而是以数据库的更新为准。

可以通过下面的命令手工升级数据库 ,命令为:

bash 复制代码
$ updatedb

然后就可以使用了。

文件内容搜索利器 - grep

Linux grep 命令用于查找文件里符合条件的字符串。

官方定义为:

grep, egrep, fgrep - print lines matching a pattern

grep支持正则表达式,是一个强大的文本搜索工具。

语法

语法也挺复杂,因为功能确实很强大。

bash 复制代码
$ grep [OPTION...] PATTERNS [FILE...]
$ grep [OPTION...] -e PATTERNS ... [FILE...]      # 使用egrep
$ grep [OPTION...] -f PATTERN_FILE ... [FILE...]  # 使用fgrep

常用的参数为:

  • -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同
  • -v 或 --invert-match : 显示不包含匹配文本的所有行
  • -i 或 --ignore-case : 忽略字符大小写的差别
  • -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。

假定有如下3个文件,1个文件夹,内容如下:

a
    This is a
    Hello a
    
b 
    this is b
    Hello b
c 
    This is c
    Hello c

d/d 
    This is d
    Hello d

默认无参数

在当前目录搜索包含is 字符串,可以看到**++a/b/c++ **三个文件均有输出,而++d++因为是目录,暂时无输出。

bash 复制代码
$ grep is *
a:This is a
b:this is b
c:This is c
grep: d: Is a directory

增加文件夹

与其他命令类似,增加-r参数,递归搜索

bash 复制代码
$ grep -r is *
a:This is a
b:this is b
c:This is c
d/d:This is d

反向查找

在某些情况下,或许正想找到不包含某些字符串的内容,如下:

bash 复制代码
$ grep -rv is *
a:Hello a
b:Hello b
c:Hello c
d/d:Hello d

此时可以看到,不包含is的内容显示了出来。

不区分大小写

而某些情况下,或许我们希望找到不区分大小写的内容,比如对于++This/this++而言:

bash 复制代码
$ grep -r This *
a:This is a
c:This is c
d/d:This is d

$ grep -ri This *
a:This is a
b:this is b
c:This is c
d/d:This is d

可以看到此时有可能笔误,或者其他原因的b文件已经被找到了。

显示行数,精准定位

如果文件内容比较多,此时显示内容在哪一行,是很重要的,加上-n参数既可解决。

bash 复制代码
$ grep -rn This *
a:1:This is a
c:1:This is c
d/d:1:This is d

Linux最常用的几个系统管理命令

仅个人想法,会持续不间断更新和改进。

看看网络,确认一下目前的状态,看看有没有异常进程。

查看网络信息的原初 ifconfig

Linux ifconfig命令用于显示或设置网络设备,在调试或调优的时间经常使用。

官方定义为:

ifconfig - configure a network interface

对于这个命令,一般只要掌握如何查看,如何设置IP地址基本就可以了,对于网络钻的比较深的,还需要更多一些参数。

使用方法为:

bash 复制代码
# 显示
$ ifconfig [-v] [-a] [-s] [interface]

# 设置
$ ifconfig [-v] interface [aftype] options | address ...

一些参数的含义为:

  • -a :显示所有网卡的状态,即使是down的状态
  • -s:显示一个短列表
  • interface mtu N 设置最大传输单元【需要管理员权限】
  • netmask addr:设置掩码地址【需要管理员权限】
  • interface up 激活网卡【需要管理员权限】
  • interface down 关闭网卡【需要管理员权限】
  • interface hw ether xx.xx.xx.xx.xx.xx 设置MAC地址【需要管理员权限】

默认无参数使用

如果不指定任何参数,直接显示当前活动的接口,如下:

bash 复制代码
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.123  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x0<global>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 5634431  bytes 4994127142 (4.6 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 858051  bytes 109858013 (104.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device memory 0xc7320000-c733ffff  

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.6.123  netmask 255.255.255.0  broadcast 192.168.6.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 1547215  bytes 92862867 (88.5 MiB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 3230  bytes 922051 (900.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 219608  bytes 105943591 (101.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 219608  bytes 105943591 (101.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

其中一般希望看到的信息包括:

  • inet:为IP地址
  • ether:为MAC地址
  • MTU:最大传输单元

不加任何参数只会显示已经配置并且活跃的网卡信息,如果使用ifconfig -a就可以显示全部的网卡状态了,即使有些网卡是down的状态。

亦或者指定一个++interface++ ,比如上面的eth1,则只输出这个网卡的信息,如下:

bash 复制代码
$ ifconfig eth1

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.6.123  netmask 255.255.255.0  broadcast 192.168.6.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 1547215  bytes 92862867 (88.5 MiB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 3230  bytes 922051 (900.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

-s显示短列表

如果只想看到MTU以及数据包的状态,可以用该参数,如下:

bash 复制代码
$ ifconfig -s
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0     1500   5665450      0      0 0        867639      0      0      0 BMRU
eth1     1500   3489187217   0 101054 0      501260400     0      0      0 BMU
lo       65536  219708       0      0 0        219708      0      0      0 LRU

输出信息主要包含了MTU值,发送及接收的数据情况。

配置IP地址

如下对eth0网卡配置IP地址、掩码以及广播地址,当然可以分布操作

bash 复制代码
# 给eth0配置IP地址
$ ifconfig eth0 192.168.1.123 

# 给eth0配置IP地址和子网掩码
$ ifconfig eth0 192.168.1.123 netmask 255.255.255.0 

# 给eth0配置IP地址、子网掩码还有广播地址
$ ifconfig eth0 192.168.1.123 netmask 255.255.255.0 broadcast 192.168.1.255

修改MTU

在某些情况下可能需要修改MTU值,比如增到到MTU为9000,如下:

bash 复制代码
$ ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.6.123  netmask 255.255.255.0  broadcast 192.168.6.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 1547215  bytes 92862867 (88.5 MiB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 3230  bytes 922051 (900.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# 修改MTU
$ ifconfig eth1 MTU 9000

$ ifconfig eth1
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9000
        inet 192.168.6.123  netmask 255.255.255.0  broadcast 192.168.6.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 1547215  bytes 92862867 (88.5 MiB)
        RX errors 0  dropped 6  overruns 0  frame 0
        TX packets 3230  bytes 922051 (900.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

已经看到输出的信息已经把mtu更新为了9000.

这个值对网络传输影响很大。

启动关闭网卡

启动关闭主要的应用场景为重新设置了IP地址,或者暂时对某个网卡进行操作。

bash 复制代码
# 关闭eth0
$ ifconfig eth0 down

# 启动eth0
$ ifconfig eth0 up

不过需要注意的是

  1. 很多的设置操作都需要管理员权限;
  2. 很多操作在重启后设置都会还原,如果需要永久设置,需要更改++network++的一些配置文件;
  3. ++这个程序基本被淘汰了++ ,已经不在更新,所有的操作或者用法均可以通过ip来搞定。等明天~。

显示进程状态 ps

ps命令是"process status"的缩写,类似于 windows 的任务管理器
ps命令用于显示当前系统的进程状态。

通常搭配kill指令随时中断、删除不必要的程序。

同时呢,ps命令是非常强大的进程查看命令,可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分【Windows】任务管理器的信息都是可以通过执行该命令得到的。

语法

bash 复制代码
$ ps [参数]

常用参数

  • -A 列出所有的行程
  • -w 显示加宽可以显示较多的资讯
  • -au显示较详细的资讯
  • -aux显示所有包含其他使用者的行程

其中aux的输出信息如下所示:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
  • USER: 行程拥有者
  • PID: pid
  • %CPU: 占用的 CPU 使用率
  • %MEM: 占用的内存使用率
  • VSZ: 占用的虚拟内存大小
  • RSS: 占用的内存大小
  • TTY: 终端的minor装置号码
  • STAT: 该行程的状态:
  • START: 行程开始时间
  • TIME: 执行的时间
  • COMMAND:所执行的指令

几个实例

默认情况
bash 复制代码
$ ps
  PID TTY          TIME CMD
44965 pts/0    00:00:00 bash
56519 pts/0    00:00:00 ps

什么参数都不跟的话,基本输出没啥用处。

显示所有进程

通常情况下,最常用的为把所有进程显示出来:

bash 复制代码
$ ps -aux
$ ps -A    

把所有进程显示出来,并输出到ps.txt文件:

bash 复制代码
$ ps -aux > ps.txt
查找特定进程信息

大部分情况下,希望查找有问题的进程或者感兴趣的进程,使用管道如下:

bash 复制代码
 $ ps -aux | grep ssh
 root       1303  0.0  0.0  82468  1204 ?        Ss   Apr17   0:00 /usr/sbin/sshd
 root       3260  0.0  0.0  52864   572 ?        Ss   Apr17   0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"
 root      24188  0.0  0.0 112652   956 pts/0    S+   11:39   0:00 grep --color=auto ssh

任务管理器的 top

top命令比较像Windows里面的任务管理器,提供一个动态实时的系统状态检测,可以检测实时显示内存、CPU、进程的运行状态,主要在分析系统负载的时候比较常用。

官方定义为:

top - display Linux processes

状态默认实时显示,间隔为1秒。

使用的方法如下(选项超级多,其实不复杂):

bash 复制代码
$ top -bcHiOSs -d secs -n max -u|U user -p pid -o fld -w [cols]

参数说明

  • -d : 改变显示的更新速度,或是在交互式( ++interactive command++ )按 sd
  • -c : 切换显示模式,共有两种模式,一是只显示执行程序的名称,另一种是显示完整的路径与名称;这个在定位执行命令的时候较常用
  • -n : 更新的次数,完成后将会退出
  • -b : 批模式操作,主要用来将 top 的结果输出到其他程序或者文件;
  • -i : 不显示任何闲置不使用CPU的进程
  • -s : 安全模式,取消交谈式指令
  • -pN1 -pN2 ... or -pN1,N2,N3 ...:指定PID模式,仅仅监控N1,N2等信息
  • -u/U user:仅仅关注user的进程情况

常规使用

在输入top命令以后,如果希望退出,可以数据q 或者直接Ctrl+c即可。

还有一个情况,可以输入h进行帮助查询,用于进一步的交互操作。

通常情况下,最常用的就是输入top命令,不加任何参数,这种情况下最希望看到的就是最占用系统资源的进程。

如下所示:

bash 复制代码
$ top

top - 22:23:20 up 461 days,  7:52, 18 users,  load average: 1.82, 1.57, 1.45
Tasks: 773 total,   1 running, 768 sleeping,   0 stopped,   4 zombie
%Cpu(s): 10.1 us,  6.5 sy,  0.0 ni, 83.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 32664832 total,   668020 free, 15683576 used, 16313236 buff/cache
KiB Swap: 16449532 total, 13409776 free,  3039756 used. 15787188 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                               
 7965 dbus      20   0   76092   8456   1704 S   7.5  0.0  40307:04 dbus-daemon                                                                                                                  
23460 root      20   0  397640   5560   3248 S   4.2  0.0   4738:26 accounts-daemon                                                                       
 4321 user       20   0  821828 104812   4584 S   3.2  0.3   7380:28 gsd-color                                    

此时可以看到系统的基本信息,可以看到分为三个部分:

  1. 汇总信息:可以看到系统的运行状态,总的负载信息,运行总的任务,登陆的用户,CPU及内存的状态等等。
  2. Fields/Columns 头信息:用来标记接下来所有进程对应的信息
  3. Task 区域:每个运行程序的各种信息,在Fields/Columns有对应的,比如PID、用户、占用CPU、MEM及对应的命令等等。

显示完整命令

bash 复制代码
$ top -c

7965 dbus      20   0   76092   8456   1704 S   7.5  0.0  40307:04 /usr/bin/dbus-daemon  

此时省去其他信息,可以看到dbus-daemon增加了路径信息为**/usr/bin/dbus-daemon**

设置信息更新次数

这个命令用于定量显示,比如刷新10次后退出,如下:

bash 复制代码
$ top -n 10

设置信息更新时间

如果觉得太长或者太短,可以通过-d来设置,或者在交互模式下输入d或者s来设置。

bash 复制代码
$ top -d 0.8 # 设置为0.8秒

$ top -d 6 # 设置为6秒

显示指定的进程信息

如果仅仅对某个进程感兴趣,如下指定PID即可。

bash 复制代码
$ top -p 1234 # 对进程1234感兴趣

指定用户的进程信息

作为管理员or朋友,或许对某个用户感兴趣,比如user,此时可以仅仅显示该用户的进程信息

bash 复制代码
$ top -u user

linux中最常用的用户信息命令

仅个人想法,会持续不间断更新和改进。

用户信息,重中之重。

虽然21世纪最重要的是人才。

但对于我们个人而言,用户信息也是极其重要并特别需要留意的。

还有谁 last

Linux last 命令用于显示用户最近的登录信息。

官方定义为:

last, lastb - show listing of last logged in users

通过读取++/var/log/wtmp++文件来获取这些信息。

语法

bash 复制代码
$ last [-R] [-num] [ -n num ] [-adFiowx] [ -f file ] [ -t YYYYMMDDHHMMSS] [name...]  [tty...]

参数

  • -R 省略 hostname 的栏位

  • -n 展示前 num 个

  • username 展示 username 的登入讯息

  • tty 限制登入讯息包含终端机代号

一般使用方法

bash 复制代码
$ last
username2  pts/17       192.168.100.123  Wed Mar 23 22:14   still logged in
username3  pts/20       localhost:11.0   Wed Mar 23 14:26 - 15:48  (01:21)
username4  pts/23       localhost:11.0   Wed Mar 23 14:26 - 15:48  (01:21)
username4  pts/4        192.168.100.125    Thu Jun 10 18:37 - 22:57  (04:20)
username5  pts/4        192.168.100.125    Thu Jun 10 18:21 - 18:21  (00:00)
username6  pts/9        192.168.100.126    Thu Jun 10 18:11 - 18:20  (00:09)
username7  pts/15       192.168.100.122    Thu Jun 10 18:04 - 23:44 (1+05:40)
username8  pts/14       192.168.100.121    Thu Jun 10 17:59 - 07:50  (13:50)
username9  pts/9        192.168.100.126    Thu Jun 10 17:59 - 18:03  (00:04)

wtmp begins Thu Jun 10 17:33:14 2013

查看最近登陆的三个用户

bash 复制代码
$ last -3

username2  pts/17       192.168.100.123  Wed Mar 23 22:14   still logged in
username3  pts/20       localhost:11.0   Wed Mar 23 14:26 - 15:48  (01:21)
username4  pts/23       localhost:11.0   Wed Mar 23 14:26 - 15:48  (01:21)

wtmp begins Thu Jun 10 17:33:14 2013

省略hostname

bash 复制代码
$ last -3 -R
username2  pts/17         Wed Mar 23 22:14   still logged in
username3  pts/20         Wed Mar 23 14:26 - 15:48  (01:21)
username4  pts/23         Wed Mar 23 14:26 - 15:48  (01:21)

wtmp begins Thu Jun 10 17:33:14 2013

显示最后一列显示主机IP地址

bash 复制代码
$ last -n 5 -a -i
username3  pts/17       Wed Mar 23 22:14   still logged in    192.168.100.123
username5  pts/20       Wed Mar 23 14:26 - 15:48  (01:21)     0.0.0.0
username6  pts/23       Wed Mar 23 14:26 - 15:48  (01:21)     0.0.0.0
username7  pts/19       Wed Mar 23 13:46 - 15:48  (02:01)     192.168.100.123
username8  pts/17       Wed Mar 23 13:18 - 15:47  (02:29)     192.168.100.123

wtmp begins Thu Jun 10 17:33:14 2013

我是谁 whoami

我知道你是谁,但我不知道我是谁,此时whoami可以帮助你,哈哈。

whoami将打印当前用户的名字。与id -un类似。

官方定义为:

whoami - print effective userid

用法为:

bash 复制代码
$ whoami [option] ..

这命令,基本没有参数。

我暂时。。也没有想到为什么会有这个命令。

唯一的可能使你找管理员来配置个啥,然后他需要知道你是谁,不,我是谁。

我看了一下源码,果然简洁:

c 复制代码
#include <config.h>
#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>

#include "system.h"
#include "die.h"
#include "error.h"
#include "long-options.h"
#include "quote.h"

/* The official name of this program (e.g., no 'g' prefix).  */
#define PROGRAM_NAME "whoami"

#define AUTHORS proper_name ("Richard Mlynarik")

void
usage (int status)
{
  if (status != EXIT_SUCCESS)
    emit_try_help ();
  else
    {
      printf (_("Usage: %s [OPTION]...\n"), program_name);
      fputs (_("\
Print the user name associated with the current effective user ID.\n\
Same as id -un.\n\
\n\
"), stdout);
      fputs (HELP_OPTION_DESCRIPTION, stdout);
      fputs (VERSION_OPTION_DESCRIPTION, stdout);
      emit_ancillary_info (PROGRAM_NAME);
    }
  exit (status);
}

int
main (int argc, char **argv)
{
  struct passwd *pw;
  uid_t uid;
  uid_t NO_UID = -1;

  initialize_main (&argc, &argv);
  set_program_name (argv[0]);
  setlocale (LC_ALL, "");
  bindtextdomain (PACKAGE, LOCALEDIR);
  textdomain (PACKAGE);

  atexit (close_stdout);

  parse_gnu_standard_options_only (argc, argv, PROGRAM_NAME, PACKAGE_NAME,
                                   Version, true, usage, AUTHORS,
                                   (char const *) NULL);

  if (optind != argc)
    {
      error (0, 0, _("extra operand %s"), quote (argv[optind]));
      usage (EXIT_FAILURE);
    }

  errno = 0;
  uid = geteuid ();
  pw = (uid == NO_UID && errno ? NULL : getpwuid (uid));
  if (!pw)
    die (EXIT_FAILURE, errno, _("cannot find name for user ID %lu"),
         (unsigned long int) uid);
  puts (pw->pw_name);
  return EXIT_SUCCESS;
}

其中使用的即为uid = geteuid ();

谁?who

... note::

物是人非事事休,欲语泪先流。

李清照《武陵春·春晚》

知道了我是谁,接下来就要知道谁是谁了。

who将显示谁在登录,显示的内容可能包括用户名、终端登录口,登录的时间等等信息。

官方定义为:

who - show who is logged on

用法为:

bash 复制代码
$ who [OPTION]... [ FILE | ARG1 ARG2 ]

常用的参数为:

  • -q , --count:只显示登入系统的帐号名称和总人数;
  • -s:此参数将忽略不予处理,仅负责解决who指令其他版本的兼容性问题;
  • -a, --all:效果为加上 -b -d --login -p -r -t -T -u
  • -b, --boot:上一次系统的重启时间
  • -d, --dead:打印dead进程
  • -H, --heading:打印每一列的表头
  • -q, --count:所有登录的用户名以及用户登录的数量
  • -s, --short:打印USER/LINE/WHEN(默认为这个参数)

默认使用

显示当前登录系统的用户

bash 复制代码
$ who       
user      pts/0  2012-03-02 10:12 
user2     pts/1  2012-03-10 09:12

系统的运行时间

这个信息显示系统自上一次重启后的运行时间。

bash 复制代码
$ who -b
			system boot 2012-02-16 14:05

显示表头信息

使用-H或者--heading可以看到表头信息

bash 复制代码
$ who -H
USER     LINE     WHEN         
user      pts/0  2012-03-02 10:12 
user2     pts/1  2012-03-10 09:12

显示登录的人员及总数

bash 复制代码
$ who -q
user1 user1 user2 user2 user3 user4
# users=6

什么?谁?w (who & what)

w可以认为是加强版的who,果然越简洁越强大,就比如lessmore是功能更多的。

w不仅可以显示谁在登录,还可以打印他们在做什么。w显示的信息如下:

  • 登录的用户;
  • 运行的程序;
  • 第一行显示的信息:当前时间、系统运行的时间、多少用户登录、系统的负载(分贝为1,5,15分钟)

官方定义为:

w - Show who is logged on and what they are doing.

用法为:

bash 复制代码
$ w [options] user [...]

常用的两个选项为:

  • -h  不显示各栏位的标题信息列。

  • -s  简洁格式列表,不显示用户登入时间,JCPU或者PCPU的时间

默认的显示

显示当前用户的登录信息及执行的命令

bash 复制代码
$ w
16:29:03 up 26 days,  2:49, 6 users,  load average: 1.00, 0.97, 0.96
USER     TTY      FROM LOGIN@   IDLE   JCPU   PCPU WHAT
user     pts/4    :1   07Sep21 20days  9:59   1:53m bash
user     pts/0    :2   08Sep21  6days  0.70s  1:53m zsh
user     pts/1    :3   08Sep21 20days  1:13m  1:53m bash
user      :0      :0   15Sep21 6days  27days 21.36s zsh
user     pts/2    :0   15Sep21 14days  0.25s  0.25s zsh
user     pts/3    :3   16Sep21 24:45m  0.22s  0.22s bash

不显示标题行

bash 复制代码
$ w -h
16:29:16 up 26 days,  2:49, 6 users,  load average: 1.20, 0.67, 0.76
USER     TTY      FROM  LOGIN@   IDLE   JCPU   PCPU WHAT
user     pts/4    :1    07Sep21 20days  9:59   1:53m bash
user     pts/0    :2    08Sep21  6days  0.70s  1:53m zsh
user     pts/1    :3    08Sep21 20days  1:13m  1:53m bash
user      :0      :0    15Sep21 6days  27days 21.36s zsh
user     pts/2    :0    15Sep21 14days  0.25s  0.25s zsh
user     pts/3    :3    16Sep21 24:45m  0.22s  0.22s bash

简洁模式显示

bash 复制代码
$ w -s
16:29:26 up 26 days,  2:49, 6 users,  load average: 1.50, 0.67, 0.36
USER     TTY      FROM    IDLE   WHAT
user     pts/4    :1     20days  bash
user     pts/0    :2      6days  zsh
user     pts/1    :3     20days  bash
user      :0      :0     6days   zsh
user     pts/2    :0     14days  zsh
user     pts/3    :3     24:45m  bash

不要告诉别人的passwd

passwd用于创建或者更新用户密码,是管理员必备的命令之一。

这个命令最终的实现是通过调用Linux-PAM 和Libuser API来实现的。

官方的定义为:

passwd - update user's authentication tokens

使用的方法为:

bash 复制代码
$ passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]

其中很常用的options为:

  • -S, --status:显示密码的状态信息
  • -d, --delete:删除用户密码,此时该用户将处于无密码状态

不太常用的options为:

  • --stdin:可以通过标准输入,亦可以为一个pipe
  • -l, --lock:锁定账号,不过也不是完全锁定,因为用户可以通过ssh key来继续访问
  • -u, --unlock:与上面的-l选项相反,属于解锁用户
  • -w, --warning DAYS:口令到期前通知用户,具备password lifetime的才支持

修改或更新密码

这个是最常用的用法,用于设置或者修改更新用户密码

bash 复制代码
$ sudo passwd user  		#设置用户user的密码
Enter new UNIX password:  	#输入新密码,输入的密码不显示
Retype new UNIX password:  	#再次输入确认密码
passwd: password updated successfully
# 此时设置成功

删除用户密码

bash 复制代码
$ sudo passwd -d user 
passwd: password expiry information changed.

此时用户处于无密码的状态,很类似最近说的,没有密码就是最安全的密码。

查看密码的状态

bash 复制代码
$ sudo passwd -S user
[sudo] password for oper: 
user PS 2013-02-11 0 99999 7 -1 (Password set, SHA512 crypt.)

说到密码,有两个比较重要的原则

  1. 保护好你的密码,不写下来而是记在脑海里,定时修改;
  2. 选择一个很难猜的密码,而不是最容易被攻破的top密码;
相关推荐
畅联云平台19 分钟前
美畅物联丨如何通过视频汇聚平台汇聚视频并推送至上级28181平台
服务器·网络·音视频
soragui40 分钟前
【Ubuntu】如何轻松设置80和443端口的防火墙
linux·运维·ubuntu
Amd7941 小时前
在不同操作系统上安装 PostgreSQL
linux·windows·macos·postgresql·操作系统·数据库管理·安装指南
Tony11541 小时前
VMwareWorkstation虚拟机安装Rocky8.10系统详细教程
linux·虚拟机
网络安全queen1 小时前
【D03】SNMP、NETBIOS和SSH
运维·网络·web安全·ssh
march of Time1 小时前
centos系统如何安装kubectl和部署kube-apiserver
linux·运维·centos
꧁༺朝花夕逝༻꧂1 小时前
nginx-代理服务
运维·服务器·nginx
time_silence1 小时前
微服务——不熟与运维
运维·微服务·架构
Smile_Gently1 小时前
Ubuntu环境 nginx.conf详解(二)
运维·服务器·前端·nginx·ubuntu
IT 古月方源2 小时前
ensp 关于ARRP 的讲解 配置
运维·开发语言·网络·tcp/ip·智能路由器