填写信息完成之后,证书创建就完成了.上面输入的命令里面的/Users/当前用户的用户名/android_demo.keystore就是证书的地址.
在终端输入命令:
keytool-list-v-keystore证书存放地址(例如:/Users/当前用户的用户名/android_demo.keystore)
回车.输入刚才的口令密码,即可查看证书的所有信息(例如申请一些三方需要的SHA1).
在终端输入命令:setPATH=%PATH%;"C:\ProgramFiles\Java\jre1.8.0_201\bin"生成签名证书使用keytool-genkey命令生成证书:
在终端输入命令:keytool-genkey-aliastestalias-keyalgRSA-keysize2048-validity36500-keystoretest.keystore回车后会提示:
在终端输入命令:Enterkeystorepassword://输入证书文件密码,输入完成回车Re-enternewpassword://再次输入证书文件密码,输入完成回车Whatisyourfirstandlastname[Unknown]://输入名字和姓氏,输入完成回车Whatisthenameofyourorganizationalunit[Unknown]://输入组织单位名称,输入完成回车Whatisthenameofyourorganization[Unknown]://输入组织名称,输入完成回车WhatisthenameofyourCityorLocality[Unknown]://输入城市或区域名称,输入完成回车WhatisthenameofyourStateorProvince[Unknown]://输入省/市/自治区名称,输入完成回车Whatisthetwo-lettercountrycodeforthisunit[Unknown]://输入国家/地区代号(两个字母),中国为CN,输入完成回车IsCN=XX,OU=XX,O=XX,L=XX,ST=XX,C=XXcorrect[no]://确认上面输入的内容是否正确,输入y,回车Enterkeypasswordfor
可以使用以下命令查看:
在终端输入命令:keytool-list-v-keystoretest.keystoreEnterkeystorepassword://输入密码,回车会输出以下格式信息:
在终端输入命令:Keystoretype:PKCS12Keystoreprovider:SUNYourkeystorecontains1entryAliasname:testCreationdate:2019-10-28Entrytype:PrivateKeyEntryCertificatechainlength:1Certificate[1]:Owner:CN=Tester,OU=Test,O=Test,L=HD,ST=BJ,C=CNIssuer:CN=Tester,OU=Test,O=Test,L=HD,ST=BJ,C=CNSerialnumber:7dd12840Validfrom:FriJul2620:52:56CST2019until:SunJul0220:52:56CST2119Certificatefingerprints:MD5:F9:F6:C8:1F:DB:AB:50:14:7D:6F:2C:4F:CE:E6:0A:A5SHA1:BB:AC:E2:2F:97:3B:18:02:E7:D6:69:A3:7A:28:EF:D2:3F:A3:68:E7SHA256:24:11:7D:E7:36:12:BC:FE:AF:2A:6A:24:BD:04:4F:2E:33:E5:2D:41:96:5F:50:4D:74:17:7F:4F:E2:55:EB:26Signaturealgorithmname:SHA256withRSASubjectPublicKeyAlgorithm:2048-bitRSAkeyVersion:3其中证书指纹信息(Certificatefingerprints):
1、修改keystore密码的命令(keytool为JDK带的命令行工具):
keytool-storepasswd-keystoremy.keystore
2、修改keystore的alias(别名):
keytool-changealias-keystoremy.keystore-aliasmy_name_key-destaliasaliasdebugkey
3、修改alias(别名)的密码:
keytool-keypasswd-keystoremy.keystore-aliasaliasdebugkey
在使用时php报出如下错误:Calltoundefinedfunctiongemvary\exif_imagetype()
通过打印phpinfo()查看得知mbstring扩展是有的,exif扩展没有
如果mbstring也没有,也可以参考以下exif扩展的安装过程;
安装过程基本类似的;
进入主题:
1、查看当前环境PHP的版本号和安装目录
2、进入php的源码目录
#这是我电脑上的路径,得改成自己服务器上的路径cd/www/lnmp1.4/src/php-7.1.7/ext/exif进入扩展目录后进行初始化:
/usr/local/php/bin/phpize命令执行后当前目录会多几个文件,只要有configure这个文件就行
然后再检查配置,输入:
./configure--with-php-config=/usr/local/php/bin/php-config如果有报错说明路径不对,使用whereisphp-config查看服务器上此文件的路径
接下来再依次执行这两个命令:
makemakeinstall执行完会有类似如下信息:
[root@xiaojunexif]#makeinstallInstallingsharedextensions:/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/这个目录就是扩展安装后的存放目录;
3、修改php.ini引入扩展
vi/usr/local/php/etc/php.ini在最后面加入:
extension=exif.so然后保存,重启PHP就完事了;
需要注意的是exif.so必须放在mbstring.so的后面,否则会出错;
可能出现的问题:
意思是mbstring这个扩展已经加载过了,还尝试引入;
解决办法:
PHP加载模块有两种方式,一种是通过php.ini加载模块,另一种是通过编译时的参数加载模块。
这里出这个提示,那么mbstring应该就是属于后者,只需要php.ini中将其注释掉就行了
;extension=mbstring.so输入/usr/local/bin/phpize后提示:Cannotfindconfig.m4.Makesurethatyourun/usr/local/bin/phpizeinthetoplevelsourc
我是将openssl扩展内的config0.m4文件改成config.m4就没提示了;
cd../opensslcp./config0.m4./config.m4至于为什么openssl扩展的config.m4为什么会影响到安装其它扩展,暂不得而知;
前言
mysql-binlog是MySQL数据库的二进制日志,用于记录用户对数据库操作的SQL语句((除了数据查询语句)信息。可以使用mysqlbin命令查看二进制日志的内容。
MySQLbinlog格式
binlog的格式也有三种:STATEMENT、ROW、MIXED。
1、STATMENT模式:基于SQL语句的复制(statement-basedreplication,SBR),每一条会修改数据的sql语句会记录到binlog中。
优点:不需要记录每一条SQL语句与每行的数据变化,这样子binlog的日志也会比较少,减少了磁盘IO,提高性能。
缺点:在某些情况下会导致master-slave中的数据不一致(如sleep()函数,last_insert_id(),以及user-definedfunctions(udf)等会出现问题)
2、基于行的复制(row-basedreplication,RBR):不记录每一条SQL语句的上下文信息,仅需记录哪条数据被修改了,修改成了什么样子了。
优点:不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。
缺点:会产生大量的日志,尤其是altertable的时候会让日志暴涨。
3、混合模式复制(mixed-basedreplication,MBR):以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。
binlog配置
在MySQL配置文件my.cnf文件中的mysqld节中添加下面的配置文件:
[mysqld]
#设置日志格式
binlog_format=mixed
#设置日志路径,注意路经需要mysql用户有权限写
log-bin=/data/mysql/logs/mysql-bin.log
expire_logs_days=7
#binlog每个日志文件大小
max_binlog_size=100m
#binlog缓存大小
binlog_cache_size=4m
#最大binlog缓存大小
max_binlog_cache_size=512m
重启MySQL生效,如果不方便重启服务,也可以直接修改对应的变量即可。
总结
无论是增量备份还是主从复制,都是需要开启mysql-binlog日志,最好跟数据目录设置到不同的磁盘分区,可以降低io等待,提升性能;并且在磁盘故障的时候可以利用mysql-binlog恢复数据。
Mac版本的Python默认是2.7,安装高版本后需要修改为你安装的版本。
1,首先打开终端
open~/.bash_profile
打开配置文件
2.写入python的外部环境变量
exportPATH=${PATH}:/Library/Frameworks/Python.framework/Versions/3.7/bin
3.重命名python
(这步很重要,直接关系到默认启动的python版本是否修改)
4.关闭文件后,在终端调用source~/.bash_profile
5.在终端调用python,查看是否修改成功
一、功能比较强
相对而言,这是除Excel自身之外功能最强的工具了。比如我就用到了它提供的:字体设置、前景色背景色、border设置、视图缩放(zoom)、单元格合并、autofilter、freezepanes、公式、datavalidation、单元格注释、行高和列宽设置等等。
二、支持大文件写入
如果数据量非常大,可以启用constantmemory模式,这是一种顺序写入模式,得到一行数据就立刻写入一行,而不会把所有的数据都保持在内存中。
一、不支持读取和修改
作者并没有打算做一个XlsxReader来提供读取操作。不能读取,也就无从修改了。它只能用来创建新的文件。我是利用xlrd把需要的信息读入后,用XlsxWriter创建全新的文件。
二、不支持XLS文件
XLS是Office2013或更早版本所使用的格式,是一种二进制格式的文件。XLSX则是用一系列XML文件组成的(最后的X代表了XML)一个压缩包。如果非要创建低版本的XLS文件,就请移步xlwt吧。
三、暂时不支持透视表(PivotTable
importxlsxwriterf=xlsxwriter.Workbook()#创建excel文件worksheet1=f.add_worksheet('操作日志')#括号内为工作表表名样式有很多属性,更多具体样式请参考官方文档。
workbook.close()这个命令是使用xlsxwriter操作Excel的最后一条命令,一定要记得关闭文件。
Mac下是自己安装了Apache+PHP的,但是MacOS版本每次变更后都需要重新配置下环境,参考:Mac升级系统macOSSierra后PHP不编译
Mac没有预装Homebrew,安装Homebrew在终端执行:
xcode-select--install成功后继续安装Homebrew
成功安装brew后,在终端执行:
brewinstallnginx安装成功后,查看nginx信息,在终端执行:
brewinfonginx以下为提示信息:nginx:stable1.12.2(bottled),devel1.13.6,HEAD......Docrootis:/usr/local/var/wwwThedefaultporthasbeensetin/usr/local/etc/nginx/nginx.confto8080sothatnginxcanrunwithoutsudo.nginxwillloadallfilesin/usr/local/etc/nginx/servers/.Tohavelaunchdstartnginxnowandrestartatlogin:brewservicesstartnginxOr,ifyoudon'twant/needabackgroundserviceyoucanjustrun:nginxMac是自带Apache的,和Nginx会冲突吗?答案是不会,因为默认端口不同,Apache默认80端口,Nginx默认8080端口ok,终端执行:
sudonginx浏览器访问:localhost:8080
//启动nginx服务sudonginx//重新加载配置|重启|停止|退出nginxnginx-sreload|reopen|stop|quit//测试配置是否有语法错误nginx-t3.安装PHP56macOSX自带PHP,会跟随系统升级,目前macOSv10.13.x跟随PHP已经是PHP7.0,所以我们还是需要安装PHP56,执行:
brewinstallphp56--build-from-source安装成功,提示:
sudovim/usr/local/etc/php/5.6/php.ini设置开机启动php-fpm:
/usr/local/opt/php56/sbin/php56-fpm{start|stop|force-quit|restart|reload|status}现在我们先执行php56-v来查看版本要怎么办呢?执行:
sudoln-s/usr/local/Cellar/php56/5.6.32_8/bin/php/usr/local/bin/php56设置一下符号链接(相当于windows快捷方式),现在php56直接指向了/usr/local/Cellar/php56/5.6.32_8/bin/php【参考链接】Linux环境变量和符号链接设置完成,查看PHP版本:
php56-v4.安装Redis终端执行:
brewsearchredis查询结果:hiredishomebrew/php/php56-redisredisredis@3.2homebrew/php/php53-redishomebrew/php/php70-redisredis-leveldbhomebrew/php/php54-redishomebrew/php/php71-redisredis@2.6homebrew/php/php55-redishomebrew/php/php72-redisredis@2.8然后(注意区分下php的redis扩展)
brewinstallredisTohavelaunchdstartredisnowandrestartatlogin:brewservicesstartredisOr,ifyoudon'twant/needabackgroundserviceyoucanjustrun:redis-server/usr/local/etc/redis.conf开启redis:
1.通过调用指定的URL访问就相当于在浏览器中访问
2.通过console调用
下面我们就来说说Console是如何实现定时任务的
PHP
linux下,运行crontab-e
上面的例子表示每晚的21:30执行上面的定时程序
下面是定时任务设置的一些基本介绍
基本格式:*****command分时日月周命令
第1列表示分钟1~59每分钟用*或者*/1表示第2列表示小时1~23(0表示0点)第3列表示日期1~31第4列表示月份1~12第5列标识号星期0~6(0表示星期天)第6列要运行的命令
crontab文件的一些例子:
Shell
通过apt安装,gitosis使用SSHkey来认证用户,但用户不需要在主机上添加账号,而是使用服务器上的一个受限账号。安装的过程需要在客户端和服务器之间切换,留意操作步骤之前的说明。这里服务器和客户端都是使用ubuntulinux。
服务器端(ip:192.168.1.254)1.安装gitsudoapt-getinstallgit-core
2.安装python和python-setuptoolssudoapt-getinstallpythonpython-setuptools
3.安装gitosis
PS:git://eagain.net/gitosis已经失效了,找了好久才有一个新的。
4.创建git用户
客户端(也需要先安装git)5.在gitosis管理员的机器上生成密钥,把公钥重命名为comet@3GCOMET.pub,这里用scp传到服务器上ssh-keygen-trsamvid_rsa.pubcomet@3GCOMET.pubscpcomet@3GCOMET.pubcomet@192.168.1.254:comet@3GCOMET.pub
6.在~/.ssh/config添加以下内容,以便连接到服务器Host192.168.1.254CompressionyesIdentityFile~/.ssh/id_rsa
服务器端7.使用上面的comet@3GCOMET.pub初始化gitosissudo-H-ugitgitosis-init 客户端8.获取服务器上的gitosis-admin项目,会有keydir文件夹和gitosis.confgitclonegit@192.168.1.254:gitosis-admin.git 9.添加新组jichuteam、用户comet@HP、项目jichu,并推送到远程服务器 注:如果客户端是windows,使用Puttygen生成公钥和私钥:参数为SSH-2RSA,1024位,按需加上密码。 如果之前是使用ssh-keygen生成的,在这里直接Loadprivatekey,然后saveprivatekey,保存为ppk格式才能用。 在新的客户端生成密钥,并把公钥放到gitosis-adminkeydir,这里是comet@HP.pubcdgitosis-adminvigitosis.conf修改为下面内容,其中[gitosis]可以看gitosis/example.conf的说明,members的comet@HP就是comet@HP.pub的文件名,多个用户用空格隔开[gitosis]gitweb=nodaemon=nologlevel=DEBUG [groupgitosis-admin]writable=gitosis-adminmembers=comet@3GCOMET [groupjichuteam]members=comet@HPwritable=jichu gitpush 服务器端12.在服务器的/home/git/repositories/可以看到有jichu.git的版本库。 重要的连接前设置为编码形式,以上为utf8编码,gbk的变换一下即可,不要死掰。 yuminstallsubversion安装完成之后,你可以通过以下命令查看是svnversion版本信息: 1、将文件checkout到本地目录svncheckoutpath(path是服务器上的目录)例如:svncheckoutsvn://192.168.1.1/pro/domain简写:svnco2、往版本库中添加新的文件svnaddfile例如:svnaddtest.php(添加test.php)svnadd*.php(添加当前目录下所有的php文件) 首先是要用mt_rand()函数生成指定个数的随机数字; 然后使用array_unique()函数去重; 因为去重了;所以得到的数字就不够指定个数了; 所以;核心是要用while循环;直到得到指定个数的数字; 到这里基本可以是结束了; 对于追求完美的人来说;还可以再用个sort(); 目的不是要用来排序;主要是将得到的数组key格式化; 用代码来说话;就如下; 当然;重点不是这个函数;重点是这个函数的思路;可以解决很多类似的问题; Composer是一个非常流行的PHP包依赖管理工具,已经取代PEAR包管理器,对于PHP开发者来说掌握Composer是必须的. 对于使用者来说Composer非常的简单,通过简单的一条命令将需要的代码包下载到vendor目录下,然后开发者就可以引入包并使用了. 其中的关键在于你项目定义的composer.json,可以定义项目需要依赖的包(可能有多个),而依赖的包可能又依赖其他的包(这就是组件的好处),这些都不用你烦心,Composer会自动下载你需要的一切,一切在于composer.json的定义. Composer对于使用者来说是很透明,但是其背后的理念还是需要了解一下的,其的诞生也不是偶然的,得益于Github的快速发展,PHP语言也越来越现代化,显得更高大上了. 为了理解Composer,先大概了解下其结构: Composer的结构 Composer命令行工具 composerinit 使用者可以在自己的项目下创建composer.json以便定义你项目的依赖包,也可以通过composerinit交互式的创建composer.json. composerinstall 应该是最常用的命令,composer会根据本地的composer.json安装包,将下载的包放入项目下的vendor目录下,同时将安装时候的包版本信息放入到composer.lock,以便锁定版本. 其实在install的时候,假如发现composer.lock版本和目前vendor目录下的代码版本是一致的,则Composer会什么也不做,composer.lock的目的就是让你安心在目前这个版本下工作,而不获取最新版本的包. composerupdate 那么如何更新composer.lock以便获取到最新版本的包呢通过这个命令即可更新最新版本的包 composerconfig 这个命令还是建议了解下,全局的配置保存在COMPOSER_HOME/config.json,非全局的配置信息则存储在本项目目录下. composercreate-project 这个命令不常用,但是个人觉得还是很重要的,使用普通的install命令是将项目所有的依赖包下载到本项目vendor目录下.而通过这个命令则是将所有的代码及其依赖的包放到一个目录下,相当于执行了一个gitclone命令,一般是包的开发者可能为了修复bug会使用该命令. composerglobal 这是一个全局的安装命令,它允许你在COMPOSER_HOME目录下执行Composer的命令,比如install,update.当然你的COMPOSER_HOME要在$PATH环境下. 比如执行composerglobalrequirefabpot/php-cs-fixer,现在php-cs-fixer命令行可以全局运行了,如果稍后想更新它,只需要运行composerglobalupdate composerdump-autoload 当你修改项目下的composer.json的文件,并不一定要运行composerupdate命令进行更新,有的时候可以使用该命令来更新加载器,比如你要引用本地自定义的包(不是来自于packagist),后面会通过实践来说明该命令. composerrequire 假如手动或者交互式创建composer.json文件,可以直接使用该命令来安装包 –prefer-source和–prefer-dist参数 –prefer-dist:对于稳定的包来说,一般Composer安装默认使用该参数,这也能加快安装,比如有可能直接从packagist安装了相应的包,而不用实际去Github上下载包. –prefer-source:假如使用该参数,则会直接从Github上安装,安装包后vendor目录下还含有.git信息 #在vendor/ywdblog/phpcomposer目录下含有.git信息 如何给Composer添加代理 在国内使用Composer下载特别慢,可以通过二个方法进行加速 } Autoloading代码加载器 composer本身集成一个autoloader,支持PSR-4,PSR-0,classmap,filesautoloading. 这里通过一个例子来说明通过Composer如何引用classmap,files,本地符合PSR-4标准的代码 编辑composer.json 通过上述的操作,对于PSR-4来说等同注册了一个PSR-4autoloader(从FooBar命名空间) 假如不想使用Composer的autoloader,可以直接包含vendor/composer/autoload_*.php文件,配置自己的加载器. 具体的例子托管在github上,可参考. Repositories 关于Repositories,了解其不是必须的,但是假如掌握则更能理解Composer,对于Repositories,其中文文档和英文文档解释的很好,这里也进行了一些摘抄. 基本概念 包: Composer是一个依赖管理工具,它在本地安装一些资源包和包的描述(比如包名称和对应的版本),比较重要的元数据描述是dist和source,dist指向一个存档,该存档是对一个资源包的某个版本的数据进行的打包.source指向一个开发中的源,这通常是一个源代码仓库(比如git) 资源库: Composer将查看所有你定义的repositories以找到项目需要的资源包(这句话很重要). 默认情况下已经将Packagist.org注册到Composer(或者理解为Packagist.org是Composer资源库默认的仓库类型) Composer资源库类型 Composer资源库包括四种类型,默认的是composer类型,也就是packagist.org所使用的资源类型. 它使用一个单一的packages.json文件,包含了所有的资源包元数据.当你将包发布到pckagist.org上,则默认系统会创建一个packages.json,不过我没有找到我的包对应的文件. VCS资源库类型 假如你想构建一个私有的Composer私有资源库类型,可以使用该类型,这里举一个例子,比如你在自己项目的composer.json定义如下,则就可以使用对应的Github上的代码了. { ], 当运行composerupdate的时候,Comoser实际上是从Github上下载包而不是从pckagist.org上下载. 另外假如需要使用Package资源库类型或者PEAR资源库类型,参考官方文档即可,一般在composer.json中定义name、version属性即可. Composer.json 在本文上面也多次提到了composer.json,比如你希望使用第三方包则需要在本地定义composer.json,Composer安装第三方包后,也会在第三方包目录下发现composer.json,那么这二者都叫composer.json,有什么区别呢理解这非常的重要. 假如你在自己的项目下面定义一个composer.json,则这个包称之为ROOT包,这个composer.json定义你项目需要的条件(比如你的项目可能依赖一个第三方包). composer.json中有些属性只能被ROOT包使用,比如config属性只在ROOT包中生效. 一个资源包是不是ROOT包,取决于它的上下文,比如你gitcloneywdblog/phpcomposer,则这时候本地phpcomposer目录就是ROOT包,假如你在本地phpcomposer目录下composerrequireywdblog/phpcomposer,则这时候你的项目phpcomposer就是ROOT包. 了解composer-schema.json可参考该网址,Laravel作为一个成熟的框架,其定义的composer.json非常经典 关于包的版本 当使用者在本地配置composer.json的时候,可以指定需要包的特定版本,Composer支持从Github仓库中下载Tag或者分支下的包. 对于Github上的Tag来说,Packagist会创建对应包的版本,它符合X.Y.Z,vX.Y.Z,X.Y.Z-包类型,就是说Github上虽然只有一个特定版本的包,但Composer支持多种形式的引用方式,比如: composerrequiremonolog/monolog1.0.* composerrequiremonolog/monolog~1.10 对于Github上的分支来说,Packagist会创建对应包的版本,假如分支名看起来像一个版本,将创建{分支名}-dev的包版本号,如果分支名看起来不像一个版本号,它将会创建dev-{分支名}形式的版本号 总结: 理解Composer,最重要的是实践,最后也能明白PSR-4和命名空间,也可以尝试将你的项目发布到pckagist.org上. GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。 搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。 假设你已经有sudo权限的用户账号,下面,正式开始安装。 第一步,安装git: $sudoapt-getinstallgit第二步,创建一个git用户,用来运行git服务: 第四步,初始化Git仓库: 先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令: git:x:1001:1001:,,,:/home/git:/bin/bash改为: 第六步,克隆远程仓库: 现在,可以通过gitclone命令克隆远程仓库了,在各自的电脑上运行: $gitclonegit@server:/srv/sample.gitCloninginto'sample'...warning:Youappeartohaveclonedanemptyrepository.剩下的推送就简单了。 如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。 这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。 有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。 这里我们也不介绍Gitolite了,不要把有限的生命浪费到权限斗争中。 设置方法: aliyunLinux(Redhat)安装vsftp软件 1.更新yum源 首先需要更新系统的yum源,便捷工具下载地址:update_source.zip。这里需要注意的是,目前文件无法传输,所以想要运行update_source.sh只能用文本打开,复制粘贴到阿里云服务器系统运行。 使用yum命令安装vsftp #yuminstallvsftpd-y 3.添加ftp帐号和目录 先检查一下nologin的位置,通常在/usr/sbin/nologin或者/sbin/nologin下。 使用下面的命令创建帐户,该命令指定了/ftp为用户test的家目录,您可以自己定义帐户名和目录: #useradd-d/ftp-s/sbin/nologintest 修改该帐户密码: #passwdtest 修改指定目录的权限 #chown-Rtest:test/ftp 编辑vsftp配置文件,命令如下: #vi/etc/vsftpd/vsftpd.conf 将配置文件中”anonymous_enable=YES“改为“anonymous_enable=NO” 取消如下配置前的注释符号: #local_enable=YES #write_enable=YES #chroot_local_user=YES #ascii_upload_enable允许使用ascii码上传 #ascii_download_enable允许使用ascii码下载 保存修改,按ESC键,输入:wq 5.修改shell配置 vi编辑/etc/shells,如果该文件里没有/usr/sbin/nologin或者/sbin/nologin(具体看当前系统配置)则追加进去 使用命令启动vsftp服务: #servicevsftpdstart 后来我给检查了一番,因为对dedecms这种cms,一些问题基本都是站长摸透了的,这类问题应该可以说是家常便饭吧。于是baidu,google了一下,寥寥无几的答案,大都是无关紧要的答案,亦或是答非所问,也许都是抱着灌水的态度把,却而止步。 决定对程序进行排查了,得得看看删除程序是怎么进行的吧,查了几个php页面:archives_do.php 发现这里用了的函数DelArc 然后继续往下找到这个函数,函数来自inc_batchup.php文件 看到这里就基本一目了然了,将sql进行执行查询出来,发现这里表里面的数据让人大吃一惊。 将表中的数据进行校对处理,最终得以解决了。 “lsblk-l”命令以列表格式显示块设备(而不是树状格式)。 “md5sum”就是计算和检验MD5信息签名。md5checksum(通常叫做哈希)使用匹配或者验证文件的文件的完整性,因为文件可能因为传输错误,磁盘错误或者无恶意的干扰等原因而发生改变。 root@raspberrypi:/#uname-aLinuxraspberrypi3.6.11+#528PREEMPTTueAug2000:25:53BST2013armv6lGNU/Linux“history”命令就是历史记录。它显示了在终端中所执行过的所有命令的历史。 注意:按住“CTRL+R”就可以搜索已经执行过的命令,它可以在你写命令时自动补全。 root@raspberrypi:/opt/labpark#mkdirraspbox注意:目录只能在用户拥有写权限的目录下才能创建。mkdir:不能创建目录`tecmint`,因为文件已经存在了。(上面的输出中不要被文件迷惑了,你应该记住我开头所说的-在linux中,文件,文件夹,驱动,命令,脚本都视为文件) root@raspberrypi:/opt/labpark#touchrasp.txt注意:touch可以用来在用户拥有写权限的目录下创建不存在的文件。 Debian系列以“apt”命令为基础,“apt”代表了AdvancedPackageTool。APT是一个为Debian系列系统(Ubuntu,Kubuntu等等)开发的高级包管理器,在Gnu/Linux系统上,它会为包自动地,智能地搜索,安装,升级以及解决依赖。 “pwd”(printworkingdirectory),在终端中显示当前工作目录的全路径。 root@raspberrypi:/opt/labpark#pwd/opt/labpark搜索指定目录下的文件,从开始于父目录,然后搜索子目录。 root@raspberrypi:/opt/labpark#findbook*book_backup.txtbook.txt root@raspberrypi:/opt/labpark#find-name*.c./hello.c root@raspberrypi:/opt/labpark#find-inameFACE*./facebook.txt 注意:`-name‘选项是搜索大小写敏感。可以使用`-iname‘选项,这样在搜索中可以忽略大小写。(*是通配符,可以搜索所有的文件;‘.sh‘你可以使用文件名或者文件名的一部分来制定输出结果) root@raspberrypi:/opt/labpark#grep-r"localhost"/etc/php5//etc/php5/cgi/php.ini:SMTP=localhost/etc/php5/cli/php.ini:SMTP=localhost/etc/php5/fpm/php.ini:SMTP=localhost注意:您还可以使用以下选项: ‘man‘是系统帮助页。Man提供命令所有选项及用法的在线文档。几乎所有的命令都有它们的帮助页 ps命令给出正在运行的某个进程的状态,每个进程有特定的id成为PID。 whereis的作用是用来定位命令的二进制文件\资源\或者帮助页.举例来说,获得ls和kill命令的二进制文件/资源以及帮助页 ‘service‘命令控制服务的启动、停止和重启,它让你能够不重启整个系统就可以让配置生效以开启、停止或者重启某个服务。 alias是一个系统自建的shell命令,允许你为名字比较长的或者经常使用的命令指定别名。 报告系统的磁盘使用情况。在跟踪磁盘使用情况方面对于普通用户和系统管理员都很有用。‘df‘通过检查目录大小工作,但这一数值仅当文件关闭时才得到更新。 估计文件的空间占用。逐层统计文件(例如以递归方式)并输出摘要。 注意:‘df‘只显示文件系统的使用统计,但‘du‘统计目录内容。 这是一个很重要的命令,在终端中用来改变自己密码很有用。显然的,因为安全的原因,你需要知道当前的密码。 root@raspberrypi:/opt/wwwroot#passwdEnternewUNIXpassword:RetypenewUNIXpassword:passwd:passwordupdatedsuccessfully 这个命令用来在命令行上将指定的文件在指定的打印机上打印。 root@raspberry:~#lpr-Pdeskjet-4620-series1-final.pdf 比较两个任意类型的文件并将结果输出至标准输出。如果两个文件相同,‘cmp‘默认返回0;如果不同,将显示不同的字节数和第一处不同的位置。 Wget是用于非交互式(例如后台)下载文件的免费工具.支持HTTP,HTTPS,FTP协议和HTTP代理。 mount是一个很重要的命令,用来挂载不能自动挂载的文件系统。你需要root权限挂载设备。 ifconfig用来配置常驻内核的网络接口信息。在系统启动必要时用来设置网络适配器的信息。之后,它通常是只需要在调试时或当系统需要调整时使用。 root@raspberrypi:~#uptime04:09:59up7min,1user,loadaverage:0.01,0.31,0.24 显示CPU进程信息。这个命令自动刷新,默认是持续显示CPU进程信息,除非使用了中断指令(Ctrl+c)。 这个命令在指定的设备上创建一个新的ext4文件系统,如果这个命令后面跟的是个错误的设备,那么整个设备就会被擦除和格式化,所以建议不要运行这个命令,除非你清楚自己正在干什么。 Mkfs.ext4/dev/sda1(sda1blockwillbeformatted)mkfs.ext4/dev/sdb1(sdb1blockwillbeformatted)linux下vi的复制,黏贴,删除,撤销,跳转等命令一,模式vi编辑器有3种模式:命令模式、输入模式、末行模式。掌握这三种模式十分重要: 命令模式:vi启动后默认进入的是命令模式,从这个模式使用命令可以切换到另外两种模式,同时无论在任何模式下只要按一下[Esc]键都可以返回命令模式。 末行模式:在命令模式输入“:”即可进入该模式,在末行模式中有好多好用的命令。 二,复制a,复制整行命令模式下,光标位于要复制的当前行,输入yyb,复制一个单词命令模式下,光标位于要复制的当前单词的第一个字母,输入yw 三,黏贴命令模式下,输入p 四,删除a,删除整行命令模式下,光标位于要删除的所在行,输入dd b,删除一个单词命令模式下,光标位于要删除的单词的第一个字母,输入dw 五,撤销命令模式下,输入u 六,跳转命令模式下,输入要跳转的行数,然后再输入gg如:要跳转到当前文件的第150行,输入150gg mysqljoinon可以带and,例如:SELECTpa.nameasname,pa.snassn,re.created,sl.sn,re.phase,rd.times,ABS(sl.quantity)asquantity,dr.nameasdname,dr.specificationsasspecificationsFROMrrASreJOINredASrdONre.id=rd.ridJOINdrugASdrONdr.id=rd.didJOIN{{bbbb}}ASslONre.id=sl.r_idANDsl.d_id=rd.d_idJOINppASpaONpa.id=re.p_idWHERE$whereANDsl.receive_id>0用于将被join表没有对应数据的时候也可以将主join表的数据显示出来 phpcms更换编辑器由CKEditor为UEditor,简单两步,没有网上说的那么复杂,下面直接上操作图: 就以上两步骤,去UEditor官网下载源码,这个谁都会。下载完直接丢进根目录下/statics/js/目录即可。如果还有不会的,那我就没办法。 让我们来看一个简单的分支新建与分支合并的例子,实际工作中你可能会用到类似的工作流。你将经历如下步骤: 首先,我们假设你正在你的项目上工作,并且已经有一些提交。 现在,你已经决定要解决你的公司使用的问题追踪系统中的#53问题。想要新建一个分支并同时切换到那个分支上,你可以运行一个带有-b参数的gitcheckout命令: $gitcheckout-biss53Switchedtoanewbranch"iss53"它是下面两条命令的简写: 你继续在#53问题上工作,并且做了一些提交。在此过程中,iss53分支在不断的向前推进,因为你已经检出到该分支(也就是说,你的HEAD指针指向了iss53分支) 但是,在你这么做之前,要留意你的工作目录和暂存区里那些还没有被提交的修改,它可能会和你即将检出的分支产生冲突从而阻止Git切换到该分支。最好的方法是,在你切换分支之前,保持好一个干净的状态。有一些方法可以绕过这个问题(即,保存进度(stashing)和修补提交(commitamending)),我们会在储藏与清理中看到关于这两个命令的介绍。现在,我们假设你已经把你的修改全部提交了,这时你可以切换回master分支了: $gitcheckoutmasterSwitchedtobranch'master'这个时候,你的工作目录和你在开始#53问题之前一模一样,现在你可以专心修复紧急问题了。请牢记:当你切换分支的时候,Git会重置你的工作目录,使其看起来像回到了你在那个分支上最后一次提交的样子。Git会自动添加、删除、修改文件以确保此时你的工作目录和这个分支最后一次提交时的样子一模一样。 接下来,你要修复这个紧急问题。让我们建立一个针对该紧急问题的分支(hotfixbranch),在该分支上工作直到问题解决: 你可以运行你的测试,确保你的修改是正确的,然后将其合并回你的master分支来部署到线上。你可以使用gitmerge命令来达到上述目的: 现在,最新的修改已经在master分支所指向的提交快照中,你可以着手发布该修复了。 关于这个紧急问题的解决方案发布之后,你准备回到被打断之前时的工作中。然而,你应该先删除hotfix分支,因为你已经不再需要它了——master分支已经指向了同一个位置。你可以使用带-d选项的gitbranch命令来删除分支: $gitbranch-dhotfixDeletedbranchhotfix(3a0874c).现在你可以切换回你正在工作的分支继续你的工作,也就是针对#53问题的那个分支(iss53分支)。 你在hotfix分支上所做的工作并没有包含到iss53分支中。如果你需要拉取hotfix所做的修改,你可以使用gitmergemaster命令将master分支合并入iss53分支,或者你也可以等到iss53分支完成其使命,再将其合并回master分支。 假设你已经修正了#53问题,并且打算将你的工作合并入master分支。为此,你需要合并iss53分支到master分支,这和之前你合并hotfix分支所做的工作差不多。你只需要检出到你想合并入的分支,然后运行gitmerge命令: $gitcheckoutmasterSwitchedtobranch'master'$gitmergeiss53Mergemadebythe'recursive'strategy.index.html|1+1filechanged,1insertion(+)这和你之前合并hotfix分支的时候看起来有一点不一样。在这种情况下,你的开发历史从一个更早的地方开始分叉开来(diverged)。因为,master分支所在提交并不是iss53分支所在提交的直接祖先,Git不得不做一些额外的工作。出现这种情况的时候,Git会使用两个分支的末端所指的快照(C4和C5)以及这两个分支的工作祖先(C2),做一个简单的三方合并。 和之间将分支指针向前推进所不同的是,Git将此次三方合并的结果做了一个新的快照并且自动创建一个新的提交指向它。这个被称作一次合并提交,它的特别之处在于他有不止一个父提交。 需要指出的是,Git会自行决定选取哪一个提交作为最优的共同祖先,并以此作为合并的基础;这和更加古老的CVS系统或者Subversion(1.5版本之前)不同,在这些古老的版本管理系统中,用户需要自己选择最佳的合并基础。Git的这个优势使其在合并操作上比其他系统要简单很多。 既然你的修改已经合并进来了,你已经不再需要iss53分支了。现在你可以在任务追踪系统中关闭此项任务,并删除这个分支。 $gitbranch-diss53遇到冲突时的分支合并有时候合并操作不会如此顺利。如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git就没法干净的合并它们。如果你对#53问题的修改和有关hotfix的修改都涉及到同一个文件的同一处,在合并它们的时候就会产生合并冲突: $gitmergeiss53Auto-mergingindex.htmlCONFLICT(content):Mergeconflictinindex.htmlAutomaticmergefailed;fixconflictsandthencommittheresult.此时Git做了合并,但是没有自动地创建一个新的合并提交。Git会暂停下来,等待你去解决合并产生的冲突。你可以在合并冲突后的任意时刻使用gitstatus命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件: $gitstatusOnbranchmasterYouhaveunmergedpaths.(fixconflictsandrun"gitcommit")Unmergedpaths:(use"gitadd <<<<<<