Learning Linux

Learning Linux

Linux文件名

/bin

普通用户有权限使用的二进制可执行命令

cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等。

/sbin

主要放置一些系统管理的必备程式例如:cfdisk、dhcpcd、dump、e2f/sck、fdisk、halt、ifconfig、ifup、 ifdown、init、insmod、lilo、lsmod、mke2fs、modprobe、quotacheck、reboot、rmmod、runlevel、shutdown等。

/boot

存放引导加载器(bootstrap loader)使用的文件

/etc

etc.是法语词et cetra 的缩写,相当于英语的 and so on.

存放系统管理和配置文件,其中包括了用户信息文件/etc/passwd,系统初始化文件/etc/rc

/opt

用户级的程序目录,可以理解为D:/Software,opt有可选的意思,这里可以用于放置第三方大型软件(或游戏),当你不需要时,直接rm -rf掉即可。在硬盘容量不够时,也可将/opt单独挂载到其他磁盘上使用。

/usr

系统级的目录,可以理解为C:/Windows//usr/lib理解为C:/Windows/System32

/usr/local

用户级的程序目录,可以理解为C:/Progrem Files/。用户自己编译的软件默认会安装到这个目录下。

/usr/local/bin

本地增加的命令

/usr/local/lib

本地增加的库根文件系统

/usr/bin

主要放置一些应用软体工具的必备执行档例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 gzip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等。

/usr/sbin

超级用户使用的可执行文件,放置一些网路管理的必备程式例如:dhcpd、httpd、imap、in.*d、inetd、lpd、named、netconfig、nmbd、samba、sendmail、squid、swap、tcpd、tcpdump等

/home

存放所有用户文件的根目录

/lib

存放跟文件系统中的程序运行所需要的共享库及内核模块。共享库又叫动态链接共享库,作用类似windows里的.dll文件,存放了根文件系统程序运行所需的共享文件。

/tmp

用于存放各种临时文件,是公用的临时文件存储点。

/dev

用于存放设备文件。/bus, /cpu, /disk,比如,用户可以通过访问/dev/mouse/访问鼠标的输入,就像访问其他文件一样

/media

放置的就是可移除的装置。 包括软碟、光碟、DVD等等装置都暂时挂载于此

/proc

proc是一个伪文件系统,提供了访问内核数据的方法,一般挂载在“/proc”目录,其中的大部分内容是只读的

虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息。

/var

用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等。

/srv

主要用来存储本机或本服务器提供的服务和数据

Linux文件命令

dmesg

用来显示开机信息

开机信息保存在/var/log/dmesg

dd -- disk dump

复制文件并对原文件的内容进行转换和格式化处理

df -- disk free

df -h  ./
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda10      189G   50G  131G  28% /

 df   ./
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda10     198170792 51487036 136594132  28% /

wc -> word count

用于查看文件的行数,单词数和字符数

wc filename
X Y Z  filename
  • X : 行数
  • Y: 单词数
  • Z: 字节数
  • filename: 文件名
ls | wc -l # 查看有多少个文件

find

在当前目录下,查找文件为suchen的文件。

find . -name suchen
find . -iname suchen # 不区分大小写

找出当前目录下,目录名是tmp的目录

find . -type d -name tmp

查找特定权限的文件

find . -type f -perm 777 # 权限是777
find . -type f -perm /a+x # 查找可执行文件

查找指定用户的文件

find . -user tuo 

查找特定时间修改的的文件

find . -type -f -mtime 3 # 三天前修改
find . -mtime +3 # 三天以前
find . -amin -3 # 三天以内访问过的

查找特定大小的

find . -type f -size +50MB -size -100MB # 大于50,小于100的文件

ln

  • 软链接:新建一个node指向原来node, 是一类特殊的文件,这个文件包含了另一个文件或目录的路径名。在对符号文件进程进行操作时,系统会自动把该操作转换为对源文件的操作。但删除文件时仅仅删除链接文件。
  • 硬链接:新建一个node指向原来node的block,和原node公共一个inode号,一个文件的另一个文件名。引用的是文件在文件系统中的物理索引(node)。当删除原始文件时,硬链接不会被破坏,因为它所引用的是文件的物理数据而不是文件在文件结构中的位置。
