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
启动服务
-
命令行
service sshd restart|start|stop|status|reload
-
init.d 启动脚本
/etc/init.d 是 /etc/rc.d/init.d 的软链接(soft link)。
/etc/init.d/sshd restart|start|stop|status|reload
配置开机自动启动
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