教程
信息差
资源
软件工具
技术笔记
AIGC
视频
Search
1
使用AI实现高精度钢琴曲转谱Piano Transcription简明使用教程
37,794 阅读
2
使用ESP8266Wifi模块制作Wifi杀手
37,467 阅读
3
unravel 让图片唱歌详细教程 Real Time Image Animation 项目
27,386 阅读
4
佳能相机刷Magic Lantern魔灯固件
23,503 阅读
5
战地3 正版账号免费分享!
16,213 阅读
教程
信息差
资源
软件工具
技术笔记
AIGC
视频
Search
标签搜索
python
前端
环境搭建
空镜素材
Ubuntu
markdown
神器
黑苹果
编码
技巧
Git
数据库
开发
下载工具
Youtube
CDN
PDF
OST
电影原声带
音乐
易小灯塔
累计撰写
176
篇文章
累计收到
44
条评论
首页
栏目
教程
信息差
资源
软件工具
技术笔记
AIGC
视频
页面
搜索到
175
篇与
的结果
2018-03-05
linux服务器SSH远程连接
使用SSH服务,需要安装相应的服务器和客户端。客户端和服务器的关系:如果,A机器想被B机器远程控制,那么,A机器需要安装SSH服务器,B机器需要安装SSH客户端。Linux平台下,一般自带SSH客户端,用户只需安装服务器即可。ssh服务器安装:$ sudo apt-get install openssh-server SSH远程连接操作命令:ssh 用户名@IP使用ssh访问,如访问出现错误。可查看是否有该文件 ~/.ssh/known_ssh 尝试删除该文件解决远程传输文件1) Linux平台相互传输(1)scp命令ssh提供了一些命令和shell用来登录远程服务器。在默认情况下,不允许用户拷贝文件,但还是提供了一个“scp”命令。使用scp命令的前提条件要求目标主机已经成功安装openssh-server。 参数 含义 RemoteUserName 远程用户名 RemoteHostIp 远程ip RemoteFile 远程文件,可带上路径 FileName 拷贝到本地后的名字,可带上路径,不带路径拷贝到当前目录 本地文件复制到远程:scp 本地文件名 远程用户名@远程ip:远程文件 本地目录复制到远程:scp -r FolderName RemoteUserName@RemoteHostIp:RemoteFolder 远程文件复制到本地:scp RemoteUserName@RemoteHostIp:RemoteFile FileName 远程目录复制到本地:scp -r RemoteUserName@RemoteHostIp:RemoteFolder FolderName 注意:拷贝单个文件可以不加 -r 参数,拷贝目录必须要加。
2018年03月05日
2,323 阅读
0 评论
0 点赞
2018-02-24
富文本编辑器 xss 攻击的防御
普通xss 攻击,通过html 转义就可以很好地解决但是富文本编辑器,本身就是允许输入html 标签的,不能转义需要引入第三方防止xss的包来处理,对文章内html 进行处理安装NPM$ npm install xss Bower$ bower install xss 或者$ bower install https://github.com/leizongmin/js-xss.git 使用方法在Node.js中使用var xss = require('xss'); var html = xss('<script>alert("xss");</script>'); console.log(html); 在浏览器端使用Shim模式(参考文件 test/test.html):<script src="https://raw.github.com/leizongmin/js-xss/master/dist/xss.js"></script> <script> // 使用函数名 filterXSS,用法一样 var html = filterXSS('<script>alert("xss");</scr' + 'ipt>'); alert(html); </script> AMD模式(参考文件 test/test_amd.html):<script> require.config({ baseUrl: './' }) require(['xss'], function (xss) { var html = xss('<script>alert("xss");</scr' + 'ipt>'); alert(html); }); </script>
2018年02月24日
8,661 阅读
0 评论
0 点赞
2018-02-23
了解CRLF注入漏洞
CRLF是“回车+换行”(\r\n)的简称,其十六进制编码分别为0x0d和0x0a。在HTTP协议中,HTTP header与HTTP Body是用两个CRLF分隔的,浏览器就是根据这两个CRLF来取出HTTP内容并显示出来。所以,一旦我们能够控制HTTP消息头中的字符,注入一些恶意的换行,这样我们就能注入一些会话Cookie或者HTML代码。CRLF漏洞常出现在Location与Set-cookie消息头中。1.通过CRLF注入构造会话固定漏洞请求参数:`http://www.sina.com%0aSet-cookie:sessionid%3Dwoyun服务器返回:HTTP/1.1 200 OK Location:http://www.sina.com Set-cookie:sessionid=woyun 2.通过CRLF注入消息头引发XSS漏洞在请求参数中插入CRLF字符:?email=a%0d%0a%0d%0a<script>alert(/xss/);</script>服务器返回:HTTP/1.1 200 OK Set-Cookie:de=a <script>alert(/xss/);</script> 原理:服务器端没有过滤\r\n,而又把用户输入的数据放在HTTP头中,从而导致安全隐患。3.浏览器的Filter是浏览器应对一些反射型XSS做的保护策略,当url中包含XSS相关特征的时候就会过滤掉不显示在页面中。通过在数据包中http头中注入X-XSS-Protection: 0,关闭IE8的XSS Filter功能。?url=%0aX-XSS-Protection:%200%0d%0a%0d%0a<img%20src=1%20onerror=alert(/xss/)> 对抗CRLF只需过滤掉"\r","\n"之类的换行符即可
2018年02月23日
2,879 阅读
0 评论
0 点赞
2018-02-22
重启nginx后丢失nginx.pid的解决方法
有时候我们执行下面操作时 会报错$ sudo ~/data/nginx/sbin/nginx -s reload nginx: [error] open() "~/data/nginx/logs/nginx.pid" failed (2: No such file or directory) 这时候只要执行下面即可解决$ sudo ~/data/nginx/sbin/nginx -c ~/data/nginx/conf/nginx.conf 重新运行命令, 发现不会报错了$ sudo ~/data/nginx/sbin/nginx -s reload
2018年02月22日
5,416 阅读
0 评论
5 点赞
2018-02-19
Typora:简洁好用跨平台的MarkDown编辑器
Typora:简洁好用跨平台的MarkDown编辑器用过几个markdown编辑器都不怎么顺手, 看到 Typora让我惊艳的一番. 渲染速度好快, 自带中文支持, windows/linux/mac都支持, 最重要的是还是免费的!!作为一款合格的 Markdown 编辑器,Typora 支持图片、列表、表格、代码、公式、目录等功能,并且有多种主题模板,默认主题依旧来自 Github… 确定也是有的:字数很多的时候会卡, 可以使用分文件的形式解决导出为html和pdf不是很完美,不过这个可以用别的导出工具解决除了这两个缺点简直就是我用过最好用的markdown编辑器了
2018年02月19日
2,950 阅读
0 评论
16 点赞
2018-02-17
Linux Shell编程学习笔记 01
什么是shell?在计算器科学中, shell就是一个命令解释器shell是位于操作系统和应用程序之间, 是他们二者之间最主要的接口.shell负责把应用程序的输入命令信息解释给操作系统, 将操作系统指令处理后的结果解释给应用程序.# 查看当前系统默认的shell类型 echo $SHELL # 查看当前系统环境支持的shell cat /etc/shells shell脚本当可执行的linux命令或语句不在终端执行, 而是通过一个文件执行时, 我们称之为shell脚本shell脚本后缀是.shvi创建一个新文件vi xx.sh, 内容如下#!/bin/bash echo "hello" # 输出 s="world" # 赋值(注意=号前后不能有空格) echo $s # 打印变量s的内容 保存之后, chmod +x 添加执行权限, 输入 ./xx.sh运行, 输出root@DESKTOP-0GN45AJ:/mnt/c/Users/admin/Desktop/shell# ./xx.sh hello world 开头的#!字符又称为幻数, 在执行bash脚本的时候, 内核会根据#!后的解释器来确定该用那个程序解释这个脚本的内容.注意: 这一行必须写在第一行, 如果不是第一行则为脚本注释注释# 单行注释 # 多行注释有两种方法::<<! ... ! 和 :<<字符 ... 字符 #!/bin/bash :<<! echo 'hello' echo 'world' ! echo 'nihao' 老版本的shell有严重的安全漏洞, 比如破壳漏洞. 利用此漏洞攻击者能获取服务器的控制权. 所以建议升级bash到最新的版本, centos升级的方法为yum -y update bash rpm -qa bash centos和ubuntu默认的shell都是bash, 在写shell脚本的时候, 开头可以不写#!/bin/bash, 也会交给bash解释, 成功执行, 但是为了避免执行的结果不是你想要的, 最好还是指定解释器.不管什么脚本, 最好都应该加上相应的开头解释器标识, 这是一个良好的编程习惯.shell的脚本执行shell脚本执行时, 会先查找系统环境变量, ENV, 该变量指定了指定环境文件, 加载顺序通常为/etc/profile ~/.bash_profile ~/.bashrc /etc/bashrc ... 加载环境变量后, shell就会执行shell脚本中的内容shell脚本从上到下, 从左到右的顺序执行每一条语句, 如果有嵌套, 会执行子脚本里的语句.没有权限的脚本不能直接被执行, 给脚本添加执行权限后, 就可以执行了chmod u+x xx.sh 脚本本身没执行权限或者没有解释器的可以使用bash 文件名 执行shell脚本开发的基本规范shell脚本的开发规范非常重要, 虽然可以不遵守, 但是当许多人协作开发的时候, 互相遵守规范就显得很重要了.即使是一个人开发, 最好也采取固定的一套方案, 这样的脚本会更易读, 更易于后期维护. shell脚本的第一行是指定脚本解释器 shell脚本的开头会加版本, 版权等信息 可修改~/.vimrc配置文件vim编辑文件时自动加上以上信息 脚本名, 功能, 编写时间, 编写人, 联系方式等 在shell脚本中尽量不要使用中文(不限于注释)如果非要使用中文, 可以执行字符集如`export LANG="zh_CN.UTF-8" shell脚本的命名应该以.sh为扩展名, 取名最好能表明脚本的功能 shel脚本应该存放在固定的路径下 shell的变量shell变量包括两个部分变量名 不变 变量值 变化 变量名就是存放变量值的容器,容器不变但里边的东西可变shell中的变量分类1. 本地变量 2. 全局变量 3. 内置变量 普通变量的定义方式 变量名=变量值 变量值必须是连续的, 不能有空格, 不能有特殊字符age=123 echo $age #输出 123 变量名='变量值' 变量值可以是不连续的, 能用空格 特殊字符原样, 引号里是什么就是什么age=123 name_second='$age' echo $name_second #输出 $age 变量名="变量值" 值可以不连续如果值中使用已经定义的变量, 会先调用在赋值age=123 name_second='$age' age_second="$age" echo $age_second #输出 123 命令变量的定义方式1. 变量名=``命令`` 2. 变量名=$(命令) 执行顺序: 先运行命令, 将命令执行结果赋值给变量名全局变量系统所有环境都可以使用的变量查看方法: env命令定义方法:1. 分步的方式 定义一个本地变量 变量名=变量值 然后声明为全局变量 export 变量名 2. 同时定义 1. export 变量名=变量值 内置变量内置变量是bash命令内部已经定义好的变量, 可以直接使用不需要定义使用方法 和shell脚本相关的内置变量 $0 获取当前脚本名称 $n 获取当前脚本获取到的第n个参数(大于9时要用大括号括起来例如${10}) $? 获取上一次命令执行情况, 0表示成功 $$ 脚本运行时使用的进程号 $@ 获取所有的参数 和默认值相关的内置变量 var_name=$1 ${var_name:-default} default表示默认值, 如果没有输入参数, default将会被使用 var_name=$1 ${var_name:+default} 将会无视输入参数, 直接输出设定好的默认值 和字符串相关的内置变量 # 截取 ${var_name:start:n} ${var_name:0-n} # var_name是字符串变量名 # start表示的截取的起始位置 # start正数 从开始截取 # start为0-n 从结尾开始截取 示例: ${str:0:5} 从第 1 个字符开始,截取 5 个字符 ${str::5} 从第 1 个字符开始,截取 5 个字符 ${str:5:5} 从第 6 个字符开始,截取 5 个字符 ${str:5} 从第 6 个字符开始,截取后面所有的字符 ${str:0-6} 从倒数第 6 个字符开始,截取后面所有的字符 ${str:0-6:2} 从倒数第 6 个字符开始,截取之后的 2 个字符
2018年02月17日
877 阅读
0 评论
0 点赞
2018-02-14
ubuntu 查找文件
whereis 文件名用于程序名的搜索,搜索结果只限于二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s),如果省略参数,则返回所有信息。 特点:快速,但是是模糊查找,例如 找 whereis mysql 它会把mysql,mysql.ini,mysql.*所在的目录都找出来.find / -name 文件名或文件夹名特点:准确,但速度慢,消耗资源大,例如我想找到my.conf的准确位置,就需要用 find是在指定的目录下遍历查找,如果目录使用 / 则表示在所有目录下查找,find方式查找文件消耗资源比较大,速度也慢一点。locate 文件名强力推荐的方法,最快,最好的方法. linux会把系统内所有的文件都记录在一个数据库文件中,使用locate+文件名的方法会在linux系统维护的这个数据库中去查找目标,相比find命令去遍历磁盘查找的方式,效率会高很多,比较推荐使用这种方法。 但有一个问题是数据库文件不是实时更新的,一般会每周更新一次,所以使用locate命令查找到的结果不一定是准确的。当然可以在使用locate之前通过 updatedb 命令更新一次数据库,保证结果的性。which+可执行文件名which的作用是在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。 使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令which指令会在环境变量$PATH设置的目录里查找符合条件的文件,所以基本的功能是寻找可执行文件。
2018年02月14日
1,992 阅读
0 评论
0 点赞
2018-02-14
Django中事务atomic的使用
在 Django 中可以通过django.db.transaction 模块提供的atomic来定义一个事务atomic提供两种方案实现事务首先是导包from from django.db import transaction调用 atomic 函数事务函数 atomic 有两种用法:装饰器和 with 用法。装饰器用法被atomic装饰的函数将直接作为一个事务执行。@transaction.atomic def modify_database(): """ 所有修改数据库的操作作为一个事务,要么都做,要么都不做 """ pass with 用法包含在with语句内部的所有数据库修改操作将作为一个事务一起执行。with transaction.atomic(): """ with 内部所有修改数据库的操作作为一个事务,要么都做,要么都不做 """ pass提交与回滚保存点事务保存节点,在事务开始时设置。或设置在一些多分支的节点上。# 创建保存点 save_id = transaction.savepoint()提交结束并提交事务。一个事务结束后不要忘了提交到数据库。# 提交从保存点到当前状态的所有数据库事务操作 transaction.savepoint_commit(save_id)回滚当出现数据库错误,或需取消某一段的事务时,可以回滚到事务的前一保存节点处。# 回滚到保存点 transaction.savepoint_rollback(save_id)
2018年02月14日
929 阅读
0 评论
0 点赞
2018-02-11
常用SQL免安装绿色版HaoSQL
简介本程序的目的只有一个:将数据库的安装过程简单化、傻瓜化。 免安装绿色版,大小只有10M左右,解压即可,纯绿色的,启动只需一键。 带控制面板,带SQL管理工具。支持服务非服务两种模式启动。 支持数据库:MongoDB、MySQL、PostgreSQL、MSSQL2008、MSSQL2000、Firebird、MariaDB。使用安装方法下载解压启动各数据库默认密码: MySQL 默认用户 root 密码 haosql MariaDB 默认用户 root 密码 haosql MSSQL 默认用户 sa 密码 haosql MongoDB 默认用户 haosql 密码 haosql PostgreSQL 默认用户 postgres 密码 haosql Firebird 默认用户 SYSDBA 密码 masterkey 官方下载网址:http://www.haosql.com/ MariaDB 10.2.7 7M http://pic.guoxuedashi.com/HaoSQL/MariaDB-HaoSQL.zip MySQL 5.5.30 5M http://pic.guoxuedashi.com/HaoSQL/MySQL5.5-HaoSQL.zip MySQL 5.5.30 5.7.19(不支持XP) http://pic.guoxuedashi.com/HaoSQL/MySQL5.7-HaoSQL.zip MSSQL2008 2008R2 sp3 28M http://pic.guoxuedashi.com/HaoSQL/MSSQL2008-HaoSQL.zip MSSQL2000 2000 sp4 18M 企业版下载 http://pic.guoxuedashi.com/HaoSQL/MSSQL2000-HaoSQL2.zip MSSQL2000 2000 sp4 18M 个人版下载 http://pic.guoxuedashi.com/HaoSQL/MSSQL2000-HaoSQL.zip MongoDB 2.6.7 http://pic.guoxuedashi.com/HaoSQL/MongoDB-HaoSQL.zip MongoDB 3.5.12(不支持XP) http://pic.guoxuedashi.com/HaoSQL/MongoDB3.5-HaoSQL.zip PostgreSQL 9.3.5 http://pic.guoxuedashi.com/HaoSQL/PostgreSQL-HaoSQL.zip PostgreSQL 9.6.5 (64位) http://pic.guoxuedashi.com/HaoSQL/PostgreSQL9.6x64-HaoSQL.zip PostgreSQL 10.0.1 (64位) 10M http://pic.guoxuedashi.com/HaoSQL/PostgreSQL10.0_x64-HaoSQ.zip Firebird 2.5.3 http://pic.guoxuedashi.com/HaoSQL/Firebird-HaoSQL.zip Firebird 3.0.2 http://pic.guoxuedashi.com/HaoSQL/Firebird3-HaoSQL.zip 官方下载网址:http://www.haosql.com/
2018年02月11日
1,090 阅读
0 评论
0 点赞
2018-02-10
搭建Python开发环境时遇到问题小记
搭建Python开发环境时遇到问题小记 1.安装Pythram的社区版后,发现打不开,出现没安装Java的提示弹窗,于是安装JAVA,一路安装完成后,有出现JVM弹窗,于是上度娘翻译单词求解释和查找解决方法。有说时环境变量的配置问题,找教程改了JAVA_HOME,path,classpath的设置,还是不行。2.吃点东西休息一下后,将之前安装的Python,Pytharm,Java全部卸了。3.按网上找的教程,重新设置了JAVA_HOME,path,classpath。4.跟着先安装Java,再安装Python3X,之后安装Pytharm,安装完成后直接打开Pytharm,能打开了,设置了主题和字体,突然主题变了,关了重新打开,再次出现之前的错误弹窗。5.想了一会,感觉是环境变量设置那边的事情,找了另外一个教程重新设置。6.全部卸了,又重新安装,能打开了,设置完成关闭后,再打开,没问题,搭建OK。
2018年02月10日
806 阅读
0 评论
0 点赞
2018-02-06
Vim卡死的解决办法
Vim卡死的解决办法使用vim时,如果你不小心按了 Ctrl + s后,你会发现不能输入任何东西了,像死掉了一般,其实原来Ctrl+S在Linux里是锁定屏幕的快捷键,如果要解锁,按下Ctrl+Q就可以了。 。
2018年02月06日
8,394 阅读
1 评论
4 点赞
2018-02-02
PyMongo模块学习笔记
使用PyMongo模块之前, 首先要安装好PyMongo模块和MongoDBmac系统安装方法如下$ pip3 install PyMongo $ brew install MongoDB MongoDB安装好后还需要配置下, 然后开启服务, 可以去百度下教程. 这里不再描述创建连接import pymongo client = pymongo.MongoClient('localhost', 27017) # 或者 import pymongo client = MongoClient('mongodb://localhost:27017/') 连接数据库db = client.mydb #或者 db = client['mydb'] 连接聚集聚集相当于关系型数据库中的表collection = db.my_collection #或者 collection = db['my_collection'] # 查看数据库下所有聚集名称 db.collection_names() 插入记录collection.insert({"key1":"value1","key2","value2"}) 删除记录# 全部删除 collection.remove() # 按条件删除 collection.remove({"key1":"value1"}) # 更新记录 collection.update({"key1": "value1"}, {"$set": {"key2": "value2", "key3": "value3"}}) # 查询记录 # 查询一条记录:find_one()不带任何参数返回第一条记录.带参数则按条件查找返回 collection.find_one() collection.find_one({"key1":"value1"}) # 查询多条记录:find()不带参数返回所有记录,带参数按条件查找返回 collection.find() collection.find({"key1":"value1"}) # 查看聚集的多条记录 for item in collection.find(): print item # 查看聚集记录的总数 print collection.find().count() 查询结果排序# 单列上排序 collection.find().sort("key1") # 默认为升序 collection.find().sort("key1", pymongo.ASCENDING) # 升序 collection.find().sort("key1", pymongo.DESCENDING) # 降序 # 多列上排序 collection.find().sort([("key1", pymongo.ASCENDING), ("key2", pymongo.DESCENDING)]) 实例#!/usr/bin/env python #coding:utf-8 # Author: --<qingfengkuyu> # Purpose: MongoDB的使用 # Created: 2014/4/14 #32位的版本最多只能存储2.5GB的数据(NoSQLFan:最大文件尺寸为2G,生产环境推荐64位) import pymongo import datetime import random #创建连接 conn = pymongo.Connection('10.11.1.70',27017) #连接数据库 db = conn.study #db = conn['study'] #打印所有聚集名称,连接聚集 print u'所有聚集:',db.collection_names() posts = db.post #posts = db['post'] print posts #插入记录 new_post = {"AccountID":22,"UserName":"libing",'date':datetime.datetime.now()} new_posts = [{"AccountID":22,"UserName":"liuw",'date':datetime.datetime.now()}, {"AccountID":23,"UserName":"urling",'date':datetime.datetime.now()}]#每条记录插入时间都不一样 posts.insert(new_post) #posts.insert(new_posts)#批量插入多条数据 #删除记录 print u'删除指定记录:\n',posts.find_one({"AccountID":22,"UserName":"libing"}) posts.remove({"AccountID":22,"UserName":"libing"}) #修改聚集内的记录 posts.update({"UserName":"urling"},{"$set":{'AccountID':random.randint(20,50)}}) #查询记录,统计记录数量 print u'记录总计为:',posts.count(),posts.find().count() print u'查询单条记录:\n',posts.find_one() print posts.find_one({"UserName":"liuw"}) #查询所有记录 print u'查询多条记录:' #for item in posts.find():#查询全部记录 #for item in posts.find({"UserName":"urling"}):#查询指定记录 #for item in posts.find().sort("UserName"):#查询结果根据UserName排序,默认为升序 #for item in posts.find().sort("UserName",pymongo.ASCENDING):#查询结果根据UserName排序,ASCENDING为升序,DESCENDING为降序 for item in posts.find().sort([("UserName",pymongo.ASCENDING),('date',pymongo.DESCENDING)]):#查询结果根据多列排序 print item #查看查询语句的性能 #posts.create_index([("UserName", pymongo.ASCENDING), ("date", pymongo.DESCENDING)])#加索引 print posts.find().sort([("UserName",pymongo.ASCENDING),('date',pymongo.DESCENDING)]).explain()["cursor"]#未加索引用BasicCursor查询记录 print posts.find().sort([("UserName",pymongo.ASCENDING),('date',pymongo.DESCENDING)]).explain()["nscanned"]#查询语句执行时查询的记录数
2018年02月02日
627 阅读
0 评论
0 点赞
2018-01-12
Vim的基本操作
vi (Visual interface)编辑器是 Linux 系统中最常用的文本编辑器,vi 在Linux界有编辑器之神的美誉,几乎所有的 Linux 发行版中都包含 vi 程序。vi 工作在字符模式下,不需要图形界面,非常适合远程及嵌入式工作,是效率很高的文本编辑器,尽管在 Linux 上也有很多图形界面的编辑器可用,但vi的功能是那些图形编辑器所无法比拟的。vim 是 vi 的升级版,它不仅兼容 vi 的所有指令,而且还有一些新的特性,例如 vim 可以撤消无限次、支持关键词自动完成、可以用不同的颜色来高亮你的代码。vim 普遍被推崇为类 vi 编辑器中最好的一个。工作模式vi有三种基本工作模式: 命令模式、文本输入模式(编辑模式)、末行模式。1) 命令模式任何时候,不管用户处于何种模式,只要按一下ESC键,即可使vi进入命令模式。我们在shell环境(提示符为$)下输入启动vi命令,进入编辑器时,也是处于该模式下。在命令模式下,用户可以输入各种合法的vi命令,用于管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释,若输入的字符是合法的vi命令,则vi在接受用户命令之后完成相应的动作。但需注意的是,所输入的命令并不在屏幕上显示出来。若输入的字符不是vi的合法命令,vi会响铃报警。2) 文本输入模式(编辑模式)在命令模式下输入插入命令i(I)、附加命令a(A) 、打开命令o(O)、替换命s(S)都可以进入文本输入模式,此时vi窗口的最后一行会显示“插入”。在该模式下,用户输入的任何字符都被vi当做文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令模式下,按键ESC即可。3) 末行模式 末行模式下,用户可以对文件进行一些附加处理。尽管命令模式下的命令可以完成很多功能,但要执行一些如字符串查找、替换、显示行号等操作还是必须要进入末行模式的。在命令模式下,输入冒号即可进入末行模式。 此时vi窗口的状态行会显示出冒号,等待用户输入命令。用户输入完成后,按回车执行,之后vi编辑器又自动返回到命令模式下。打开文件vi filename:打开或新建文件,并将光标置于第一行行首,如果文件不存在,则会新建文件。编辑文件如果通过vi打开一个已经存在的文件,首先进入命令模式,此时输入的任何字符都被视为命令,不能输入内容。保存文件一定要先退出插入模式(按Esc进入命令模式),然后(小写状态下),shift + zz(按住 “shift” + 按两下“z”键),或者(大写状态下:ZZ) 即可保存退出当前文件。命令模式下的操作1) 切换到文本输入模式 按键 功能 a 光标位置右边插入文字 i 光标位置当前处插入文字 o(字母) 光标位置下方开启新行 O(字母) 光标位置上方开启新行 I 光标所在行首插入文字 A 光标所在行尾插入文字 s 删除光标后边的字符,从光标当前位置插入 S 删除光标所在当前行,从行首插入 2) 光标移动 按键 功能 Ctrl + f 向前滚动一个屏幕 Ctrl + b 向后滚动一个屏幕 gg 到文件第一行行首 G(大写) 到文件最后一行行首,G必须为大写 mG或mgg 到指定行,m为目标行数 0(数字) 光标移到到行首 $ 光标移到到行首 3) 复制粘贴 按键 功能 [n]yy 复制从当前行开始的 n 行 p 把粘贴板上的内容插入到当前行 4) 删除 按键 功能 [n]x 删除光标后 n 个字符 [n]X 删除光标前 n 个字符 D 删除光标所在开始到此行尾的字符 [n]dd 删除从当前行开始的 n 行(准确来讲,是剪切,剪切不粘贴即为删除) dG 删除光标所在开始到文件尾的所有字符 dw 删除光标开始位置的字,包含光标所在字符 d0(0为数字) 删除光标前本行所有内容,不包含光标所在字符 4) 撤销恢复 按键 功能 .(点) 执行上一次操作 u 撤销前一个命令 ctrl+r 反撤销 5) 保存退出 按键 功能 ZZ(shift+z+z) 保存退出 6) 查找 按键 功能 /字符串 从当前光标位置向下查找(n,N查找内容切换) ?/字符串 从当前光标位置向上查找(n,N查找内容切换) 7) 替换 按键 功能 r 替换当前字符 R 替换当前行光标后的字符 8) 可视模式 按键 功能 v 按字符移动,选中文本,可配合h、j、k、l选择内容,使用d删除,使用y(一个y)复制 末行模式下的操作1) 保存退出 按键 功能 :wq 保存退出 :x(小写) 保存退出 :w filename 保存到指定文件 :q 退出,如果文件修改但没有保存,会提示无法退出 :q! 退出,不保存 2) 替换 按键 功能 :s/abc/123/ 光标所在行的第一个abc替换为123 :s/abc/123/g 光标所在行的所有abc替换为123 :1,10s/abc/123/g 将第一行至第10行之间的abc全部替换成123 :%s/abc/123/g 当前文件的所有abc替换为12 :%s/abc/123/gc 同上,但是每次替换需要用户确认 3) 分屏 按键 功能 :sp 当前文件水平分屏 :vsp 当前文件垂直分屏 : sp 文件名 当前文件和另一个文件水平分屏 : vsp 文件名 当前文件和另一个文件垂直分屏 ctrl-w-w 在多个窗口切换光标 :wall/:wqall/:qall 保存/保存退出/退出所有分屏窗口
2018年01月12日
5,236 阅读
0 评论
0 点赞
2018-01-08
简单总结SQL注入的防范
SQL注入攻击至今仍然是Web安全领域中的一个重要组成部分SQL 注入的原理SQL 注入:就是通过把 SQL 命令插入到 Web 表单提交或输入域名或页面请求的查询字符串里,最终达到欺骗服务器执行恶意的 SQL 命令。具体来说,它是利用现有应用程序,将(恶意)的 SQL 命令注入到后台数据库引擎执行的能力,它可以通过在 Web 表单输入(恶意)SQL 语句得到一个存在安全漏洞的网站的数据库信息,而不按照设计者的意图执行 SQL 语句。什么时候可能发生 SQL 注入:假设我们在浏览器中输入 URL: www.insmoin.com,由于它只是对页面的简单请求无需对数据库进行动态请求,所以它不存在 SQL 注入,当我们输入 www.insmoin.com?testid=23 时,我们在 URL 中传递了变量 testid,并且提供值为23,由于它是对数据库进行动态查询的请求(其中 ?testid=23 表示数据库查询变量),所以我们可以在该 URL 中嵌入了恶意 SQL 语句。具体的例子和详细的原理就不在这里赘述了,有兴趣的同学可以去谷歌或者百度搜索,上面会有大量的例子和攻击方式。SQL注入常用保护方式最主要的保护方式有以下几点: 使用 Prepared Statements(参数查询)来代替 Statements — 这要求所有数据库开发人员在开发 SQL 查询语句时将代码和数据分开,先定义查询语句的结构,将数据通过参数的方式出入,这样输入的参数将不会当作 SQL 命令来执行,基本上能避免 SQL 注入的攻击。 使用存储过程来操作数据库 — 所有的存储过程都存放在数据库里面,应用程序调用存储过程来查询数据。 转义用户输入的所有特殊字符 – 永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。这些在一定程度可以缓解SQL注入。 还有些辅助的方法: 以最低权限的数据库连接,为每个应用使用单独的权限与有限的数据库连接。 不要把机密信息明文存放,加密或者 hash 掉密码和敏感的信息。 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。
2018年01月08日
1,507 阅读
0 评论
0 点赞
2018-01-08
解决电脑右键没有新建txt文本文档的问题
解决电脑右键没有新建txt文本文档的问题不知道什么时候发现没了右键新建txt文本文档的快捷方式, 每次都要打开notepad++或者vscode新建文件, 今天终于忍无可忍上网找了解决方法搞定了解决方法如下新建一个文本文件复制以下内容, 粘贴到文本文件里, 然后改文本文件后缀.txt为.reg注册表文件, 点击导入即可REGEDIT4 [HKEY_CLASSES_ROOT\.txt] @="txtfile" "PerceivedType"="text" "Content Type"="text/plain" [HKEY_CLASSES_ROOT\.txt\ShellNew] "nullfile"="
2018年01月08日
1,307 阅读
0 评论
0 点赞
1
...
8
9
10
...
12