ln -s /path/origin /path/link # -s创建一个软链接
ln /path/origin /path/link # 创建一个硬链接

sort

排序

sort string.txt # 对字符串进行排序
sort -n num.txt # 对数字进行排序
sort -n -r num.txt # -r 倒序

unip

去重

uniq example.txt 
uniq -c example.txt # 统计重复次数

tr

替换或删除字符

echo "ABC" | tr [:upper:] [:lower:]
echo "A B C" | tr [:space:] '\t'
echo "delete1234" | tr -d [:digit:]

mkdir

mkdir -p already_exist #创建一个已经存在的目录,不报错

diff

比较文件区别

diff -yw 1.txt 2.txt # w表示比较时忽略空格,y以并排的格式输出比较结果
  • !表示由差异的行
  • + 表示第二个文件比第一个文件多出的行

who

查看当前所有登录用户的信息

paste

paste -d'|,' file1 file2 file3 # -d 指定分割符

apt

apt = apt-get、apt-cache 和 apt-config 中最常用命令选项的集合。

增加了进度条交互。

apt-cache search **packagename **搜索包
apt-cache show **packagename **获取包的相关信息,如说明、大小、版本等
apt-get install packagename 安装包
apt-get install packagename --reinstall 重新安装包
apt-get -f install 修复安装”-f = –fix-missing”
apt-get remove packagename 删除包
apt-get remove packagename --purge 删除包,包括删除配置文件等
apt-get update 更新源
apt-get upgrade 更新已安装的包

apt-get source** packagename** 下载该包的源代码
apt-get clean 清理无用的包
apt-get autoclean 清理无用的包
apt-get check 检查是否有损坏的依赖

uname

查看系统信息

uname -a # 查看所有信息

Linux网络命令

ping

判断网络的的联通和延迟,得到域名解析

ping www.baidu.com
ping -I wlp3s0f0 www.baidu.com # 以特定网卡ping
ping -s 1452 www.baidu.com # ping特定包的大小
  • icmp_seq icmp包顺序
  • ttl 生存周期
  • time 相应时间

wlp3s0f0 无线网卡

enp2s0f1 有线网卡

traceroute/mtr

traceroute -n www.baidu.com # 不进行域名解析
tracetoute -I wlp3s0f0 www.baidu.com # 以特定网卡
  • 第一跳 为网关
  • * 表示丢包

mtr是traceroute进化版,IDE

host

简单的域名解析

nslookup和dig

用于域名解析

lspci

查看所有pci设备信息,网卡硬件也是采用pci总线

lsusb

查看所有USB设备

ifconfig

interface configuration 查看接口信息

ifconfig -a # 查看所有接口信息
ifconfig wlp3s0f0 # 查看特定接口
ifconfig wlp3s0f0 up # 激活网卡
ifconfig wlp3s0f0 down # 关闭网卡
  • lo 环回接口
  • wlp3s0f0 无线网卡
  • enp2s0f1 有线网卡

ifup,ifdown 启用关闭接口

ip route

查看路由表,本机只是一个网络中端,第一行为网关

route

route -n # ip地址
route # 主机名

netstat

用于显示各种网络相关信息

socket又称为嵌套子:unix,udp,tcp

应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

  • -t 列出tcp协议的链接
  • -u 列出udp协议的链接
  • -n 禁用域名解析功能
  • -l 选项列出正在监听的套接字
  • -p 打印进程信息 (sudo)
  • -r 打印内核路由信息
  • -i 打印网络接口信息

ifup/down

启用或禁用特定的网络接口

网络故障排查

