/************************************************************* * Linux Foundation * 1. 总结一下Linux的基础内容; * 2. 主要目标是防止以后忘记了,这里有个地方可以快速回忆; * * 2015-3-29 晴 深圳 曾剑锋 ************************************************************/ \\\\\\\\\\\\\\\\\*目录*//////////////// | 一. 退出终端的三种方法: | 二. 关机: | 三. 重启: | 四. 快速打开文件夹: | 五. 快速输入: | 六. 锁屏: | 七. 配置网络,进行联网: | 八. shell命令处理顺序: | 九. 把标准错误合并到标准输出: | 十. 命令历史: | 十一. 环境变量: | 十二. bash配置文件: | 十三. 什么叫正则表达式? | 十四. 计算机网络: | 十五. arp查看网络: | 十六. nc监听端口,netstat查询端口: | 十七. 修改系统的DNS服务器: | 十八. 五个类别的IP地址: | 十九. TCP连接建立,断开: | 二十. 路由表: | 二十一. 数据包转发: | 二十二. iptables语法 \\\\\\\\\\\\\\\\\\\\/////////////////// 一. 退出终端的三种方法: 1. 执行命令 logout 2. 执行命令 exit 3. 按组合键 Ctrl+D 二. 关机: 1. init 0 2. shutdown -h now (root权限) 三. 重启: 1. reboot 2. init 1 2. shutdown -r now (root权限) 3. shutdown -r 10 (root权限,过10分钟重启) 4. shutdown -r 20:35 (root权限,在20:35重启) 四. 快速打开文件夹: nautilus . 五. 快速输入: 按组合键Ctrl+L可以弹出窗口,用以输入目标目录的位置 六. 锁屏: 1. 组合键Ctrl+Alt+L可用于快速锁屏(推荐) 2. 运行系统菜单项 System -> Lock Screen 七. 配置网络,进行联网: 1. 打开gnome-terminal 2. 切换成root身份 3. 关闭NetworkManager 服务,NetworkManager 服务会干扰网络配置,必须把它关闭 1. service NetworkManager stop 2. chkconfig --level 2345 NetworkManager off 4. 确认网线已经连接好,以eth0 为例 1. ifconfig eth0 up 2. mii-tool eth0 eth0: negotiated 100baseTx-FD flow-control, link ok <-- 网线已经连好 3. mii-tool eth0 eth0: no link <-- 网线没有连好 6. 上面找到的网卡可能不止一个,挑其中一个进行配置即可,用vim命令编辑网卡的配置文件: vim /etc/sysconfig/network-scripts/ifcfg-eth0 按照下面的范例进行修改,然后保存,退出.两条虚线和每一行右边的描述文字不属于配置文件的内容. ------------------------------------------- DEVICE=eth0 <-- 网卡名字 BOOTPROTO=static <-- 使用固定IP NM_CONTROLLED=no ONBOOT=yes <-- 自动启动 TYPE=Ethernet IPADDR=10.1.1.11 <-- IP 地址 NETMASK=255.255.255.0 <-- 子网掩码 GATEWAY=10.1.1.1 <-- 默认网关 DNS1=10.1.1.1 <-- DNS 服务器 ------------------------------------------- 八. shell读取命令行输入后,按以下顺序进行处理: 1. 把变量赋值和重定向的字符保存起来,留到后面使用 2. 执行各种展开操作 (包括命令别名展开,参数/变量展开,等等) 3. 设置重定向 4. 给变量赋值 5. 如果命令名中不包含斜杠,shell会按照这个顺序查找命令,并执行首先找到的命令: 函数 --> 内部命令 --> PATH中的可执行文件 6. 如果命令名中包含了斜杠,shell会把命令名当文件路径,然后去执行该文件 九. 把标准错误合并到标准输出: 1. ls /home /root 1> /tmp/good 2>&1 <-- good 1. 默认值 1 --- 屏幕 2. 1> /tmp/good 1 --- /tmp/good 3. 2>&1 2 --- /tmp/good 2. ls /home /root 2>&1 1> /tmp/good <-- bad 1. 默认值 1 --- 屏幕 2. 2>&1 2 --- 屏幕 3. 1> /tmp/good 1 --- /tmp/good 十. 命令历史: 1. set -o history <-- 启用命令历史功能 2. set +o history <-- 关闭命令历史功能 3. history <-- 显示命令的历史 十一. 环境变量: 1. 环境变量可以被子进程访问; 2. 查看当前的环境变量: env 3. set命令可以列出更多信息; 4. 定义(设置)一个环境变量,用的是命令export,有两种做法: 1. 先定义,后export: TMOUT=300 HISTSIZE=100000 export TMOUT HISTSIZE 2. 一步到位export: export TMOUT=300 HISTSIZE=100000 5. 几个环境变量介绍 1. PATH <-- 影响命令的搜索 2. TMOUT <-- 超时时间 3. PS1 <-- 命令提示符 4. HISTSIZE, HISTFILESIZE, HISTTIMEFORMAT <-- 命令历史 十二. bash配置文件: 1. Bash shell 常用的配置文件有以下几个: 1. /etc/profile <-- 全局配置文件,作用于系统上所有的用户 2. /etc/bashrc <-- 全局配置文件,作用于系统上所有的用户 3. ~/.bash_profile <-- 用户配置文件 4. ~/.bashrc <-- 用户配置文件 5. ~/.bash_logout <-- 用户配置文件 2. 根据shell 的启动方式不同,可以大致地把shell分为以下几种: 1. login shell <-- 在文本界面登录,su -, bash --login 2. interactive shell <-- gnome-terminal 中的shell 3. non-interactive shell <-- 用来运行脚本的shell 3. 在红帽企业版6.3上面,/etc/profile, ~/.bash_profile, ~/.bashrc, /etc/bashrc 这四者的调用关系图如下: login shell interactive shell / \ | / \ | 1 / \ 2 | / \ | / \ v /etc/profile ~/.bash_profile -----> ~/.bashrc -----> /etc/bashrc 1. login shell开始运行时会按顺序读取文件/etc/profile和~/.bash_profile 2. interactive shell 开始运行时会读取文件 ~/.bashrc 3. ~/.bash_profile 会调用~/.bashrc 4. ~/.bashrc 会调用 /etc/bashrc 4. 另外,login shell 退出时会读取文件 ~/.bash_logout 5. 根据以上特点,可以通过修改上面几个配置文件,来修改shell的行为 十三. 什么叫正则表达式? 1. 正规表示法: Regular expression 2. 单个字符表示法: 字符本身 <-- 除了下面的特殊字符之外,字符可以表示其本身 . <-- Any character \d <-- Digit in 0123456789 \D <-- Non-digit \w <-- Word: letters, digits, underscore (_) \W <-- Non-word \t <-- Tab \r <-- Carriage return \n <-- New line \s <-- Whitespace: space, \t, \r, \n \S <-- Non-whitespace [abc] <-- a, or b, or c [a-c] <-- a, or b, or c [0-2] <-- 0, or 1, or 2 [1-3a-cX-Z] <-- 1, 2, 3, a, b, c, X, Y, Z [^abc] <-- Any character except a and b and c [:upper:] <-- Upper case letters, [A-Z] [:lower:] <-- Lower case letters, [a-z] [:alpha:] <-- Alphabetic characters, [a-zA-Z] [:alnum:] <-- Alphanumeric characters, [a-zA-Z0-9] [:digit:] <-- Digits, [0-9] [:xdigit:] <-- Hexadecimal digits, [a-fA-F0-9] [:punct:] <-- Punctuation and symbols, [][!"#$%&'()*+,./:;<=>?@\^_`{|}~-] [:blank:] <-- Space and tab, [ \t] [:space:] <-- All whitespace characters including line breaks, [ \t\r\n\v\f] [:cntrl:] <-- Control characters, [\x00-\x1F\x7F] [:graph:] <-- Visible characters (i.e. anything except spaces, control characters, etc.), [\x21-\x7E] [:print:] <-- Visible characters and spaces (i.e. anything except control characters, etc.), [\x20-\x7E] [:word:] <-- Word characters (letters, numbers and underscores), [a-zA-Z0-9_] [:ascii:] <-- ASCII characters, [\x00-\x7F] 3. 特殊字符表示法 ^$.*+?|\{}[]() 都有特殊意义的,如果需要表示这些符号,则可以用反斜杠对它们进行转义,比如: \. 匹配一个点 \\ 匹配一个反斜杠 \^ \$ 4. 数量表示法, 用来表示前面的一个字符,或者一组字符重复的次数 * <-- 任意次, c >= 0 + <-- 至少1次, c >= 1 ? <-- 0次或者1次, c == 0 || c == 1 {m} <-- m 次, c == m {m,} <-- 至少m 次, c >= m {m,n} <-- m 次至n 次, c >= m && c <= n 1. 默认情况下,数量表示符只作用于前面的【一个】字符,如果需要 作用于前面的多个字符,可以使用(...)把前面的字符括起来 1. ab+ 匹配ab, abb, abbb, abbbb... 2. (ab)+ 匹配ab, abab, ababab, abababab... 2. 默认情况下,数量表示符是最大匹配,好的正则表达式引擎支持用 问号?来启用最小匹配 1. .*b 匹配 aaabababa <-- 最大匹配 ^^^^^^^^ 2. .*?b 匹配 aaabababa <-- 最小匹配 ^^^^ 5. 分组表示法 (abc) <-- 一组连续的字符abc (aa|bb) <-- 一组连续的字符ab 或者 bb 6. 边界表示法 ^ <-- 字符串的开头 $ <-- 字符串的结尾 \b <-- 单词边界 \B <-- 非单词边界 \< <-- 单词左边界 \> <-- 单词右边界 7. 引用表示法,从左边开始数左小括号(openning brace),数字从1开始, 被第一对括号匹配的字符可以用\1 来引用,第二对可以用\2 来引用,以此类推. 1. echo abcabcabcaabb | grep -E '(a(bc)){2}\1' --color abcabcabcaabb 2. echo abcabcabcaabb | grep -E '(a(bc)){2}a\2' --color abcabcabcaabb 3. echo "hello world, hello world, hello beautiful world" | grep -E --color '((hello) (world)), \1, \2 .* \3' hello world, hello world, hello beautiful world 8. 时间表示方法 date | grep --color -oE '([0-1][0-9]|2[0-3])(:[0-5][0-9]){2}' 9. 日期表示方法 echo 2014-07-07 12:30:30 | grep --color -E '[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])' 10. IP的表示方法 ifconfig | grep --color -E '(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])' 11. MAC 地址的表示方法 ifconfig | grep --color -E '([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}' 十四. 计算机网络: 1. 当通过网络安装操作系统时,客户机上的临时系统需要从服务器下载文件,背后的流程是怎样的? 此时客户机和服务器同处一个局域网(在同一个网络中),通信模式是主机 <---> 主机 2. 交换机: 用来连接同一个网络(局域网,本地网络)的主机 3. 当用户从互联网上下载一个文件的时候,背后的流程又是怎样的? 此时客户机和服务器处于不同的网络,情况复杂了一些,通信模式是网络 <---> 网络 4. 路由器用来连接不同的网络 5. 网页浏览器,网卡驱动程序,硬件设备,协议(书面写的协议,和协议的实现,比如程序) 6. 协议的实现(implementation) 1. TCP/IP 协议族: TCP, UDP, IP, ICMP, IGMP, ARP, HTTP, FTP, TFTP, DNS, DHCP 2. TCP/IP 的分层结构 1. 应用层(Application): http, ftp, tftp, dns, dhcp 2. 运输层(transport,传输层): TCP,UDP 在两台主机上的进程之间传输数据 3. 网络层(Internet): IP, IGMP, ICMP 在两台主机之间传输数据 4. 链接层(Link): 负责在局域网(本地网)内的主机之间传输数据 十五. arp查看网络: 1. IP: 10.1.1.1 2. MAC: 1C:6F:65:66:F2:55 3. arp -s 10.1.1.1 1C:6F:65:66:F2:55 4. arp -n 10.1.1.1 5. 快速获取当前局域网里所有主机的MAC地址,假设局域网IP的范围是11至41 for i in {11..41} do ping -c1 -W1 10.1.1.${i} &>/dev/null & done 十六. 用命令nc监听本地的30000端口,然后用netstat列出该记录: 1. nc -l 10.1.1.1 30000 2. netstat -tulpn | grep 30000 十七. 修改系统的DNS服务器: 1. 打开 /etc/resolv.conf vim /etc/resolv.conf 2. 把里面所有的记录删除,然后添加以下一行 nameserver 8.8.8.8 3. 保存退出 十八. 五个类别的IP地址: 1. A类地址首位为0 2. B类地址首两位为10 3. C类地址首三位为110 4. D类地址首四位为1110 5. E类地址首五位为11110 十九. TCP连接建立,断开: 1. TCP 连接的建立: TCP 连接的建立需要经历一个被称为“三次握手”的过程: 2. TCP 连接的断开: TCP 连接的断开,一般需要经历四个阶段,某些情况下是三个阶段. 二十. 路由表操作: 1. IP层在内存中有一个路由表,当需要发送数据包时,它都要对该表搜索一次 1. route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 8.8.8.8 192.168.199.2 255.255.255.255 UGH 0 0 0 eth0 192.168.6.0 0.0.0.0 255.255.255.0 U 0 0 0 vmnet8 192.168.71.0 0.0.0.0 255.255.255.0 U 0 0 0 vmnet1 192.168.199.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 10.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 0.0.0.0 192.168.199.1 0.0.0.0 UG 0 0 0 eth0 标记的含义: U <-- route is up G <-- use gateway H <-- target is a host (没有此标记代表这是到某个网络的路由) 2. 管理路由表 1. route -n <-- 查看 2. route add default gw 10.1.1.1 <-- 添加一条默认路由 3. route del default gw 10.1.1.1 <-- 删除指定的默认路由 4. route add -net 10.1.2.0/24 gw 10.1.1.2 <-- 添加到达指定网络的路由 5. route del -net 10.1.2.0/24 gw 10.1.1.2 <-- 删除达到指定网络的路由 6. route add -host 10.1.3.1 gw 10.1.1.3 <-- 添加到达指定主机的路由 7. route del -host 10.1.3.1 gw 10.1.1.3 <-- 删除达到指定主机的路由 8. route add -net 10.1.2.0/24 dev eth0 <-- 添加一条直连路由 二十一. 数据包转发 1. 当主机收到来自某个网络接口的数据时,它会按照以下方式进行处理: 1. 检查数据中的目的IP是否为本机的IP之一或者广播地址: 1. 是,则把数据送到相应的协议模块进行处理 2. 否,则进入下一步 2. 检查主机是否被设置为路由器: 1. 是,则对数据进行转发 2. 否,丢弃数据 1. 把Linux 系统配置成路由器的步骤 1. 编辑文件:/etc/sysctl.conf net.ipv4.ip_forward = 1 <-- 设置为1,代表启用包转发功能 2. 运行命令sysctl -p使上一个的配置生效 3. 确认防火墙没有阻挡包的转发 1. iptables -F FORWARD 2. iptables -P FORWARD ACCEPT 4. 把当前的iptables 的设置写入配置文件中:service iptables save, 配置将会保存到/etc/sysconfig/iptables 中 二十二. iptables语法 1. 参数列表: -A append, 在链的尾部添加规则 -D delete, 删除规则 -L list, 列出规则 -S list, 列出规则,规则的形式和命令行一样 -n numeric, 以数值显示 -I insert, 在链的指定位置(默认为最前面)插入规则 -v verbose 显示统计数据,与-L一起用,看到的信息更多 --line-numbers 显示规则的序号 -F flush, 用于清空规则 -t table, 表名(比如nat) -P policy, 用于设置链的默认策略 -p protocol, 协议名 --dport destination port, 目标端口 --sport source port, 源端口 -d destination, 目标IP 地址 -s source, 源IP 地址或者网络 -i input interface, 网卡,数据包的来源网卡 -o output interface, 网卡,数据包的目标网卡 -j jump, 动作 2. 动作的分类: ACCEPT 允许 DROP 丢弃数据包,不回应源端 REJECT 丢弃数据包,回应源端 SNAT 源地址转换 DNAT 目标地址转换 MASQUERADE IP 伪装,实质上是SNAT,常用于外网IP 不固定的场合,比如PPP拔号 LOG 记录日志 3. iptables的表: 1. filter (默认的表) 2. nat 4. iptables 匹配规则的顺序是从上往下逐条匹配,找到匹配的条目后就不再继续往下 匹配了,如果没有找到匹配的条目,就按照默认策略处理. 5. 举例: 1. 只允许10.1.1.20 ping,拒绝其他所有IP (注意两条规则的顺序) iptables -A INPUT -p icmp -s 10.1.1.20/32 -j ACCEPT iptables -A INPUT -p icmp -j DROP 2. 把一条规则加到链的最前面 iptables [-t table] -I chain rule-specification iptables -I INPUT -p tcp --dport 22 -j REJECT 3. 把一条规则加到链的指定位置 iptables [-t table] -I chain rulenum rule-specification iptables -I INPUT 2 -p tcp --dport 22 -j REJECT 4. 删除指定的某条规则 iptables [-t table] -D chain rulenum iptables -I INPUT 10 5. 清空规则 iptables [-t table] -F [chain] iptables -F OUTPUT iptables -t nat -F POSTROUTING 6. 多端口的写法 iptables -A INPUT -p tcp --dport 1:1000 -j ACCEPT iptables -A INPUT -p tcp -m multiport --dport 22,80,110 -j ACCEPT 7. 允许对本机的TCP 22, 25, 80 端口的访问 iptables -A INPUT -p tcp -m multiport --dport 22,25,80 -j ACCEPT 8. 记录日志 iptables -A OUTPUT -p udp -d 8.8.8.8 --dport 53 -j LOG --log-prefix "[FWLOG] " 9. 列出某个链中的所有规则 iptables -L <chain> iptables -S <chain> iptables -L INPUT iptables -S INPUT iptables -t nat -L POSTROUTING 10. 显示规则的序号 iptables -L <chain> --line-number 11. 清空某个表中的所有规则 iptables [-t table] -F 12. 设置链的默认规则(策略) iptables [-t table] -P chain target iptables -P INPUT DROPT iptables -P OUTPUT ACCEPT 13. 禁止访问外部加密网页(https) iptables -A OUTPUT -p tcp --dport 443 -j REJECT 14. 有选择地转发数据包 iptables -A FORWARD -s 10.1.2.0/24 -j ACCEPT iptables -A FORWARD -s 10.1.1.0/24 -j REJECT iptables -D FORWARD -p tcp --dport 443 -j DROP iptables -I FORWARD -p tcp --dport 80 -j DROP 15. 匹配网卡 iptables -t nat -A POSTROUTING -o eth1 -s 10.1.2.0/24 -j ACCEPT iptables -A INPUT -i vmnet1 -j ACCEPT 16. 白名单功能 iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT iptables -A OUTPUT -p udp --dport 53 -j ACCEPT iptables -A OUTPUT -j REJECT 6. 把当前的防火墙规则保存到默认位置 (/etc/sysconfig/iptables) service iptables save 7. 把当前的防火墙规则保存到指定的文件中 iptables-save > /somewhere/in/the/system/firewall 8. 可以直接编辑防火墙规则文件 vim /somewhere/in/the/system/firewall 9. 从防火墙规则文件中加载规则,这个动作会把现有的规则清空 iptables-restore < /somewhere/in/the/system/firewall 10. 重启防火墙服务,可以清空当前的防火墙设置,并从默认位置加载规则 (/etc/sysconfig/iptables) service iptables restart