Linux命令

记录一些linux命令的使用

1. useradd & sudoers

1.1. 添加用户

useradd -m -p xiaomi -s /bin/bash -U xiaomi
#-m选项:当不存在/home/xiaomi目录时就创建一个
#-p:密码
#-s:指定该用户的shell,如果不指定,会使用默认值
#-U:添加用户的同时,添加一个名字一样的group

1.2. 将该用户加到sudo组

添加了用户之后,还不能执行sudo命令,执行时会提示 xiaomi is not in the sudoers file.  This incident will be reported.

1.2.1. 简单明了该怎么做

# 添加user到sudo组
usermod -a -G sudo xiaomi		#必须带-a参数,表示append,将用户xiaomi append到sudo组,如果不加,表示将用户xiaomi从其他组移出到sudo组

1.2.2. sudo扩展知识

  • sudo是Unix-like系统的一个应用程序,允许用户使用其他用户(通常是root用户)的权限来运行程序,sudo是"substitute user do"的缩写,意为do something as a different user(typically as root, the "superuser").

 

  • 用sudo以其他用户来运行命令的时候会要求输入自己的密码,注意不是其他用户的密码,你可能觉得奇怪,我要用别人的身份来运行命令,按道理应该让我输入对方的密码才对啊,为啥让我输自己用户的密码呢,我自己的密码我难道还不知道吗?这有啥意义?

 

  • 要搞懂这个就要了解sudo的配置文件,一般是/etc/sudoers文件,也有的是/usr/local/etc/sudoers,这个文件的作用,一句话来概括:它规定了谁被允许以哪些用户的权限运行哪些命令。而这个文件只有超级用户才能改!也就是说这里面的权限都是超级用户配置的,你能sudo哪些用户执行哪些命令都是超级用户给你授权了的,因此实际上你输不输密码都没多大关系了(超级用户都点头允许了,你说那还要你输密码干啥呢?),那默认为什么还要输密码呢?一般我们sudo的话都是以root身份执行一些重要命令,让你输密码卡一下是比较好的,想想万一你电脑忘记关有事去了,哪个冒失的家伙用你电脑执行了一些重要命令改了些重要配置......
    (再打个比方吧,就跟警察查房似的,警察当然有权查房,但你查房前也得出示下你的警官证吧,出示证件这个步骤就等同于输入密码这个步骤,你得出示证件我才知道你是真警察啊,同样的,你得输对自己的密码我才知道你真的是我授权的那个用户啊)

 

  • sudoers配置文件的权限是0440,连root都只有读权限,要改的话一定要用visudo这个命令来改,而不要用开文件写权限的方式去直接改,因为/etc/sudoers的权限只能是0440才能为系统使用和识别。

  • sudoers配置文件很强大,能配的东西很多,包括改成免密码的方式,还支持用正则表达式来配置允许执行的命令等,详情参考sudoers手册。

2. daemontools

daemontools是一套用来管理UNIX服务的工具。主页:http://cr.yp.to/daemontools.html,下面的介绍基本就是翻译了下这个主页的说明。

它可以用来启动,停止服务,可以监测服务的运行状态,当服务挂了的时候它可以自动将服务重启等。

这一套工具包含下面这些程序:

The svscanboot program 
The svscan program 
The supervise program 
The svc program 
The svok program 
The svstat program 
The fghack program 
The pgrphack program
The readproctitle program 
The multilog program 
The tai64n program 
The tai64nlocal program
The setuidgid program 
The envuidgid program 
The envdir program 
The softlimit program 
The setlock program

2.1. supervise

首先介绍的就是supervise程序,因为它是用来直接启动服务的,语法: supervise s

supervise切换到目录s并执行./run,如果./run退出运行了则会重启./run。启动./run后它会暂停一小段时间,以免./run直接退出造成supervise过快循环。

如果目录s中存在一个down文件,那么supervise不会直接启动./run。你可以通过svc命令来间接启动。

supervise维护了一份二进制格式的状态信息,这个状态信息存在目录s/supervise中,这个目录对supervise必须是可写的。状态信息可以通过svstat命令来读取。

如果目录s中不存在supervise所必须的文件 或者 已经有一个supervise已经在s目录运行了,那么它会直接退出。一旦supervise运行起来便不会退出,除非强行kill掉或者特别指定它退出。可以通过svok命令检查supervise是否成功运行。另外可以通过svscan来批量运行supervise程序。

2.2. svc

svc是用来控制那些被supervise监控的服务的。svc是间接控制服务的,它实际上是通过控制supervise来控制服务。

syntax : svc opts services

services就是服务的目录(2.1中的那个s),services可以是多个目录,用空格分开。