网络故障排查遵循从底层到高层, 从自身到外部的流程进行。

  • 先查看网络配置信息是否正确
    • IP地址
    • 子网掩码
    • 网管
    • DNS
  • 查看到达网关是否联通
    • ping网关IP地址
  • 查看DNS解析是否正常
    • host www.baidu.com

top

top命令经常用来监控linux的系统状况,比如cpu、内存的使用

  • 第一行:top - 当前系统时间 up 系统运行了多长时间 , 几个用户登录 users, load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
  • 第二行:进程数
  • 第三行:cpu使用情况:us用户,sy内核,id空闲,wa IO等待,hi硬中断,si软中断
  • 第四行:内存状态
  • 第五行:交换分区
  • 第七行:PID:进程id,PR:进程优先级,S:进程状态 R=running, s=sleeping, t=stopped, z=zombie

输入f,查看缩写的全称

SSH

SSH为建立在应用层和传输层基础上的安全协议

sshd服务使用SSH协议进行远程控制,或在计算机之间传送文件。而实现此功能的telnet(远程桌面) 是不安全的,使用明文传送密码

ssh

ssh [email protected]   # 树莓派系统的用户名和局域网 IP 地址.
ssh -p 10022 user@hostname # 使用10022端口,默认为22端口


ssh [email protected] -p 8022 # 连接termux

利用ssh运行命令

ssh user@hostname python3 < test.py

ssh user@hostname "your cmd"

配置文件

/etc/ssh/目录下

  • ssh_config 客户端配置文件
  • sshd_config 服务器端配置文件

一般配置服务端的配置文件ssh_config

启动服务

  1. 命令行

    service sshd restart|start|stop|status|reload
    
  2. init.d 启动脚本

    /etc/init.d 是 /etc/rc.d/init.d 的软链接(soft link)。

    /etc/init.d/sshd restart|start|stop|status|reload
    
  3. 配置开机自动启动

chkconfig sshd on
chkconfig --list sshd
chkconfig sshd off

scp

把当前一个文件copy到远程另外一台主机上

scp /home/daisy/full.tar.gz [email protected]:/home/root

把文件从远程主机copy到当前系统

