Table of Contents:

设置[[alias]]

【windows和linux差异】
windows下的换行是\r\n
linux下的换行是\n
mac下的换行是\r
windows下的文件上传到linux上文件的/r/n,可能会被上传的软件自动变变成适应linux上的格式,如果不是,记得转换格式

【注意】
拿到一台linux机器的时候要先看看是什么版本的,因为不同版本的命令是有些差别的

# 查看内核/操作系统信息
uname -a
cat  /etc/*-release
cat  /proc/version

# Linux查看glibc安装版本
64bit:strings /lib64/libc.so.6 |grep GLIBC
32bit:strings /lib/libc.so.6 |grep GLIBC

shell

man帮助
1   Executable programs or shell commands
2   System calls (functions provided by the kernel)
3   Library calls (functions within program libraries)

shell配置
----------------------
系统级的   
    /etc/profile    System wide environment and startup programs written here
    /etc/bashrc     System wide functions and aliases written here

用户级的
    ~/.bash_profile
    ~/.bashrc  rc  run commands的缩写
设置可以在当前目录查找可执行文件的方法
    打开宿主目录下的用户配置文件”.bash_profile”
    在PATH后面追加”:.”  
    source .bash_profile
source
    这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。
    那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
    source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录
    source命令(从C Shell而来)是bash shell的内置命令;点命令(.),(从Bourne Shell而来)是source的另一名称
    sh filename和./filename,重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell
    的环境变量,但子shell新建的、改变的变量不会被带回父shell,

环境变量
-------------
env  # 查看环境变量资源

export  查看所有环境变量
修改环境变量
查看path环境变量 echo $PATH
export PATH=$PATH:/home/uusama/mysql/bin

命令的输入
-------------------------
<<< here string
md5sum <<< ddd  等同于 echo ddd | md5sum

<<  here document
md5sum << END
ddd
END

磁盘管理

fdisk -l                  查看所有磁盘
fdisk /dev/sda            对/dev/sda进行分区
mkfs -t ext3 /dev/sdb1    格式化磁盘为ext3系统
parted /dev/sdb           查看某个硬盘信息

df(Disk free) -B --block-size=GB df --block-size=MB 查看磁盘使用情况

du(Disk usage) -h 查看目录大小   默认是递归的
du -h -d 1 work/testing    指定查看的深度

mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘到/mnt/hda2  确保'/mnt/hda2'已经存在 
umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载点 '/mnt/hda2' 退出 

目录和文件

【基础操作】
cd - 返回上次所在的目录 
ls -lSr|less 以尺寸大小排列文件和目录 
ls -R 递归显示

tree 显示目录结构,需要额外下载此程序 

touch  新建文件
mkdir -p /path  创建级联目录

ln xx xx 建立硬链接,不能建立指向目录的硬链接 
ln -s xx xx 软连接 

file filename 查看文件的类型详细信息

cp -R 源路径 新路径     --recursive
scp root@192.168.2.208:/home/a.txt /home 
scp 服务器用户名@iP地址:服务端文件路径 客户端保存路径

【文件权限】
chmod 755 for.sh  绝对法 4r 2w 1x
chmod o+x for.sh  相对法 u  g o
chmod u=rwx,og=rx for.sh

chown user1:group1 file1 改变file1的所有人和群组属性 
chown -R  use1 /var/www/food   递归的

chgrp group1 file1 改变file1的群组

chattr  文件的特殊属性 - 使用 "+" 设置权限,使用 "-" 用于取消 
chattr +a file1 只允许以追加方式读写文件 
chattr +i file1 设置成不可变的文件,不能被删除、修改、重命名或者链接 

umask  指定用户创建文件时的掩码

文本工具

cat more less head tail 

cat aa.txt bb.txt > cc.txt  合并到一个文件
cat file1 | command( sed, grep, awk, grep, etc...) > result.txt 

tail -f /var/log/messages 实时查看被添加到一个文件中的内容 

od    按照八进制、十六进制、ascii显示文本
hexdump -C test.bc   查看二进制文件

cut - remove sections from each line of files
cut -d: -f1 /etc/passwd

wc 统计数量 -l 或–lines 只显示列数。-w 或–words 只显示字数。 

【格式转换】
iconv - convert text from one character encoding to another
dos2unix filedos.txt  fileunix.txt 将一个文本文件的格式从MSDOS转换成UNIX 
unix2dos fileunix.txt filedos.txt 将一个文本文件的格式从UNIX转换成MSDOS 

indent是linux下的一个代码格式的的工具,格式化c代码    
indent -bad -bli 0 -ce -kr -nsob --space-after-if --space-after-while --space-after-for --use-tabs -i8

查找与检索

find [OPTION] path… [expression] 
find /root/me -name 'file*' 

locate filename  查找filename
locate \*.ps 寻找以 '.ps' 结尾的文件
locate 与 find 不同: find 是去硬盘找,locate 只在 /var/lib/slocate数据库中找,
locate 的查找并不是实时的,运行updatedb,重新建立数据库索引

grep -n 'eee' hello.txt  在hello.txt查找eee, -n是显示行号 
grep 'printf' /usr/include -R 递归的在目录中查找

whereis halt  显示一个二进制文件、源码或man的位置,比which显示的信息更多 
which halt    显示一个二进制文件或可执行文件的完整路径 

find的 -exec参数
-exec 参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。
{} 花括号代表前面find查找出来的文件名。

exec和xargs参数区别
exec参数是一个一个传递的,传递一个参数执行一次命令;xargs一次性将所有参数传给命令

#xargs将参数一次传给echo,即执行:echo begin ./11.txt ./22.txt
find . -name '*.txt' -type f | xargs echo begin

#exec一次传递一个参数,即执行:echo begin ./11.txt;  echo begin ./22.txt
find . -name '*.txt' -type f -exec echo begin {} \;

打包和压缩文件

zip  -r file1.zip file1
unzip file1.zip

tar -zcvf archive.tar.gz dir1    创建一个gzip格式的压缩包 
tar -zxvf archive.tar.gz         解压一个gzip格式的压缩包 

系统管理

shutdown -h now 关机
shutdown -r now 重启
reboot          重启

who    查看登录的用户    
last   查看用户登录日志
pkill -kill -t pts/2   踢人

crontab -l # 查看当前用户的计划任务服务
用crontab执行shell脚本的时候要注意给脚本可执行的权限,要不会报permision deny的错误

less /etc/passwd # 查看系统所有用户
less /etc/group  # 查看系统所有组

date  查看日期时间

用户和用户组管理

whoami   查看当前用户
useradd user1 创建一个新用户 
    用useradd增长一个新用户之后,还不能立即使用,得给新用户设一个密码才可以使用.
useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 "admin" 用户组的用户 
userdel -r user1 删除一个用户 ( '-r' 排除主目录) 
usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性 

groupadd group_name 创建一个新用户组 
groupdel group_name 删除一个用户组 
groupmod -n new_group_name old_group_name 重命名一个用户组

passwd user1 修改一个用户的口令 (只允许root执行) 

su – root 切换到root -中间有空格
    加-后,环境变量这些什么的都切换成其他用户的,不加则没有

进程管理

每个进程启动之后在 /proc下面有一个于pid对应的路径,进入进程号的目录后可以得到很多关于进程的信息

查看所有进程
ps aux  或   ps -ef 

pwdx <pid>  通过pid 寻找程序路径

ctrl+z  程序已经在前台运行,执行ctrl+z就可以放入后台
fg      把后台执行的程序恢复到前台来运行

jobs    列出所有在后台执行的进程
fg %number  jobs命令列出的,中括号([ ])里面的数字就是 jobs 的代号,通过fg %number 就可以恢复指定的后台进程
bg %number  放到后台运行

nohup /opt/lampp/sbin/mysqld &    no hang up
nohup command >out.file 2>&1 &    后台运行处理输出

kill -l 列出所有信号
kill pid 向pid的进程发送kill信号
pkill -9 http

top    实时显示进程状态用户

free -m -s 3    -s 表示刷新的时间间隔,秒为单位

系统监控

ulimit -n   查看最大fd

查看所有进程打开的句柄数,输出格式:fds pid
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|less
find /proc -print | grep -P '/proc/\d+/fd/'| awk -F '/' '{print $3}' | uniq -c | sort -rn | head

CentOS 7中的lsof是按PID/TID/file的组合显示结果的,多个线程中会重复打印同一个fd
同一个进程如果多个线程访问同一个文件通常只需要打开一次、占用一个fd,但在lsof中就显示多行。
下面的命令其实也没有太大意义
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|less

这个比较准:
find /proc -print | grep -P '/proc/\d+/fd/'| awk -F '/' '{print $3}' | uniq -c | sort -rn | head

看某个具体的进程:
    lsof  -n -p <pid>
    ls -l /proc/<pid>/fd | wc -l

网络命令

网络配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 #物理设备名
IPADDR=192.168.1.10   #IP地址
NETMASK=255.255.255.0 #掩码值
GATEWAY=192.168.1.1   #网关地址
ONBOOT=yes            # [yes|no](引导时是否激活设备)
USERCTL=no            #[yes|no](非root用户是否可以控制该设备)
BOOTPROTO=static      #[none|static|bootp|dhcp](引导时不使用协议|静态分配|BOOTP协议|DHCP协议)
DNS1=8.8.8.8          #dns
ping  主机名/IP地址

ifconfig     查看网卡信息
ifconfig eth0 down/up  关闭开启网卡
curl ifconfig.me   查看自己的外网ip


netstat -apn  | grep 80       a全部状态的全部连接 p显示pid  n Do not try to resolve service names.
netstat -antp # 查看所有tcp连接,t代表tcp
netstat ntlp   显示所有状态是listening的tcp链接, l是listening的意思
ss -ant       #查看所有tcp连接,当连接比较多时比netstat要快   ss(Socket Statistics)

nslookup domain.com     域名查询,查询Internet域名信息或诊断DNS 服务器问题的工具.
route -n            # 查看路由表

hosts文件 /etc/hosts  格式为 ip  host, 改后ping一下就好 

wget -c  xxx    断点续传

包管理

rpm(Red Hat Package Manager)
    rpm -qa   query all
    rpm -i jdk-XXX_linux-x64_bin.rpm   i install
    rpm -e    erase
yum   yum安装的包是rpm的包
    yum search  jdk  在线查找某个包
    yum install java-11-openjdk.x86_64
    yum erase   java-11-openjdk.x86_64
    源服务器列表配置:/etc/yum.repos.d/CentOS-Base.repo 

dpkg(Debian Packager) Debian的包管理
    dpkg -l  list
    dpkg -i jdk-XXX_linux-x64_bin.deb  debian下的安装
    dpkg -r   remove

apt-get   apt(Advanced Package Tool)  deb的网络包管理工具
    apt-cache search jdk
    apt-get install openjdk-9-jdk 
    apt-get purge openjdk-9-jdk
    源服务器列表配置:/etc/apt/sources.list

其他工具

rzsz yum install -y lrzsz      sz filename  下载    rz 上传

echo "ddd" | md5sum

ssh ip  ssh登录

mail命令发送邮件
    mail -s test yangfang@fudan.edu.cn                     #第一种方法,你可以把当前shell当成编辑器来用,编辑完内容后Ctrl-D结束
    echo “mail content”|mail -s test yangfang@fudan.edu.cn #第二种方法,我用的最多
    mail -s test yangfang@fudan.edu.cn < file              #第三种方法,以file的内容为邮件内容发信

strace
跟踪系统调用的执行
用法:strace -p pid

time 程序名   查看程序运行时间

watch
watch -n 1 "ps -ef|grep test"  每秒执行一次命令


AutoGen  
貌似挺实用挺厉害的工具,但是介绍、入门的文章非常少。
AutoGen is a tool designed to simplify the creation and maintenance of programs that contain large amounts of repetitious text. It is especially valuable in programs that have several blocks of text that must be kept synchronized.

linux常见服务器

远程连接服务器
    telnet
        远程连接,明文传输数据
    ssh
        ssh协议支持传输文件的,xshell的xftp传输文件就是用的ssh协议
        命令行的话可以用scp通过ssh传输文件 

文件服务器
    ftp:vsftpd
        提供交互式的访问,查看目录文件信息,在服务器与客户端之间进行文件的传输
        可以用ftp/lftp命令连接服务器进行文件上传和下载
    TFTP(Trivial File Transfer Protocol)
        简单文件传送协议,是一个小而易于实现的文件传送协议,不支持交互
    NFS(Network FileSystem)
        做文件共享目录用,允许把nps服务器的目录挂载到本地,操作本地的文件等同于操作服务器
        比如: mount -t nfs -o nolock -o tcp IP:/home/用户名/nfs /mnt   将远程的挂载到本地
        若FTP需要修改文件,则需要下载然后再上传
    samba
        用于Linux和Windows之间共享文件。
DNS服务器

邮件服务器

web服务器
    nginx php mysql redis之类的可以都放到 uer/local/web目录下,方便查找

数据库服务器