自动登录
SSH提供了公钥登录,可以省去每次登录都要输入的秘密的步骤。
公钥登录原理:
- 用户将自己的公钥存储在远程主机上。
- 登录的时候,远程主机向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。
- 远程主机利用事先存储的公钥进行解密,如果成功,就证明用户是可行的,直接允许登录shell,不再要求输入密码。
SSH提供了公钥登录,可以省去每次登录都要输入的秘密的步骤。
公钥登录原理:
用于输出网络连接,路由表,接口统计,伪连接和广播关系 的信息。
netstat [address_family_options] [--tcp|-t] [--udp|-u] [--raw|-w]
[--listening|-l] [--all|-a] [--numeric|-n] [--numeric-hosts]
[--numeric-ports] [--numeric-users] [--symbolic|-N]
[--extend|-e[--extend|-e]] [--timers|-o] [--program|-p] [--verbose|-v]
[--continuous|-c]
netstat {--route|-r} [address_family_options]
[--extend|-e[--extend|-e]] [--verbose|-v] [--numeric|-n]
[--numeric-hosts] [--numeric-ports] [--numeric-users] [--continuous|-c]
netstat {--interfaces|-i} [--all|-a] [--extend|-e[--extend|-e]] [--ver-
bose|-v] [--program|-p] [--numeric|-n] [--numeric-hosts] [--numeric-
ports] [--numeric-users] [--continuous|-c]
netstat {--groups|-g} [--numeric|-n] [--numeric-hosts]
[--numeric-ports] [--numeric-users] [--continuous|-c]
netstat {--masquerade|-M} [--extend|-e] [--numeric|-n]
[--numeric-hosts] [--numeric-ports] [--numeric-users] [--continuous|-c]
netstat {--statistics|-s} [--tcp|-t] [--udp|-u] [--raw|-w]
netstat {--version|-V}
netstat {--help|-h}
address_family_options:
[-4] [-6] [--protocol={inet,unix,ipx,ax25,netrom,ddp}[,...]]
[--unix|-x] [--inet|--ip] [--ax25] [--ipx] [--netrom] [--ddp]
free 用于查看内存的使用情况,df用于查看文件系统的磁盘空间使用情况。
继续阅读
显示文件或文件系统的状态。
stat [option]... file...
-L, --dereference
:解析链接符号。-f, --file-system
:显示文件系统而不是文件的状态。-c, --format=FORMAT
:使用指定格式FORMAT而不是默认的,在每个FORMAT后面输出一个新行。--printf=FORMAT
:与--format
类似,但解释反斜杠转义,且不输出命令末尾的新行,如果需要新行,在FORMAT里包含\n
。-t, --terse
:输出信息的简洁格式。输出格式的选项参考man文档。
在文件之间创建链接。链接有硬链接、软链接之分。软链接(soft link)也就是符号连接(symbolic link)。
ln [option]... [-T] target link_name
:用link_name创建一个链接到target。ln [option]... target
:在当前目录下创建一个链接到target。ln [option]... target... directory
:为directory目录下的每个target创建链接。ln [option]... -t directory target...
:为directory目录下的每个target创建链接。默认创建硬链接,用 --symbolic
或 -s
选项创建软链接。
当创建硬链接时,每个target必须存在。软链接可以持有任意的文本(指向目的文件的路径),即使target不存在。
-s, --symbolic
:创建软链接,而不是硬链接。-f, --force
:移除已经存在的目的文件。-i, --interactive
:提示是否移除目的文件。-P, --physical
:创建链接文件到链接文件所指向的文件。-t, --target-directory=DIRECTORY
:在制定目录下创建链接文件。-T, --no-target-directory
:把 link_name 作为普通文件对待。--backup[=CONTROL]
:为每个目的文件创建一个备份(创建链接而不是拷贝内容)。-b
:与--backup
一样,但不接收参数。-d, -F, --directory
:允许超级用户尝试硬链接到目录。(可能会因为系统的约束而失败)-S, --suffix=SUFFIX
:覆盖通常的备份后缀。-v, --verbose
:打印每个链接文件的名字。所有的机器都有可能重启,很多应用程序、服务需要在机器启动的时候自动执行,这里记录两种开机执行脚本的方法及相关的一个命令。
在/etc/rc.local
的exit 0
语句之间添加启动脚本。脚本必须具有可执行权限。
创建要开机自动执行的脚本:/home/test/blog/startBlog.sh
,并给予可执行权限:chmod +x /home/test/blog/startBlog.sh
。
在/etc/init.d
目录下创建链接文件到前面的脚本: ln -s /home/test/blog/startBlog.sh /etc/init.d/startBlog
。
进入/etc/init.d
目录,用 update-rc.d
命令将连接文件 startBlog 添加到启动脚本中去:update-rc.d startBlog defaults 99
。
其中的99表示启动顺序,取值范围是0-99
。序号越大的越晚执行。
移除启动的脚本:update-rc.d -f startBlog remove
。
-f
选项表示强制执行。
此命令用于安装或移除System-V风格的初始化脚本连接。脚本是存放在 /etc/init.d/
目录下的,当然可以在此目录创建连接文件连接到存放在其他地方的脚本文件。
此命令可以指定脚本的执行序号,序号的取值范围是 0-99
,序号越大,越迟执行。
update-rc.d [-n] [-f] name remove
用于移除脚本。
update-rc.d [-n] name default [NN | SS KK]
,NN表示执行序号(0-99),SS表示启动时的执行序号,KK表示关机时的执行序号,SS、KK主要用于在脚本直接的执行顺序上有依赖关系的情况下。
-n
:不做任何事情,只显示将要做的。(预览、做测试)-f
:强制移除符号连接,即使 /etc/init.d/script-name
仍然存在。update-rc.d startBlog defaults 99
:添加一个启动连接,执行序号是99。
如果执行脚本B需要先执行脚本A,如下设置(A的启动顺序比B的小,结束顺序比B的大):
update-rc.d script_for_A defaults 80 20
update-rc.d script_for_B defaults 90 10
添加一个不被其他任何服务需要的服务:update-rc.d script_name defaults 98 02
,
添加一个需要 开始/结束 序号在20的服务的服务:update-rc.d script_depends_on_service_20 default 21 19
。
移除一个脚本,假定/etc/init.d/
目录下的脚本文件已先被删除:update-rc.d script_name remove
。
移除一个脚本,不管/etc/init.d/
目录下的脚本文件是否已删除:update-rc.d -f script_name remove
。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。
周期性地执行给定的命令,并全屏输出命令执行结果。可以用 Ctrl-c
来终止watch命令。
watch [-bdehpvtx] [-n seconds] [--beep] [--color] [--defferences[cumulative]] [--errexit] [--exec] [--help] [--interval=seconds] [--no-title] [--precise] [--version] command
command默认是交给 sh -c
执行的,有时候需要用引号来明确命令。
-n seconds, --interval=seconds
:每隔指定的秒执行命令。这个间隔是指命令上一次结束到下一次开始执行之间的间隔。默认2秒。-p, --precise
:让watch尝试每隔指定的秒执行命令,这样间隔不包括执行命令所用时间。只是尽力而为的准确。-e, --errexit
:命令执行出错(返回值非0)时退出watch命令。-t, --no-title
:watch不在首行显示执行间隔、命令、当前时间和后面的空行。-b, --beep
:如果command执行返回值非0,beep。-d, --defferences
:高亮两次成功执行结果之间的差异。-x, --exec
:把command交给 exec
命令执行。watch -n 5 df -h
:每隔5秒查看磁盘的空间大小。
watch -d ls -l
:每隔2秒高亮输出两次ls之间的差异。
watch -d 'ls -l | grep text'
:注意单引号的使用。
注意watch -n 10 sleep 1
和 watch -p -n 10 sleep 1
的区别,前者每隔11秒执行一次,后者每隔10秒执行一次,-p
选项尽量减去命令的执行时间。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。
列出所有打开的文件。
-a
:表示所有选项都必须满足时才显示结果。逻辑与。-c string
:显示COMMAND列中包含指定字符的进程打开的所有文件。-u user
:列出指定用户打开的文件。在用户名前面加^
标识排除指定用户的。-g gid
:用户组gid所打开的文件信息。-p pid
:按pid搜索。进程号前面加^
表示排除指定进程打开的文件。-d fd
:根据文件描述符列出对应文件信息。可以用-
指定一个FD的开头范围。+d dir
:显示dir目录下被进程打开的文件。+D dir
:显示dir目录(包括子目录)下被进程打开的文件。(Ubuntu12.04下跟+d
没区别)-n
:不将IP转换为hostname,缺省是不加-n
选项的。-s
:列出打开文件的大小,如果没有大小,则留下空白。-i [46] [protocol][@hostname|hostaddr] [:service|port]
46
:表示ipv4或ipv6。protocol
:可以是TCP或UDP。hostname
:因特网主机名。service
:/etc/service
文件中的service name,可以不止一个,可以用逗号,
分隔多个。port
:端口号,可以不止一个,可以用-
表示一个端口范围,或用逗号,
分隔多个。lsof -i :80,9000
:查看80和9000端口的运行情况。
lsof -a -u php -i :80,9000
:查看属于php用户的进程在80和9000端口的运行情况。
lsof filename
:查看正在使用filename的进程。
lsof -c php -c nginx
:列出多个进程(php、nginx)打开的文件信息。
lsof -i tcp
:列出所有tcp连接信息。
lsof -d 2
:根据文件描述符列出对应文件信息,此例显示文件描述符以2开头的文件信息。
lsof -d 2-4
:根据文件描述符列出对应文件信息,此例显示文件描述符以2、3、4开头的文件信息。
lsof +d /dev/
:列出/dev/目录的被打开的文件信息,不包括子目录下的。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。
函数是一些命令的集合,用一个名称做代表,称为函数名。
函数的最大作用就是让程序模块化。
Bash调用函数时不会开启新的shell,会在现有shell环境中执行该函数。
有3种写法,推荐用第2种。
function funcName() {
cmds...
}
funcName() {
cmds...
}
function funcName {
cmds...
}
函数调用直接写出函数名称即可,如果有参数,写在函数名称后面,空格分隔。
funcName
funcName paramVal1 paramVal2 paramVal3
unset -f funcName
在函数执行期间,Bash会建立一个特别的变量FUNCNAME
,值为函数名称。
执行函数时,函数中最后一个命令的返回值代表函数的结束状态,如果遇到return命令,则立即返回,return命令可以指定函数的返回值。
函数仅在定义的shell环境中有效,如果要传递函数给子shell环境使用,需要使用命令export
及其选项-f
:export -f funcName
。
变量的作用域默认是全局的。可用local
将变量设置为函数私有的。
函数的参数借用了命令行的位置参数的概念,用来传递变量值。
当函数借用命令行的位置参数时,原位置参数值会被暂时保存起来,等到函数执行结束,会再复原其值。
shift [n]
:往前移动位置参数的值,移动n个单位,n默认是1。
set val1 val2 ...
:set命令设定位置参数的值,按顺序将对应的值传给 $1, $2, $3, ....
。
如果要一次重置所有的位置参数,使其值为空,可执行:set --
。
使用内置命令getopts:getopts 选项行 选项变量
。其中的选项行由单一字符组成。
如果某个选项需要提供一个参数,则在选项字符后方接上冒号:
,当选项没有提供额外的参数时,Bash就会提示错误信息,如果不想出现错误信息,可在选项行的最前面加上冒号:
。
选项变量的作用:getopts由命令行取得选项,把它放入选项变量中,如果该选项需要额外的参数,参数值会放入OPTARG
变量中。
iptables是设置包过滤规则的工具,真正提供过滤功能的是Netfilter。
在Linux内核设立检查点(hook),供核心模块注册使用,这样便可对网络层中每一个通过检查点的包进行过滤,决定要允许通过或予以丢弃。
由于内核的子系统位于系统保护区,用户无法直接操作,Netfilter便提供一个用户态空间下的工具iptables,利用iptables便可以在各个检查点建立规则,对包进行过滤。
ubuntu下没有关闭iptables的方法,只能通过清除规则来完成,不过在清除规则之前要确保所有表的所有链的默认处置都是ACCEPT,免得连不上机器。
iptables内置有3个表(table),分别是filter、nat、mangle。各表内置有若干个链(chain)。
对每一个报文,iptables依次测试每一条规则,看报文与规则是否相匹配。一旦找到一条匹配的规则,就根据此规则中指定的行动,对报文进行处置,而对后面的规则不再进行测试。
主要用来过滤包,是iptables默认的规则表。filter表内置的链:
链 说明
INPUT 过滤目的地是本机的包
FORWARD 不是本机产生的包,目的地是其他主机
OUTPUT 过滤本机产生的包
主要作用是包地址转换。nat表内置的链有:
链 说明
PREROUTING 包到达网络接口时,改写其目的地址
OUTPUT 改写本机产生的包的目的地址
POSTROUTING 包要离开主机前,改写其来源地址
主要作用是修改包的表头和内容,如改变MARK、TOS和TTL等。内置的链有:
链 说明
PREROUTING 进入防火墙后、路由判断前,对包进行修改
INPUT 包经过路由判断后,在本机进程接收到它之前,对包进行修改
OUTPUT 本机产生的包,在决定包目的地址之后,对包进行修改
FORWARD 路由判断之后,要到另一个接口之前,对包进行修改
POSTROUTING 路由判断之后,要离开主机之前,对包进行修改
iptables的语法由3部分组成:iptables命令本身、条件判断、对包的处置方式(称为target)。
注意:所有链 名必须大写,表名必须小写,动作必须大写,匹配必须小写
-A
:向规则链中添加一个规则,默认被添加到末尾。-T
:指定要操作的表,默认是filter。-D
:从规则链中删除规则,可以指定序号或者匹配的规则来删除。例如 iptables -D INPUT 3
(按号码匹配)将删除 filter 表 INPUT 链中的第三条规则(不管它的内容是什么) -R
:进行规则替换。例如 iptables -R INPUT 9 -j ACCEPT
将原来编号为 9 的规则内容替换为“-j ACCEPT”。-I
:插入一条规则,默认被插入到首部。-F
:清空所选的链,重启后恢复。-P
:设置某个链的默认规则。如iptables -P INPUT DROP
将filter表的INPUT链的默认规则设为DROP。-N
:新建用户自定义的规则链。-X
:删除用户自定义的规则链。-p
:对比协议,可以是tcp, udp, icmp
等,也可以是数字的协议号。-s
:指定源地址。-d
:指定目的地址。-i
:进入接口。-o
:流出接口。-j
:采取的动作。可以是ACCEPT, DROP, SNAT, DNAT, MASQUERADE
。-sport port
:源端口。-dport port
:目的端口,端口必须和协议一起配合使用。--tcp-flags
:对比TCP状态,可以有:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送)等,还可以使用ALL、NONE进行对比。例如:iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
。--icmp-type
:对比ICMP的类型编号,可以使用代码或数字编号进行对比。如:iptables -A INPUT -p icmp --icmp-type 8
。-m limit --limit
:用来对比某段时间内包的平均流量。iptables -A INPUT -m limit --limit 3/sec
用来对比每秒平均流量是否超过一次3个包。-m state --state
:根据状态进行对比。如iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
允许已建立的连接接收数据。在添加的规则时,REJECT
(拒绝)目标和 DROP
(放弃)目标这两种行动有所不同。REJECT
会拒绝目标分组的进入,并给企图连接服务的用户返回一个 connection refused
的错误消息。DROP
会放弃分组,而对 telnet 用户不发出任何警告。
机器重启后,iptables中的配置信息会被清空。iptables-save
和iptables-restore
是用来保存和恢复设置的。 可以在/etc/network/interfaces文件中添加2行:
pre-up iptables-restore < /etc/iptables.up.rules
post-down iptables-save > /etc/iptables.up.rules