scp [email protected]:/home/root     /home/daisy/*.tar.gz 

keygen

# termux
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
scp ~/.ssh/authorized_keys tuo@hostname:~/tmp

# pc
cat ~/tmp/authorized_keys >> ~/.ssh/authorized_keys # 本机authorized_keys所存储的是可以访问本机的设备

硬盘到文件系统

硬盘接口分类

  • SATA (Serial Advanced Technology Attachment)
  • SAS (Serial Attached SCSI)
  • SCSI (Small Computer System Interface)
  • IDE (Integrated Drive Electronics)
  • USB

Linux中,IDE硬盘(hd)最多只能有59个逻辑分区(5-63),SATA接口硬盘最多只能有11个逻辑分区(5-15)

每种操作系统所配置的文件属性权限不同,为了存放这些文件所需的数据,需要将硬盘进行格式化,以成为操作系统能够利用的文件系统格式。

不同操作系统使用的常见系统格式

  • Windows: FAT(Win98以前), FAT32, NTFS(Win2000之后)
  • Linux: Ext2, Ext3, Ext4, XFS
  • Mac: HFS

各种接口的硬盘在linux中的文件命名

  • SCSI,SATA,USB等接口文件的文件名:/dev/sd[a-p]/[1-15]
  • IDE接口的文件名: /dev/hd[a-d][1-63] hda表示IDE主硬盘,hdb表示IDE从硬盘
  • 打印机文件名: lp

Linux文件系统将权限与属性放置在一个inode中 ( 一个文件只有一个inode, 同时记录文件数据所存放的data block号码),实际数据放在block区中 (一个文件可=可以有多个block)。另外,还有一个superblock记录整个文件系统的整体信息,包括inode和block总量,使用量和剩余量。

与linux的ext2相比,FAT文件系统没有inode,只有储存文件数据的block。前面一个block存放下一个block的号码,现在这种FAT文件系统主要用在U盘上

Win7系统支持NTFS和winFS文件系统,而win8是全新的ReFS系统

etx2是非日志文件系统,etx3是日志文件系统

在Linux中输入输出设备被看做特殊文件,称为设备文件。设备文件分为两类,字符设备文件(c)和块设备文件(b)。字符设备文件允许设备传送任意大小的数据,如终端,打印机,鼠标等。块设备文件允许设备传送数据以数据块为单位,如硬盘,光盘,usb

计算机硬盘的分区主要分为基本分区和扩展分区,基本分区和扩展分区之和不能大于四个,基本分区可以马上被使用但不能再分区。扩展分区必须在进行分区后才能使用,由扩展分区再分下去就是逻辑分区,逻辑分区没有数量限制。

fdisk

fdisk命令是磁盘及分区管理工具,在硬盘设备中创建、删除、更改分区等操作通过fdisk命令

-l: 该选项后没不跟设备名会直接列出所有磁盘设备以及分区表,加上设备名会列出该设备额分区表

不加-l会对该磁盘进行分区

mkfs

将磁盘分区后,使用mkfs命令可对其进行格式化

fsck

当系统非正常关机时,或其他原因破坏了文件系统,需要对文件系统进行恢复,否则文件系统将不能正常引导

fsck /dev/sda1

df

检查文件系统的磁盘空间占用情况。可以利用该命令来获取磁盘占用了多少空间,目前还剩下多少空间

du

查看目录下所有文件所占空间大小,默认以block数为单位

基础命令

date

显示或设置此时系统时间

cal

cal [month] /[year]

在屏幕上显示日历信息

su root

登录root 账号

cat

cat a |head -n 3000|tail -n +1000 >> b

将文件a的1000行到3000行之间内容添加到b的后面

cat a |tail -n 1000 >> b

将文件a的最后1000行添加到b后面

cat a |head -n 1000 >> b

将文件a的前1000行添加到b后面

cat a |tail -n +1000 >> b

将文件a的1000行以后的添加到b后面

cat > b

将接下来键盘输入的内容覆盖b

set

  • set -e

    当命令以非零状态退出,则退出shell

set -o noclobber

避免重定向重写已存在的文件 +o 禁用noclobber功能

uniq

去掉重复行

diff

找不同

grep

-i 忽略大小写

-v 显示不包含字符串的文本行

-C 5 foo file 显示file文件里匹配foo字串那行以及上下5行

-B 5 foo file 显示foo及前5

-A 5 foo file 显示foo及后5行

-l 只显示文件名

grep -l main * # 列出当前目录下内容含有main的文件

history

history 5 # 显示最近执行的5个命令
!547 # 重复执行547号命令

killall

killall bash # 杀死所有bash程序

pkill

pkill -b -9 python # 杀死最近的python进程
pkill -f string -9 # 杀死名字带while的进程

watch

watch -n 10 ps -au

Linux GUI

X Windows是一个窗口系统,为GUI界面提供最基本的支持,而具体的窗口形式、窗口行为以及更多的图形化支持,则需要借助于窗口管理器和桌面环境。

现在常用的桌面环境为GNOME(基于GTK图形库)和KDE(基于Qt图形库),可以从中简便地管理和使用应用程序、文件和系统资源

系统启动过程

  • 加载BIOS

    加电自检,根据BIOS内设置的引导顺序从硬盘、软盘或CDROM中读入主引导记录即MBR(其中存放了预启动信息、分区信息),被调到物理内存的内容是Boot Loader,具体到用户PC机就是LILO或GRUB。

  • 加载Boot Loader

    Boot Loader是在操作系统内核运行之前运行的一段小朋友,通过这段小程序,可以初始化硬件设备,建立内存空间的映射图。

  • 加载内核映像

    根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩。

  • 执行init进程

    内核被加载后,第一个运行的程序便是/sbin/init

  • 执行/bin/login程序,进入登录状态

    系统为用户建立登录接口,等待用户输入username和password

GRUB介绍

GRUB (GRand Unified Bootloader)是一个将引导装载程序 (Boot Loader) 安装到主引导记录(MBR)的程序。这使得用户能够对操作系统进行选择,在内核引导时可传递指令给内核,或是在内核引导前确定一些系统参数

Linux关机

shutdown

shutdown 16:50

shutdown +5 “Byebye” 五分钟后关机打印拜拜

halt

相当于shutdown -h 立即关机

halt执行时,kill掉所有应用程序,然后调用sync(将所有内存信息通过文件系统写入硬盘)

reboot

和halt类似的重启程序

相当与shutdown -r

init

init进程是所欲进程的祖先,其进程号始终wenyi

日志管理

Linux系统有三个主要的日志子系统

  • 连接时间日志子系统

    由多个程序执行,把记录写入到/var/log/wtmp/var/run/utmp中,login等程序更新wtmp和utmp文件,使系统管理员能够跟踪用户在何时登录到系统中。

  • 进程统计日志子系统

    由系统内核执行,当一个进程终止时,为每个进程向进程统计文件中写一个记录。进程统计的目的是为系统中的基本服务提供命令使用统计

  • 错误日志子系统

    由syslogd (8) 执行。各种系统守护进程、用户程序和内核通过syslogd(8) 向文件/var/log/messages报告值得注意的事件。

/var/log/dmesg

/var/log/dmesg文件保存内核启动的信息,可以看到内核和各种驱动程序的加载,加载硬件驱动时系统也会显示出相应的信息。

/var/log/messages

/var/log/messages文件是Linux系统中最全面的log文件,记录了内核和应用程序发生错误时的信息和系统运行的一般信息。

使用swatch文件分析日志

alias

给命令取别名

alias cdir='cd /home/user/dir'

gcc

  • 预处理阶段

    gcc -E hello.c -o hello.i

  • 编译阶段

    gcc -S hello.i -o hello.s

  • 汇编阶段

    gcc -c hello.s -o hello.o

  • 链接阶段

    gcc hello.c -o hello

  • 将两个文件编译链接成可执行文件

    gcc -o main mani.o stack.o

使用静态链接库

  • 生成.o文件

    gcc -c stack.c

  • 用ar命令归档,生成文件libstack.a

    ar -rc libstack.a stack.o

  • 编译源文件main.c为目标文件main.o,注意要把静态库头文件的路径加到-I参数里面

    gcc -I /includepath/ -o main.o -c main.c

  • 生成可执行文件,注意把静态链接库文件的路径加到-L参数里面,把库文件名(去掉lib和.a)加到-L参数里面

    gcc -o main -L /libpath. main.o -L stack

-w 禁止所有警告信息

-Wall 允许发出gcc提供的所有有用的报警信息

-Werror 视警告为错误,出现任何警告即放弃编译

-g 指示编译程序在目标代码中加入供调试程序gdb使用的附加

git

初始化仓库

git init # 通过git init命令把这个目录变成Git可以管理的仓库

将文件加入到仓库的暂存区

git add readme.md # 将文件添加到仓库,实际上就是把文件修改添加到暂存区
git diff file # 比较工作区和暂存区之间的区别

将文件提交到当前分支

git commit  -m "This is commit" # 把文件提交到仓库 -m后面输入的是本次提交的说明 commit 可以一次提交很多文件,实际上就是把暂存区的所有内容提交到当前分支。
git log # 查看commit历史记录 

回归到以前版本

get reset --hard HEAD^^ # 回到上两个版本
get reset --hard 3a9864 # 回到指定版本号,查看log得到
git reflog # 记录了每次commit和reset记录,也可以通过这个命令的得到某个版本号的id
git checkout -- readme.md # 丢弃工作区中对readme.md的修改  --很重要

删除文件

rm test # 从工作区删除
git rm test # 从版本库删除文件
git commit # 确认删除

上传到github

 git remote add origin [email protected]:michaelliao/learngit.git # 要关联一个远程库
 git push -u origin master # 推送最新修改

新的分支

git checkout -b dev # -b表示切换

上个语句等同于

git branch dev
git checkout dev

查看当前的分支

git branch

我们把dev分支的工作成果合并到master分支上

git merge dev

删除一个分支

git branch -d dev

上传代码

git push -u origin master
>> [email protected]
>> wangtuo96$

odps

od -c file

查看文件的实际内容

fator

分解因数 factor 999

fortune

打印一句名言 fortune-zh打印一首诗

tmux

  • ctrl+b C: create new window
  • ctrl+b , : rename the window
  • ctrl+b p: go previous window
  • ctrl+b n: go next window
  • ctrl+b t: show time
  • ctrl+b w: list all window
  • ctrl+b %: split the window vertically
  • ctrl+b ": split the window horizentally
  • ctrl+b : input command
  • ctrl+b d : detach session 不退出,在后台继续运行
  • ctrl+b &: exit session
  • ctrl+b ':

tmux new -s name 创建一个会话,命名为name

tmux attach -t name 重新连接上被分离的会话

tmux ls 列出所有创建的会话

Shell

有条件执行

  • &&: 连接两个命令, 前一命令执行成功后才能执行后一命令

  • ||: 前一命令执行不成功才执行后一命令

    ls ./test && cd test #当存在test目录,cd到test目录
    

引号(字符串)

  • 双引号对字符串中出现的$,",',\进行替换
  • 单引号不进行替换,将字符串作为普通字符输出
  • 反引号会将字符串作为命令执行
echo 'I am $USER'
>> I am $USER
echo -e "I am \n$USER" # 对字符串进行转义
>> I am 
>> tuo
  • $#: 实际位置参数个数
  • @: 命令行所有参数组成的字符串
  • $!: 上一个后台命令对应的进程号
  • $$: 当前进程号
  • $? 上一命令的退出状态
#!/bin/bash
echo "File Name: $0"
echo "First Parameter : $1"
echo "First Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"
$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2

read

echo -n "input:"
read $USER
echo "output: $USER"

read -p "input"
echo "output $REPLY"

LINE

逐行输出文件中代码

while read LINE
do
    echo "$LINE"
done

printf

printf "%s's average score is %.2f\n" "Lixiaohai" $((83+99+66)/3)

数组

student=("A" "B" "C")
score=(11 22 33)
for i in 0 1 2
do
    echo "${student[$i]} is : ${score[$i]} "
done

student[0]="E"
student[1]="F"
student[2]="G"
i=0
while [ $i -lt 5 ]
do
    echo ${student[$i]}
    i=$(($i+1)) # i++
done
echo "${#student[*]}"

获取所有元素

NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Index: ${NAME[*]}"
echo "Second Index: ${NAME[@]}"

获取数组长度

NAME[0]="Zara"
NAME[1]="Qadir"
NAME[2]="Mahnaz"
NAME[3]="Ayan"
NAME[4]="Daisy"
echo "First Index: ${NAME[*]}"
echo "Second Index: ${NAME[@]}"
#取得数组元素的个数
length=${#NAME[@]}
echo -e $length "\n" # len of NAMe
#或者
length=${#NAME[*]} # len of NAME
echo -e $length "\n"
#取得数组单个元素的长度
lengthn=${#NAME[0]} # 4 length of Zara
echo -e $lengthn "\n"

判断

是否存在且为字符设备

if test -r $FILENAME;then
  echo "is a file"
fi

数值的大于等于

if test n1 -ge n2; then
  echo ""
fi

字符串的等于

if test str = str;then
  echo ""
fi

逻辑

# 与 -a
if test n1 -ge n2 -a n1 -lt 70;then
  echo ""
fi
# 或 -o
if test n1 -ge n2 -o n1 -lt 70;then
  echo ""
fi

判断目录

if test ! -d $DIR; then
  echo "not a dir"
fi

你可能感兴趣的:(Learning Linux)