opts也可以有多个选项,svc会依次将所有选项逐个应用于每个service上,opts可以是下面这些:

  • -u : 启动。如果服务没启动,则启动;如果服务停止了,则重启。

  • -d : 关闭服务。如果服务在运行,给它发TERM信号,然后发CONT信号。在服务停止后不重启它。

  • -o : 启动一次。启动服务,如果服务停了也不重启它。

  • -p : 暂停。给服务发送STOP信号。

  • -c : 继续。给服务发送CONT信号。

  • -h : 挂起。给服务发送HUP信号。

  • -a : 报警。发送ALRM信号。

  • -i : 中断。发送INT信号。

  • -t : 终止。TERM信号。

  • -k : 杀死。KILL信号。

  • -x : 退出。当服务挂掉后,supervise会立即退出。如果你在一个运行稳定的系统上用这个选项,那你很可能做错事了,因为supervise生来就是被设计成永远运行的: )。

最后举个例子来说明svc,比如命令: svc -d /service/hotelbiz

实际上svc不是直接给hotelbiz发信号,而是通过supervise给hotelbiz发的信号。其他选项也是一样,都是通过supervise来做的操作,同时svc也会控制supervise,比如控制它不要重启服务等。所以我们其实完全可以不用supervise命令。

2.3. svstat

syntax : svstat service

示例:svstat /service/hotelbiz

/service/hotelbiz: down 5413 seconds, normally up

2.4. svscan

通过2.1和2.2的介绍我们知道要控制启动、停止、重启服务,只需要一个svc就可以了,这个svscan命令则是为了自动化启动服务而来的。

svscan为当前目录的每个子目录启动一个supervise进程,最多可有1000个子目录。以点开头的子目录会被忽略。

如果s目录的名称不超过255字节并且s/log目录存在,那么svscan会为s服务启动一对supervise进程,一个给s,一个给s/log,中间通过管道连接起来。

每5秒,svscan会扫一遍子目录,如果发现新的子目录,则会为其启动supervise进程,如果发现某个子目录的supervise挂了,则会重新启动supervise。在上面说的log情景中,即使重启也会复用之前的pipe,这样就不会造成数据丢失。

svscan也是被设计成永久运行的。如果创建管道或启动supervise进程中遇到错误,则会输出错误消息到stderr,并5秒后重试。

svscan后面可以跟一个命令行参数(目录的path),运行的时候会先切换到那个目录再运行。

2.5. svscanboot

svscanboot是一个脚本,由它来启动svscan,它的内容如下:

#!/bin/sh
# WARNING: This file was auto-generated. Do not edit!
PATH=/command:/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin
exec </dev/null
exec >/dev/null
exec 2>/dev/null
svc -dx /etc/service/* /etc/service/*/log
env - PATH=$PATH svscan /etc/service 2>&1 | \
env - PATH=$PATH readproctitle service errors: ................................................................................................................................................................................................................................................................................................................................................................................................................

2.6. readproctitle

syntax : readproctitle LD

L参数可以随便写啥,最好是自己服务的标识,D参数是一串任意字符串,但是它必须包含至少5个点

举例:

svscan /etc/service 2>&1 | readproctitle service errors : ....................

这个命令,svscan输出到stderr和stdout的信息会被readproctitle设置为它的参数。这样我们就可以通过ps命令查看到最后的错误信息。能显示多少错误信息取决于有多少个点,一个点表示一个字节。

假如现在svscan向stderr输出了一个错误:class not found,那么我们这时候执行ps aux | grep readproctitle,就可以看到这个错误信息,这个功能貌似略显鸡肋啊。

3. iftop

用来查看当前网络情况,常用命令

sudo iftop -n -i eth1
# -n 关闭 hostname的查询
# -i eth1 指定监听的网卡

4. screen

screen就是一个终端窗口管理器的命令行版本,一般说起为什么用screen,会找到这样的例子,比如你远程执行一个ssh的命令,可能这个命令执行时间很长,这时候如果你的网断了,或者你不小心把窗口关了,那么这时候就半途而废了,因为你执行的ssh是bash的一个子进程,bash挂了,子进程也跟着就挂了。这时候screen就派上用场了,在服务器上开一个screen,然后在screen里执行你要执行的命令,这时候只要你不退出screen,你的命令就不会终止(废话...)

两个概念:终端到screen的连接叫会话,screen内部的叫窗口,一个screen会话可以开N个窗口

http://aperiodic.net/screen/quick_reference

http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html

5. nmap

nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。

6. find

find命令没什么多说的,记录下一些需要注意的地方,默认find是不找链接目录的,如果要找,需要加上-L参数

7. expect

expect的模式里最好包含你期望看到的东西的结尾部分,因为expect只要匹配上模式就会进行下一步动作,如果你的模式没包含末尾,那么期待的字符还没输出完,脚本就开始做下一步动作了,打个比方,我们希望收到ftp>提示符的时候开始发送命令,如果你写expect 'ftp',那么最后可能会是这样 ftp命令>

8. tcpkill

顾名思义, 杀tcp连接用的, 类似的还有一个cutter命令

9. lsof

输出列的含义:

