archive ``` #!/bin/bash #archive #lm read -p "please input save filename:" filename read -p "please input need archive file:" file read -p "please choose archive or commpress(a:archive|gzip|bzip2|xz):" fmart case $fmart in a|archive) tar -cf ${filename}.tar $file &>/dev/null ;; gzip) tar -zcf ${filename}.tar.gz $file &>/dev/null ;; bzip2) tar -jcf ${filename}.tar.bz2 $file &>/dev/null ;; xz) tar -Jcf ${filename}.tar.xz $file &>/dev/null ;; *) echo "Unknow options." esac ``` shell脚本 2017-03-04 评论 1702 次浏览
showlog ``` #!/bin/bash #showlog.sh #lm v=0 c=0 n=`who |wc -l` for i in `seq 0 $#`;do if [ $1 ]; then case $1 in -v) v=1 shift ;; -c) c=1 shift ;; -h|--help) echo "Usage:`basename $0` -v | -c | -h" exit 0 ;; *) echo "Usage:`basename $0` -v | -c | -h" exit 7 ;; esac fi done if [ $c -eq 1 ]; then [ $v -eq 1 ] && echo "They users:$n" && echo "They are:" && who [ $v -eq 0 ] && echo "They users:$n" exit 0 fi ``` shell脚本 2017-03-03 评论 1746 次浏览
test -add & -del & -h|--help & -v|--verbose ``` #!/bin/bash #test -add & -del & -h|--help & -v|--verbose etc #lm v=0 add=0 del=0 for i in `seq 0 $#`; do if [ $1 ]; then case $1 in -v|--verbose) v=1 shift ;; -add) add=1 addusers=$2 shift 2 ;; -del) del=1 delusers=$2 shift 2 ;; -h|--help) echo "Usage:`basename $0` -v -add username1,username2..|-del username1,username2..|-h|--help" exit 0 ;; *) echo "Usage:`basename $0` -v -add username1,username2..|-del username1,username2..|-h|--help" exit 7 ;; esac else break fi done echo "$v,$add,$del" if [ $add -eq 1 ]; then for a in `echo $addusers |sed a@,@ @g`;do if `id $a &>/dev/null`; then echo "$s is exists." else [ $v -eq 1 ] && useradd $a [ $v -eq 0 ] && useradd $a &>/dev/null [ $v -eq 1 ] && echo $a |passwd --stdin $a [ $v -eq 0 ] && echo $a |passwd --stdin $a &>/dev/null fi done exit 0 fi if [ $del -eq 1 ]; then for b in `echo $delusers |sed s@,@ @g`; do if `id $b &>/dev/null`;then userdel -r $b [ $v -eq 1 ] && echo "$b is delete." else echo "$b is not exists." fi done exit 0 fi ``` shell脚本 2017-03-02 评论 1750 次浏览
add user ``` #!/bin/bash #version:0.0.2 #Auther:stone #Discription:add user and password. if [ $UID -ne 0 ]; then echo -e "\033[31mOnly root exec!\033[0m" fi echo -n "please input needs users:" read username if [ -z "$username" ]; then echo "please input a arguments!" else for i in $username; do if id $i &>/dev/null; then echo -e "\033[31m$i exists!\033[0m" else [ -z "$(echo $i |sed 's/[0-9]//g')" ] && echo -e "\033[31m$i is number!$i not create!\033[0m" && continue useradd $i &>/dev/null [ $? -ne 0 ] && echo -e "\033[31madd user fail\033[0m" echo "$i" |passwd --stdin $i &>/dev/null echo -e "\033[32m$i is ok!\033[0m" fi done fi ``` shell脚本 2017-03-02 评论 1719 次浏览
第七十六讲——加密类型机器算法(粗略涉及) TCP/IP中不提供任何加密协议,传输都是以明文的方式,就像明信片的方式传输,其他人可以查看其中的信息。 数据传输的机密性:明文传输有(ftp/http/smtp/telent) 数据传输的完整性:无论是别人篡改,还是在传输过程中由于信号问题导致数据错乱,我们都拒绝使用这样的数据,这样就能够保证数据的完整性,但是数据的完整性并不意味着全部的问题。 身份的认证:即身份的验证,在建立联系的时候能够有一种有效的手段来保证它就是所声称的那个人,这个过程就是身份验证的问题。 如何保证数据的机密性?一般来说,我们会对数据进行一定程度的处理,让人从表面的数据上猜测不出来其中的意思,这样的过程就是加密,加密本身就是一种转换规则,这种转换规则能够将我们输入的数据转换成一堆杂乱无章的难以识别的数据。 加密过程:明文(plaintext)---->(转换规则) 密文(ciphertext) 解密过程:密文(ciphertext) --->(转换规则) 明文(plaintext) 转换算法: 互联网安全体系结构设计中的一种基本法则,保证数据机密性的不是算法本身,而是秘钥,我们是依靠秘钥来保证数据的安全性的,这样一来即使得到了转换的规则但是没有秘钥也无法将密文转换成明文。 我们更换密钥是相当简单的,但是更换算法相当麻烦,而且算法是有限的,也不是说能设计就能够设计出来的,转换算法本身是复杂的数学运算实现的,一般来说,算法都是由数学家设计的,设计一个算法需要很长的时间,需要考虑各种因素,还要进行全方位的测试,还要考虑到计算能力的发展速度,几十年内会不会被破解,所以数据的安全性不是依赖算法,二是依赖秘钥,当然,算法是基础。 最初的时候TCP/IP协议设计的时候只是为了将两台计算机连接起来,并没有考虑到安全性的问题。 先讲一讲对称加密算法: 为什么叫对称加密算法?原因就是这个算法提供一个黑盒子,但是需要用户提供密钥,加密解密都是同一个密钥,所以才称为对称加密算法。 对称加密算法的特点是加密速度很快,但是其安全性几乎完全依靠秘钥。在通信对象很多的时候,对称加密算法无法完成有效的秘钥管理。 所以说对称加密算法在一定程度上解决了数据机密性的问题,但是没有办法帮助用户解决秘钥有效管理的问题。 数据完整性的问题:保证数据的完整性。 使用单项加密提取数据的指纹(特征码),将特征码附加在明文的后面,而后进行传递明文,以确定这串明文还是之前的那一段,没有被修改过。那么怎么去确定这段明文没有被修改过? 我们可以使用同样的加密算法对明文进行特征码的提取,并与接的特征码进行比较,如果特征码相同,则数据没有被修改。 单项加密的特性: 输入一样,输出必然一样。 雪崩效应,输入的一些微小改变,将会引起结果的巨大改变,避免密码的暴力破解。 定长输出,无论原始数据的大小,结果都是相同的 不可逆,单项加密的过程是不可逆的,也就是说无法根据特征码还原数据。 但是我们在传输的过程中有可能会因为传输设备的原因造成特征码或者数据的改变,造成提取的特征码与原特征码不相符,这样的情况数据就会拒绝接受。 我们需要防范中间人攻击,所以数据机密性手段并不能保证机密性本身,还需要借助额外的其他机制,将生成的特征码加密处理,用于数据完整性的校验。 还可以协商生成密码:密钥交换(IKE internet key exchange) Diffie-Heliman协议,是著名的互联网交换协议算法,其交换的过程如下: A----->B p、g(大素数,生成数[生成其它数]) p、g在换联网差UN蔬果称中国是可见的。 A主机在本地选择一个随机数x B主机在本地选择一个随机数y 且A主机不知道y,B不知道x。 A:g^x%p g的x次方对p取模 B:g^y%p g的y次方对p取模 根据离散对数原理,此时A只知道x,但是获取到了g^y%p的值B只知道y,但是获取到了g^x%p的值。由此我们可以列出一组方程 A:(g^y%p)^x=g^xy%p B:(g^x%p)^y=g^xy%p 我们可以看到,经过计算后A和B主机得到了相同的值,这个值就是秘钥。 这种算法的出现使得双方的秘钥交换变得十分简便,虽然解决了密码的问题但是却不能进行身份的验证。这种需求催生出了非对称加密算法的产生,也就是公钥算法。 公钥是从私钥中提取出来的,为了保证其安全性,私钥一般很长,使用公钥加密的只能使用私钥解密,使用私钥加密的只能使用公钥解密。 非对称加密算法中,公钥是公开的,所有人都知道,发送方使用的私钥能够实现身份的验证,发送方使用对方的公钥加密可以保证数据的机密性,公钥算法很少用来加密数据,因为其加密速度太慢,一般用于实现身份的验证。 于是,有了公钥算法之后,我们就可以将数据的特征码使用私钥加密,所有人都能够解密,但是不能够还原回去,这样结合起来就完成了数据的完整性和身份的验证。 但是公钥的获取成了一个难题,怎么在能知道这个公钥是不是对方的?为了解决这个问题,借助第三方机构进行认证。用户将自己的公钥提供给第三方机构,由第三方机构进行公证,制作一个数字证书,通信双方都有相同的证书机构发证机关的安全性很重要,因为我们需要自己去copy一份,合作和提交自己的公钥制作好之后下发,但是这个是收费的服务,而且费用不菲。 给自己讲linux 2017-02-14 评论 2319 次浏览
第七十五讲——常见系统故障的排除 我们首先要确定问题的故障特征 重现故障 实用工具收集进一步的信息 排除不可能的原因 定位故障 先从简单的问题入手 一次尝试一种方式 我们要记住两点: 一是修改配置文件的时候一定要备份源文件!! 二是尽可能的借助于工具,可以是命令,也可以是专门的诊断工具。 可能出现的故障: 管理员密码忘记 系统无法正常启动,可能是grub损坏(MBR损坏,grub配置文件丢失),还可能是系统初始化故障(某文件系统无法正常挂载,例如网络文件系统不在线,驱动不兼容),服务故障,用户无法登陆操作系统(bahs故障)。 命令无法运行:环境变量配置有误 编译过程无法继续:开发环境缺少组件。 MBR损坏时我们可以借助其他主机进行修复,还可以进入紧急救援模式。 boot.iso必须要有主机提供安装环境 使用完整的系统安装光盘 boot:linux rescue进入紧急救援模式,类似于win PE,但是要实现一些功能可能需要切换到真正的根下。 我们先以只读的方式将根文件系统挂载到/mnt/sysimage,如果我们需要对根文件系统中的文件进行操作,则要挂载为读写。 在紧急救援模式下没有设备文件。 #mknod 创建设备文件 说到这里多说一句,一定要了解一个版本控制工具(软件),svn、git su switch user切换用户 sudo CAMMOND切换用户后执行命令,即一个用户以另一个用户的身份执行命令,但是在命令执行的那一刻是以另一个用户的身份运行的,不切换用户。sudo可以实现某个用户能够以另一个用户的身份通过某主机执行某命令。 sudo还提供安全认证方式,在执行命令时需提供密码认证,防范其他人冒充执行相应的命令。 管理员和其他用户的所有命令都可以授权给其他用户执行,但一般来说,sudo命令是由管理员的身份执行一些管理类的命令。 谁可以以另一个身份执行什么样的命令的定义,通常保存在我们系统当中的sudo的配置文件当中。 /etc/sudoers 权限为400 只有root用户和root组中的用户才能查看其中的内容。 我们可以使用vim对/etc/sudoers文件进行编辑,但是我们不建议,因为直接编辑我无法检查其中的语法结构的正确与否,错误的语法会导致其他用户无法执行命令,严重的还会导致系统崩溃。 因此,sudo专门有一个visudo专门用于编辑/etc/sudoers,visudo这个命令本身能够检查/etc/sudoers文件本身的语法。 /etc/sudoers文件每一行为一个条目,定义了谁在哪个主机上执行什么命令(从远程连接到本机执行的命令)。 who which_host=(runas) command 定义别的主机可以远程在本机执行的命令: root ALL=(all) ALL 即管理员可以以任意身份执行任意命令。 为了方便管理sudo,提供别名的机制,类似定义了组,只不过sudo中应为别名。 sudo支持4类别用: 一是用户别名,一次定义一堆这样的用户拥有相同的权限。 #who user_alisa 主机别名,定义一个主机组,可以在一堆主机上执行。 #whitch_host host_alisa runas,表示以哪个用户的身份执行。 runas_alias 执行的命令:command cmmd_alias 别人定义遵循EBNF语法结构,EBNF是一种描述性的语言,这种描述性,这种描述性语言可以定义一个宏,它的取值可以是什么样的取值。 无论是哪一种别名,我们在定义别名的时候,别名的名字全部都需要使用大写英文字母的组合。 用户别名,一般来说可以包括当前系统上的用户。 user_alias(关键字) 除了可以定义用户,还可以定义组,在定义组的时候只需在组名前加百分号‘%’, %组名 用户别名中还可以包含已经定义好的用户别名,也就是别名可以嵌套。 主机别名:可以加‘!’进行取反 主机名 IP地址 网络地址 掩码可以是255.255.255.0或者24,数字。 其他的主机别名(嵌套)。 runas 别名,以那些用户的身份来执行命令。 可以是用户名 也可以是#uid %grup 其他的runas别名。 command别名 命令最后使用绝对路径 cmnd_alias 命令路径 目录(目录下的所有命令) 其他已定义的命令别名。 我们在执行sudo后的五分钟之内,不需要再次使用密码确认,所以其默认的时间为5分钟。 sudo –k(小写) 下一次使用sudo会重新要求输入密码,即sudo只生效一次。 sudo –l 列出当前用户所有可以使用的sudo类的命令。 -k 使认证信息仅当前有效。 作为管理员,我们也可以定义执行sudo命令,不需要输入密码确认,在命令前加上标签TAG: TAG: 使用冒号隔开 标签中最为著名的为NOPASSWD,标签之后的所有命令的执行都不需要再输入密码确认,如果某个命令需要定义密码,将命令拿出来使用passwd定义标签,PASSWD:COMMAND 如果我们有很多的命令,则完全可以进行别名的定义,将需要密码和不需要密码的命令进行区分,我们需要注意的是,PASSWD等标签不能再写入其中。 在命令前加‘!’感叹号,表示不执行此命令,取反的优先级最高。 我们要知道passwd命令很强大,如果passwd是以root身份运行,是可以修改root密码的,因此要将/usr/bin/passwd排除在外。 !/usr/bin/passwd 感叹号为不允许执行,取反的优先级是最高的。 sudo /usr/bin/passwd 不跟参数时默认为修改管理员的密码,sudo是以root的身份运行的,简单的取反是不能够完全阻止root密码的修改,因此/usr/bin/passwd后面必须要跟一个字符,格式如下: /usr/bin/passwd [A-Za-z]*,!/usr/bin/passwdroot 即允许/usr/bin/passwd的执行,但是必须要有参数,且参数不能为root 任何用户使用sudo命令操作都会记录到日志当中。 给自己讲linux 2017-02-13 评论 2353 次浏览