COMMAND     PID    USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
sg_agent_ 27758      500   18u      REG                0,9         0       3786 [eventpoll]
sg_agent_ 27758      500   19u     unix 0xffff88007b849880       0t0  100294654 socket
sg_agent_ 27758      500   20u     unix 0xffff88007b8481c0       0t0  100294655 socket
pickup    28421       89  cwd   unknown                                         /proc/28421/cwd (readlink: Permission denied)
pickup    28421       89  rtd   unknown                                         /proc/28421/root (readlink: Permission denied)
pickup    28421       89  txt   unknown                                         /proc/28421/exe (readlink: Permission denied)
pickup    28421       89 NOFD                                                   /proc/28421/fd (opendir: Permission denied)
flush     29642       89  cwd   unknown                                         /proc/29642/cwd (readlink: Permission denied)
flush     29642       89  rtd   unknown                                         /proc/29642/root (readlink: Permission denied)
flush     29642       89  txt   unknown                                         /proc/29642/exe (readlink: Permission denied)
flush     29642       89 NOFD                                                   /proc/29642/fd (opendir: Permission denied)
lsof      29650      500  cwd       DIR              253,1     20480     409601 /opt/logs/mobile/hotelsupplychain/logs
lsof      29650      500  rtd       DIR              253,1      4096          2 /
lsof      29650      500  txt       REG              253,1    141048    1452620 /usr/sbin/lsof

COMMAND:对应进程的命令名(只打印前9个字符)

PID:进程号

USER:进程所属的用户id或者登录名,一般来说跟ps命令打出来的一致

FD:文件描述符号或者如下的描述

  • cwd 当前工作目录

  • Lnn 库引用

  • err 表示FD信息错误,具体错误可看NAME列

  • jld jail目录

  • ltxshared library text (code and data)

  • Mxx 第xx个十六进制内存映射

  • m86 DOS merge mapped file

  • mem 内存映射文件

  • mmap 内存映射设备

  • pd 父目录

  • rtd 根目录

  • tr 内核跟踪文件(OpenBSD)

  • txt program text (code and data)

  • v86 VP/ix mapped file

  • 除此之外,文件描述符后面跟着的字母,描述了文件打开的模式:

    • r:read access

    • w:write access

    • u:read and write access

    • 空格:模式未知并且文件未加锁

    • -:模式未知并且文件加了锁

  • 模式标志后面还可能跟一个锁定标志,表示应用在文件上的锁类型

    • N for Solaris NFS lock of unknown type

    • r for read lock on part of the file

    • R for read lock on the entire file

    • w for a write lock on part of the file

    • W for a wrtie lock on the entire file

    • u for a read and write lock of any length

    • U for a lock of unknown type

    • x for an SCO OpenServer Xenix lock on part of the file

    • X for an SCO OpenServer Xenix lock on the entire file

    • space if there is no lock

TYPE:文件node节点的类型

DEVICE:设备号

SIZE/OFF:文件大小或者文件偏移,单位字节

NODE:本地文件的node节点号

NAME:文件所在挂载点和文件系统的名字

例子:

lsof -i # 所有网络连接
lsof -i 4 -a -p 1234 # 进程1234的ipv4连接
lsof -i @wonderland.cc.purdue.edu:513-515 # 连到主机wonderland.cc.purdue.edu上端口为513到515的所有连接
lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | more  # 统计打开文件数

useful options:

多个参数时,默认参数之间的关系是OR而不是AND!!

-a # 参数之间的关系为AND

10. netstat

这个命令已经过时了

netstat 被 ss 取代了

netstat -r 被 ip route 取代了(查看路由表)

netstat -i 被 ip -s link 取代了(网卡统计)

netstat -g 被 ip maddr 取代了(多播组成员)

11. ss

ss is used to dump socket statistics

example:

ss -a -t # 列出所有TCP连接
ss -a -t # 列出所有UDP连接
ss -o state established '( dport = :ssh or sport = :ssh )'  # Display all established ssh connections.这个例子用到了过滤器

useful options:

FILTER := [ state TCP-STATE ] [ EXPRESSION ] Please take a look at the official documentation (Debian package iproute-doc) for details regarding filters.

12. pgrep

pgrep命令以名称为依据从运行进程队列中查找进程,并显示查找到的进程

-o:仅显示找到的最小(起始)进程号; 
-n:仅显示找到的最大(结束)进程号; 
-l:显示进程名称; 
-P:指定父进程号; 
-g:指定进程组; 
-t:指定开启进程的终端; 
-u:指定进程的有效用户ID。

这个命令一般用在脚本中,可以方便的根据进程名称找出进程id,比如:

perf record -F 99 -p `pgrep -n node` -g -- sleep 30

13. tcpdump

-i: 指定监听网卡,监听所有网卡用-i any
-w: 写到文件
port: 指定端口号
portrange: 指定端口号范围
src: 源
dst: 目的
逻辑: and or not
示例:tcpdump -i any src port not 22 and dst port not 22  // 捕获所有网卡源端口号及目的端口号非22的包

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值