使用 gitosis 管理 git 服务器

通过apt安装,gitosis使用SSH key来认证用户,但用户不需要在主机上添加账号,而是使用服务器上的一个受限账号。 安装的过程需要在客户端和服务器之间切换,留意操作步骤之前的说明。这里服务器和客户端都是使用ubuntu linux。

服务器端(ip:192.168.1.254)
1. 安装 git
sudo apt-get install git-core

2. 安装  python 和 python-setuptools
sudo apt-get install python python-setuptools

3. 安装gitosis

cd /tmp
sudo git clone https://github.com/tv42/gitosis.git
cd gitosis
sudo python setup.py install

PS:git://eagain.net/gitosis 已经失效了,找了好久才有一个新的。

4. 创建git用户

sudo adduser
–system
–shell /bin/sh
–gecos ‘git user’
–group
–disabled-password
–home /home/git
git

客户端(也需要先安装 git)
5. 在 gitosis 管理员的机器上生成 密钥,把公钥重命名为comet@3GCOMET.pub,这里用scp传到服务器上
ssh-keygen -t rsa
mv id_rsa.pub comet@3GCOMET.pub
scp comet@3GCOMET.pub comet@192.168.1.254:comet@3GCOMET.pub

6.在 ~/.ssh/config 添加以下内容,以便连接到服务器
Host 192.168.1.254
Compression yes
IdentityFile ~/.ssh/id_rsa

服务器端
7.使用上面的 comet@3GCOMET.pub 初始化 gitosis
sudo -H -u git gitosis-init < comet@3GCOMET.pub
sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

客户端
8.获取服务器上的 gitosis-admin 项目,会有keydir 文件夹和gitosis.conf
git clone git@192.168.1.254:gitosis-admin.git

9.添加新组jichuteam、用户comet@HP、项目jichu,并推送到远程服务器

注:如果客户端是windows,使用Puttygen生成公钥和私钥:参数为SSH-2 RSA,1024位,按需加上密码。

如果之前是使用ssh-keygen生成的,在这里直接Load private key,然后save private key,保存为ppk格式才能用。

复制puttygen显示的公钥保存为*.pub文件,注意不是”save public key”,保证公钥文件只有1行内容,否则不正确。把公钥给git的管理员,让他用gitosis-admin之类的方法把公钥加入git服务器,并设置好对应项目的权限。

在新的客户端生成密钥,并把公钥放到 gitosis-adminkeydir ,这里是comet@HP.pub
cd gitosis-admin
vi gitosis.conf

修改为下面内容,其中[gitosis]可以看gitosis/example.conf的说明,members 的 comet@HP 就是 comet@HP.pub 的文件名,多个用户用空格隔开
[gitosis]
gitweb = no
daemon = no
loglevel = DEBUG

 

[group gitosis-admin]
writable = gitosis-admin
members = comet@3GCOMET

[group jichuteam]
members = comet@HP
writable = jichu

git push

10.到其他地方建立项目根目录,并设置默认用户和邮箱,在.git/config添加远程服务器URL
mkdir jichu
cd jichu
git init
git config user.name Comet
git config user.email iamcomet@3gcomet.com
git remote add origin git@192.168.1.254:jichu.git

11.在 jichu 目录下进行开发,这里新建了 log.txt(一定要有新文件),提交到index,加上”initial import”信息并提交到本地仓库,最后是推送到远程服务器。
echo “begin develop” > log.txt
git add .
git commit -a -m “initial import”
git push origin master

服务器端
12.在服务器的 /home/git/repositories/ 可以看到有 jichu.git 的版本库。

随机数的生成函数,这里贡献给大家。

首先是要用mt_rand()函数生成指定个数的随机数字;

然后使用array_unique()函数去重;

因为去重了;所以得到的数字就不够指定个数了;

所以;核心是要用while循环;直到得到指定个数的数字;

到这里基本可以是结束了;

对于追求完美的人来说;还可以再用个sort();

目的不是要用来排序;主要是将得到的数组key格式化;

用代码来说话;就如下;

<?php
/**
* 生成不重复的随机数
* @param  int $start  需要生成的数字开始范围
* @param  int $end    结束范围
* @param  int $length 需要生成的随机数个数
* @return array       生成的随机数
*/
function get_rand_number($start=1,$end=10,$length=4){
$connt=0;
$temp=array();
while($connt<$length){
$temp[]=mt_rand($start,$end);
$data=array_unique($temp);
$connt=count($data);
}
sort($data);
return $data;
}

当然;重点不是这个函数;重点是这个函数的思路;可以解决很多类似的问题;

6f8cd40d-4516-4c6d-b602-fb8671ab5530

作为PHP开发者请务必了解Composer

Composer是一个非常流行的PHP包依赖管理工具,已经取代PEAR包管理器,对于PHP开发者来说掌握Composer是必须的.

对于使用者来说Composer非常的简单,通过简单的一条命令将需要的代码包下载到vendor目录下,然后开发者就可以引入包并使用了.

其中的关键在于你项目定义的composer.json,可以定义项目需要依赖的包(可能有多个),而依赖的包可能又依赖其他的包(这就是组件的好处),这些都不用你烦心,Composer会自动下载你需要的一切,一切在于composer.json的定义.

Composer对于使用者来说是很透明,但是其背后的理念还是需要了解一下的,其的诞生也不是偶然的,得益于Github的快速发展,PHP语言也越来越现代化,显得更高大上了.

为了理解Composer,先大概了解下其结构:

Composer的结构

  • Composer命令行工具:

    这个理解就比较简单了,通过使用者定义的Composer.json去下载你需要的代码,假如只是简单的使用Composer,那么掌握一些具体命令就完全可以了

  • Autoloading代码加载器:

    通过Composer,开发者可以通过多种方式去使用,而其中的关键在于PHP的命名空间概念,以及PSR-4标准的发展,Composer只是根据这二者开发了一个代码自动加载器

  • Github:

    有了Github,PHP开发人员可以将开源的代码托管在这上面,而Composer的发展源于Github,Composer本质上就是将Github上的代码下载到本地.

  • Packagist:

    对于使用者来说使用的是Composer的命令行工具,那么命令行工具怎么知道有多少包可以被用户使用呢,这主要就是依赖于Packagist,Packagist是Composer主要的一个包信息存储库,包开发者将具体代码托管到Github上,将包信息提交到Packagist上,这样使用者就可以通过Composer去使用.

  • Composer根据本地定义的composer.json信息去查询Packagist,Packagist根据Composer.json/Package.json信息解析,最终对应到github仓库,Composer最终下载代码的时候还要依赖于Github仓库上的Composer.json,这里涉及到三种类型的composer.json,含义是不一样的.
  • Composer.json:

    这是Composer的核心,是Composer的规则,上面也提到了三种类型的Composer.json,在使用的时候一定要注意区分,我初学的时候就总是搞乱.

Composer命令行工具

composer init

使用者可以在自己的项目下创建composer.json以便定义你项目的依赖包,也可以通过composer init交互式的创建composer.json.

composer install

应该是最常用的命令,composer会根据本地的composer.json安装包,将下载的包放入项目下的vendor目录下,同时将安装时候的包版本信息放入到composer.lock,以便锁定版本.

其实在install的时候,假如发现composer.lock版本和目前vendor目录下的代码版本是一致的,则Composer会什么也不做,composer.lock的目的就是让你安心在目前这个版本下工作,而不获取最新版本的包.

composer update

那么如何更新composer.lock以便获取到最新版本的包呢?通过这个命令即可更新最新版本的包

composer config

这个命令还是建议了解下,全局的配置保存在COMPOSER_HOME/config.json,非全局的配置信息则存储在本项目目录下.

composer configlistg

composer configg notifyoninstall false

composer global config bindirabsolute

composer create-project

这个命令不常用,但是个人觉得还是很重要的,使用普通的install命令是将项目所有的依赖包下载到本项目vendor目录下.而通过这个命令则是将所有的代码及其依赖的包放到一个目录下,相当于执行了一个git clone命令,一般是包的开发者可能为了修复bug会使用该命令.

composer global

这是一个全局的安装命令,它允许你在COMPOSER_HOME目录下执行Composer的命令,比如install,update.当然你的COMPOSER_HOME要在$PATH环境下.

比如执行composer global require fabpot/php-cs-fixer,现在php-cs-fixer命令行可以全局运行了,如果稍后想更新它,只需要运行composer global update

composer dump-autoload

当你修改项目下的composer.json的文件,并不一定要运行composer update命令进行更新,有的时候可以使用该命令来更新加载器,比如你要引用本地自定义的包(不是来自于packagist),后面会通过实践来说明该命令.

composer require

假如手动或者交互式创建composer.json文件,可以直接使用该命令来安装包

composer require  cerdic/csstidy:1.5.2

composer require “ywdblog/phpcomposer:dev-master”

–prefer-source和–prefer-dist参数

–prefer-dist:对于稳定的包来说,一般Composer安装默认使用该参数,这也能加快安装,比如有可能直接从packagist安装了相应的包,而不用实际去Github上下载包.

–prefer-source:假如使用该参数,则会直接从Github上安装,安装包后vendor目录下还含有.git信息

composer require “ywdblog/phpcomposer:dev-master”prefersource

#在vendor/ywdblog/phpcomposer目录下含有.git信息

如何给Composer添加代理

在国内使用Composer下载特别慢,可以通过二个方法进行加速

  • composer config repo.packagist composer “https://packagist.phpcomposer.com“
  • 编辑composer.json

“repositories”: {

  “packagist”: {

      “type”: “composer”,

      “url”: “https://packagist.phpcomposer.com”

  }

}

Autoloading代码加载器

composer本身集成一个autoloader,支持PSR-4,PSR-0,classmap,files autoloading.

这里通过一个例子来说明通过Composer如何引用classmap,files,本地符合PSR-4标准的代码

编辑composer.json

“autoload”: {

  “classmap”: [“othsrc/”,“classsrc.php”],

  “files”: [“othsrc/filesrc.php”],

  “psr-4”: {“Foo\Bar\”: “src}

}

composer dump-autoload

通过上述的操作,对于PSR-4来说等同注册了一个PSR-4 autoloader(从FooBar命名空间)

假如不想使用Composer的autoloader,可以直接包含vendor/composer/autoload_*.php 文件,配置自己的加载器.

具体的例子托管在github上,可参考.

Repositories

关于Repositories,了解其不是必须的,但是假如掌握则更能理解Composer,对于Repositories,其中文文档和英文文档解释的很好,这里也进行了一些摘抄.

基本概念

包:

Composer是一个依赖管理工具,它在本地安装一些资源包和包的描述(比如包名称和对应的版本),比较重要的元数据描述是dist和source,dist指向一个存档,该存档是对一个资源包的某个版本的数据进行的打包.source指向一个开发中的源,这通常是一个源代码仓库(比如git)

资源库:

一个资源库是一个包的来源.它是一个packages/versions的列表.

Composer将查看所有你定义的repositories以找到项目需要的资源包(这句话很重要).

默认情况下已经将Packagist.org注册到Composer(或者理解为Packagist.org是Composer资源库默认的仓库类型)

Composer资源库类型

Composer资源库包括四种类型,默认的是composer类型,也就是packagist.org所使用的资源类型.

它使用一个单一的packages.json文件,包含了所有的资源包元数据.当你将包发布到pckagist.org上,则默认系统会创建一个packages.json,不过我没有找到我的包对应的文件.

VCS资源库类型

假如你想构建一个私有的Composer私有资源库类型,可以使用该类型,这里举一个例子,比如你在自己项目的composer.json定义如下,则就可以使用对应的Github上的代码了.

{

    “repositories”: [

    {

        “type”: “vcs”,

        “url”: “https://github.com/ywdblog/phpcomposer”

    }

    ],

    “require”: {

        “ywdblog/phpcomposer”: “dev-master”

    }

}

当运行composer update的时候,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包,取决于它的上下文,比如你git clone ywdblog/phpcomposer,则这时候本地phpcomposer目录就是ROOT包,假如你在本地phpcomposer目录下composer require ywdblog/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支持多种形式的引用方式,比如:

composer require monolog/monolog  1.0.0RC1

composer require monolog/monolog  v1.0.0RC1

composer require monolog/monolog  1.0.*

composer require monolog/monolog  ~1.10

对于Github上的分支来说,Packagist会创建对应包的版本,假如分支名看起来像一个版本,将创建{分支名}-dev的包版本号,如果分支名看起来不像一个版本号,它将会创建dev-{分支名}形式的版本号

composer require monolog/monolog  masterdev

composer require monolog/monolog  master.xdev

总结:

理解Composer,最重要的是实践,最后也能明白PSR-4和命名空间,也可以尝试将你的项目发布到pckagist.org上.

搭建Git服务器

在远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7×24小时开机并交换大家的修改。

GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。

搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。

假设你已经有sudo权限的用户账号,下面,正式开始安装。

第一步,安装git

$ sudo apt-get install git

第二步,创建一个git用户,用来运行git服务:

$ sudo adduser git

第三步,创建证书登录:

收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

第四步,初始化Git仓库:

先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:

$ sudo git init --bare sample.git

Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git

$ sudo chown -R git:git sample.git

第五步,禁用shell登录:

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash

改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

第六步,克隆远程仓库:

现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:

$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.

剩下的推送就简单了。

管理公钥

如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。

这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。

管理权限

有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。

这里我们也不介绍Gitolite了,不要把有限的生命浪费到权限斗争中。

小结

  • 搭建Git服务器非常简单,通常10分钟即可完成;
  • 要方便管理公钥,用Gitosis;
  • 要像SVN那样变态地控制权限,用Gitolite。

Vsftp的安装,Vsftp添加用户linux/windows

关于Vsftp的安装以及配置方法现总结如下(包括vsftp如何添加用户)不多说,直接看操作流程:

设置方法:

aliyun Linux(Redhat)安装vsftp软件

1.更新yum源

首先需要更新系统的yum源,便捷工具下载地址:update_source.zip。这里需要注意的是,目前文件无法传输,所以想要运行 update_source.sh 只能用文本打开,复制粘贴到阿里云服务器系统运行。

2.安装vsftp

使用yum命令安装vsftp

#yum install vsftpd -y

3.添加ftp帐号和目录

先检查一下nologin的位置,通常在/usr/sbin/nologin或者/sbin/nologin下。

使用下面的命令创建帐户,该命令指定了/ftp为用户test的家目录,您可以自己定义帐户名和目录:

#useradd -d /ftp -s /sbin/nologin test

修改该帐户密码:

#passwd test

修改指定目录的权限

#chown -R test:test /ftp

4.配置vsftp

编辑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(具体看当前系统配置)则追加进去

6.启动vsftp服务并测试登录

使用命令启动vsftp服务:

#service vsftpd start

然后用帐号test测试下是否可以登陆ftp。目录是/ftp  推荐用filezilla比较流行的ftp工具。

win下xampp配置memcache,Mac请看下回分解

关于memcache安装网上教程很多,但是呢,很多人按照教程安装后,出现一系列的报错,不知所踪,然后百思不得其解,我明明已经按照教程,从头到尾进行了安装呀,怎么还是不行呢?出现这个错误,只跟php_memcache.dll这个文件,已经php.ini的配置有关系。

先说安装memcache服务:

1、选择一个你想要安装的memcache服务端版本,有63位与32位的。这里你可以根据你自己的机子来进行选择。这并不影响php的配置。

2、进入doc命令,先dir到你memcache解压的目录

3、执行服务注册命令:memcached.exe -d install

4、卸载服务的命令:memcached.exe -d uninstall

5、启动服务的命令:memcached.exe -d start

6、停止服务器的命令:memcached.exe -d stop

7、检查你的memcache是否安装成功,使用start explorer命令查看:start explorer 127.0.0.1 11211  在执行这个命令后,如果打开了一个新窗口,OK那么说明memcache的安装是成功了。现在可以将精力放在php的配置上了。

php中memcache的配置步骤很简单,就分为三步:

1、找到合适的php_memcache.dll,放入到php/ext目录下。下载地址:http://pecl.php.net/package/memcache/3.0.8/windows

2、打开php.ini文件,写入配置信息

  1. extension=php_memcache.dll
  2. [Memcache]
  3. memcache.allow_failover=1
  4. memcache.max_failover_attempts=20
  5. memcache.chunk_size=8192
  6. memcache.default_port=11211</span>

这部分配置信息来源php手册,地址:http://php.net/manual/zh/ref.memcache.php(文章最底部)

3、重新启动服务器,进行测试

网上的教程基本上就是这三步,如果我只是想说到这里,那这篇博客也没有必要写了,我最开始也是按照这三步进行的,但是测试时,发生了最上面的错误。其实步骤并没有错,这里的关键是如何找到自己所需要的php_memcache.dll,以及php.ini中的配置(因为有的集成环境包含的不仅仅只有一个php.ini)。

这里我将自己的方法分享一下:

1、首先通过phpinfo()将我们的php相关信息显示出来,查看以下几个关键信息:

好的,从这里,我们可以知道,我们的php版本是5.5.15,我们使用的配置文件位置在:D:\xampp\php\php.ini(我们自己的配置信息也要写入到这个php.ini文件中去)

最后这段文字:API20121212,TS,VC11。TS:表示我们这个服务是线程安全,NTS:表示是非线程安全。VC11你只要记住就好了。x86是你这个服务的版本,也可能是x64。

然后了解到这些信息后,你就可以到:http://pecl.php.net/package/memcache/3.0.8/windows这个地址中,找到你对应的版本。比如,以我截图为例,我应该选择的版本

php5.5 ts x86的。就通过这几个信息就可以定位了。

下载后,解压文件,里边有很多文件,你只需要把php_memcache.dll拷贝到php/ext文件中去,然后填写配置文件即可。然后重新启动,100%可以了。

转自:菜鸟coder博客。经过本人修正。

将在这篇文章里面整理linux之常用命令

  • cd命令

这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。如:
cd /root/Docements # 切换到目录/root/Docements
cd ./path          # 切换到当前目录下的path目录中,“.”表示当前目录  
cd ../path         # 切换到上层目录中的path目录中,“..”表示上一层目录
  • ls命令

这是一个非常有用的查看文件与目录的命令,list之意,它的参数非常多,下面就列出一些我常用的参数吧,如下:
-l :列出长数据串,包含文件的属性与权限数据等
-a :列出全部的文件,连同隐藏文件(开头为.的文件)一起列出来(常用)
-d :仅列出目录本身,而不是列出目录的文件数据
-h :将文件容量以较易读的方式(GB,kB等)列出来
-R :连同子目录的内容一起列出(递归列出),等于该目录下的所有文件都会显示出来
注:这些参数也可以组合使用,下面举两个例子:
ls -l #以长数据串的形式列出当前目录下的数据文件和目录
ls -lR #以长数据串的形式列出当前目录下的所有文件
  • grep命令

该命令常用于分析一行的信息,若当中有我们所需要的信息,就将该行显示出来,该命令通常与管道命令一起使用,用于对一些命令的输出进行筛选加工等等,它的简单语法为
grep [-acinv] [--color=auto] '查找字符串' filename
它的常用参数如下:
-a :将binary文件以text文件的方式查找数据
-c :计算找到‘查找字符串’的次数
-i :忽略大小写的区别,即把大小写视为相同
-v :反向选择,即显示出没有‘查找字符串’内容的那一行
# 例如:
# 取出文件/etc/man.config中包含MANPATH的行,并把找到的关键字加上颜色
grep --color=auto 'MANPATH' /etc/man.config
# 把ls -l的输出中包含字母file(不区分大小写)的内容输出
ls -l | grep -i file
  • find命令

find是一个基于查找的功能非常强大的命令,相对而言,它的使用也相对较为复杂,参数也比较多,所以在这里将给把它们分类列出,它的基本语法如下:
find [PATH] [option] [action]

# 与时间有关的参数:
-mtime n : n为数字,意思为在n天之前的“一天内”被更改过的文件;
-mtime +n : 列出在n天之前(不含n天本身)被更改过的文件名;
-mtime -n : 列出在n天之内(含n天本身)被更改过的文件名;
-newer file : 列出比file还要新的文件名
# 例如:
find /root -mtime 0 # 在当前目录下查找今天之内有改动的文件

# 与用户或用户组名有关的参数:
-user name : 列出文件所有者为name的文件
-group name : 列出文件所属用户组为name的文件
-uid n : 列出文件所有者为用户ID为n的文件
-gid n : 列出文件所属用户组为用户组ID为n的文件
# 例如:
find /home/ljianhui -user ljianhui # 在目录/home/ljianhui中找出所有者为ljianhui的文件

# 与文件权限及名称有关的参数:
-name filename :找出文件名为filename的文件
-size [+-]SIZE :找出比SIZE还要大(+)或小(-)的文件
-tpye TYPE :查找文件的类型为TYPE的文件,TYPE的值主要有:一般文件(f)、设备文件(b、c)、
             目录(d)、连接文件(l)、socket(s)、FIFO管道文件(p);
-perm mode :查找文件权限刚好等于mode的文件,mode用数字表示,如0755;
-perm -mode :查找文件权限必须要全部包括mode权限的文件,mode用数字表示
-perm +mode :查找文件权限包含任一mode的权限的文件,mode用数字表示
# 例如:
find / -name passwd # 查找文件名为passwd的文件
find . -perm 0755 # 查找当前目录中文件权限的0755的文件
find . -size +12k # 查找当前目录中大于12KB的文件,注意c表示byte
  • cp命令

该命令用于复制文件,copy之意,它还可以把多个文件一次性地复制到一个目录下,它的常用参数如下:
-a :将文件的特性一起复制
-p :连同文件的属性一起复制,而非使用默认方式,与-a相似,常用于备份
-i :若目标文件已经存在时,在覆盖时会先询问操作的进行
-r :递归持续复制,用于目录的复制行为
-u :目标文件与源文件有差异时才会复制
例如 :
cp -a file1 file2 #连同文件的所有特性把文件file1复制成文件file2
cp file1 file2 file3 dir #把文件file1、file2、file3复制到目录dir中
6、mv命令
该命令用于移动文件、目录或更名,move之意,它的常用参数如下:
-f :force强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i :若目标文件已经存在,就会询问是否覆盖
-u :若目标文件已经存在,且比目标文件新,才会更新
注:该命令可以把一个文件或多个文件一次移动一个文件夹中,但是最后一个目标文件一定要是“目录”。
例如:
mv file1 file2 file3 dir # 把文件file1、file2、file3移动到目录dir中
mv file1 file2 # 把文件file1重命名为file2
  • rm命令

该命令用于删除文件或目录,remove之间,它的常用参数如下:
-f :就是force的意思,忽略不存在的文件,不会出现警告消息
-i :互动模式,在删除前会询问用户是否操作
-r :递归删除,最常用于目录删除,它是一个非常危险的参数
例如:
rm -i file # 删除文件file,在删除之前会询问是否进行该操作
rm -fr dir # 强制删除目录dir中的所有文件
  • ps命令

该命令用于将某个时间点的进程运行情况选取下来并输出,process之意,它的常用参数如下:
-A :所有的进程均显示出来
-a :不与terminal有关的所有进程
-u :有效用户的相关进程
-x :一般与a参数一起使用,可列出较完整的信息
-l :较长,较详细地将PID的信息列出
其实我们只要记住ps一般使用的命令参数搭配即可,它们并不多,如下:
ps aux # 查看系统所有的进程数据
ps ax # 查看不与terminal有关的所有进程
ps -lA # 查看系统所有的进程数据
ps axjf # 查看连同一部分进程树状态
  • kill命令

该命令用于向某个工作(%jobnumber)或者是某个PID(数字)传送一个信号,它通常与ps和jobs命令一起使用,它的基本语法如下:
kill -signal PID
signal的常用参数如下:
注:最前面的数字为信号的代号,使用时可以用代号代替相应的信号。
1:SIGHUP,启动被终止的进程
2:SIGINT,相当于输入ctrl+c,中断一个程序的进行
9:SIGKILL,强制中断一个进程的进行
15:SIGTERM,以正常的结束进程方式来终止进程
17:SIGSTOP,相当于输入ctrl+z,暂停一个进程的进行
例如:
# 以正常的结束进程方式来终于第一个后台工作,可用jobs命令查看后台中的第一个工作进程
kill -SIGTERM %1 
# 重新改动进程ID为PID的进程,PID可用ps命令通过管道命令加上grep命令进行筛选获得
kill -SIGHUP PID
  • killall命令

该命令用于向一个命令启动的进程发送一个信号,它的一般语法如下:
killall [-iIe] [command name]
它的参数如下:
-i :交互式的意思,若需要删除时,会询问用户
-e :表示后面接的command name要一致,但command name不能超过15个字符
-I :命令名称忽略大小写
# 例如:
killall -SIGHUP syslogd # 重新启动syslogd
  • file命令

该命令用于判断接在file命令后的文件的基本数据,因为在Linux下文件的类型并不是以后缀为分的,所以这个命令对我们来说就很有用了,它的用法非常简单,基本语法如下:
file filename
#例如:
file ./test
  • tar命令

该命令用于对文件进行打包,默认情况并不会压缩,如果指定了相应的参数,它还会调用相应的压缩程序(如gzip和bzip等)进行压缩和解压。它的常用参数如下:
-c :新建打包文件
-t :查看打包文件的内容含有哪些文件名
-x :解打包或解压缩的功能,可以搭配-C(大写)指定解压的目录,注意-c,-t,-x不能同时出现在同一条命令中
-j :通过bzip2的支持进行压缩/解压缩
-z :通过gzip的支持进行压缩/解压缩
-v :在压缩/解压缩过程中,将正在处理的文件名显示出来
-f filename :filename为要处理的文件
-C dir :指定压缩/解压缩的目录dir
上面的解说可以已经让你晕过去了,但是通常我们只需要记住下面三条命令即可:
压缩:tar -jcv -f filename.tar.bz2 要被处理的文件或目录名称
查询:tar -jtv -f filename.tar.bz2
解压:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
注:文件名并不定要以后缀tar.bz2结尾,这里主要是为了说明使用的压缩程序为bzip2
  • cat命令

该命令用于查看文本文件的内容,后接要查看的文件名,通常可用管道与more和less一起使用,从而可以一页页地查看数据。例如:
cat text | less # 查看text文件中的内容
# 注:这条命令也可以使用less text来代替
  • chgrp命令

该命令用于改变文件所属用户组,它的使用非常简单,它的基本用法如下:
chgrp [-R] dirname/filename
-R :进行递归的持续对所有文件和子目录更改
# 例如:
chgrp users -R ./dir # 递归地把dir目录下中的所有文件和子目录下所有文件的用户组修改为users
  • chown命令

该命令用于改变文件的所有者,与chgrp命令的使用方法相同,只是修改的文件属性不同,不再详述。
  • chmod命令

该命令用于改变文件的权限,一般的用法如下:
chmod [-R] xyz 文件或目录
-R:进行递归的持续更改,即连同子目录下的所有文件都会更改
同时,chmod还可以使用u(user)、g(group)、o(other)、a(all)和+(加入)、-(删除)、=(设置)跟rwx搭配来对文件的权限进行更改。
# 例如:
chmod 0755 file # 把file的文件权限改变为-rxwr-xr-x
chmod g+w file # 向file的文件权限中加入用户组可写权限
  • vim命令

该命令主要用于文本编辑,它接一个或多个文件名作为参数,如果文件存在就打开,如果文件不存在就以该文件名创建一个文件。vim是一个非常好用的文本编辑器,它里面有很多非常好用的命令,在这里不再多说。你可以从这里下载vim常用操作的详细说明。
  • gcc命令

对于一个用Linux开发C程序的人来说,这个命令就非常重要了,它用于把C语言的源程序文件,编译成可执行程序,由于g++的很多参数跟它非常相似,所以这里只介绍gcc的参数,它的常用参数如下:
-o :output之意,用于指定生成一个可执行文件的文件名
-c :用于把源文件生成目标文件(.o),并阻止编译器创建一个完整的程序
-I :增加编译时搜索头文件的路径
-L :增加编译时搜索静态连接库的路径
-S :把源文件生成汇编代码文件
-lm:表示标准库的目录中名为libm.a的函数库
-lpthread :连接NPTL实现的线程库
-std= :用于指定把使用的C语言的版本

# 例如:
# 把源文件test.c按照c99标准编译成可执行程序test
gcc -o test test.c -lm -std=c99
#把源文件test.c转换为相应的汇编程序源文件test.s
gcc -S test.c
  • time命令

该命令用于测算一个命令(即程序)的执行时间。它的使用非常简单,就像平时输入命令一样,不过在命令的前面加入一个time即可,例如:
time ./process
time ps aux
在程序或命令运行结束后,在最后输出了三个时间,它们分别是:
user:用户CPU时间,命令执行完成花费的用户CPU时间,即命令在用户态中执行时间总和;
system:系统CPU时间,命令执行完成花费的系统CPU时间,即命令在核心态中执行时间总和;
real:实际时间,从command命令行开始执行到运行终止的消逝时间;
  •  lsblk命令

lsblk“就是列出块设备。除了RAM外,以标准的树状输出格式,整齐地显示块设备。

lsblk -l”命令以列表格式显示块设备(而不是树状格式)。

  • md5sum命令

md5sum”就是计算和检验MD5信息签名。md5 checksum(通常叫做哈希)使用匹配或者验证文件的文件的完整性,因为文件可能因为传输错误,磁盘错误或者无恶意的干扰等原因而发生改变。

 

  • uname命令

uname“命令就是Unix Name的简写。显示机器名,操作系统和内核的详细信息。

root@raspberrypi:/# uname -a
Linux raspberrypi 3.6.11+ #528 PREEMPT Tue Aug 20 00:25:53 BST 2013 armv6l GNU/Linux
  • history命令

history”命令就是历史记录。它显示了在终端中所执行过的所有命令的历史。

注意:按住“CTRL + R”就可以搜索已经执行过的命令,它可以在你写命令时自动补全。

  • sudo命令

sudo”(super user do)命令允许授权用户执行超级用户或者其它用户的命令。通过在sudoers列表的安全策略来指定。

 

  •  mkdir命令

mkdir”(Make directory)命令在命名路径下创建新的目录。然而如果目录已经存在了,那么它就会返回一个错误信息”不能创建文件夹,文件夹已经存在了”(“cannot create folder, folder already exists”)

root@raspberrypi:/opt/labpark# mkdir raspbox

注意:目录只能在用户拥有写权限的目录下才能创建。mkdir:不能创建目录`tecmint`,因为文件已经存在了。(上面的输出中不要被文件迷惑了,你应该记住我开头所说的-在linux中,文件,文件夹,驱动,命令,脚本都视为文件)

  • touch 命令

touch”命令代表了将文件的访问和修改时间更新为当前时间。touch命令只会在文件不存在的时候才会创建它。如果文件已经存在了,它会更新时间戳,但是并不会改变文件的内容。

root@raspberrypi:/opt/labpark# touch rasp.txt

注意:touch 可以用来在用户拥有写权限的目录下创建不存在的文件。

  • apt命令

Debian系列以“apt”命令为基础,“apt”代表了Advanced Package Tool。APT是一个为Debian系列系统(Ubuntu,Kubuntu等等)开发的高级包管理器,在Gnu/Linux系统上,它会为包自动地,智能地搜索,安装,升级以及解决依赖。

  • pwd 命令

pwd”(print working directory),在终端中显示当前工作目录的全路径。

root@raspberrypi:/opt/labpark# pwd
/opt/labpark

  •  命令: Find

搜索指定目录下的文件,从开始于父目录,然后搜索子目录。

root@raspberrypi:/opt/labpark# find book*
book_backup.txt
book.txt

 

root@raspberrypi:/opt/labpark# find -name *.c
./hello.c

 

root@raspberrypi:/opt/labpark# find -iname FACE*
./facebook.txt

 

注意: `-name‘选项是搜索大小写敏感。可以使用`-iname‘选项,这样在搜索中可以忽略大小写。(*是通配符,可以搜索所有的文件;‘.sh‘你可以使用文件名或者文件名的一部分来制定输出结果)

 

  • 命令: grep

 

grep‘命令搜索指定文件中包含给定字符串或者单词的行。举例搜索‘/etc/passwd‘文件中的‘pi’

root@raspberrypi:/opt/labpark# grep pi /etc/passwd
pi:x:1000:1000:,,,:/opt/wwwroot:/bin/bash

使用’-i’选项将忽略大小写。

root@raspberrypi:/opt/labpark# grep -i  'PI' /etc/passwd
pi:x:1000:1000:,,,:/opt/wwwroot:/bin/bash

使用’-r’选项递归搜索所有自目录下包含字符串 “localhost“.的行。

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

注意:您还可以使用以下选项:

  1. -w 搜索单词 (egrep -w ‘word1|word2‘ /path/to/file).
  2. -c 用于统计满足要求的行 (i.e., total number of times the pattern matched) (grep -c ‘word‘ /path/to/file).
  3. –color 彩色输出 (grep –color server /etc/passwd).

 

  •  命令: man

man‘是系统帮助页。Man提供命令所有选项及用法的在线文档。几乎所有的命令都有它们的帮助页

  • 命令: ps

ps命令给出正在运行的某个进程的状态,每个进程有特定的id成为PID。

  • 命令: whereis

whereis的作用是用来定位命令的二进制文件\资源\或者帮助页.举例来说,获得ls和kill命令的二进制文件/资源以及帮助页

  • 命令: service

service‘命令控制服务的启动、停止和重启,它让你能够不重启整个系统就可以让配置生效以开启、停止或者重启某个服务。

  • 命令: alias

alias是一个系统自建的shell命令,允许你为名字比较长的或者经常使用的命令指定别名。

我经常用ls -l‘命令,它有五个字符(包括空格)。于是我为它创建了一个别名‘l’。

  • 命令: df

报告系统的磁盘使用情况。在跟踪磁盘使用情况方面对于普通用户和系统管理员都很有用。 ‘df‘ 通过检查目录大小工作,但这一数值仅当文件关闭时才得到更新。

  • 命令: du

估计文件的空间占用。 逐层统计文件(例如以递归方式)并输出摘要。

注意: ‘df‘ 只显示文件系统的使用统计,但‘du‘统计目录内容。

  • 命令: passwd

这是一个很重要的命令,在终端中用来改变自己密码很有用。显然的,因为安全的原因,你需要知道当前的密码。

root@raspberrypi:/opt/wwwroot# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

 

  • 命令: lpr

这个命令用来在命令行上将指定的文件在指定的打印机上打印。

root@raspberry:~# lpr -P deskjet-4620-series 1-final.pdf

 

注意: “lpq“命令让你查看打印机的状态(是开启状态还是关闭状态)和等待打印中的工作(文件)的状态。

 

  • 命令: cmp

比较两个任意类型的文件并将结果输出至标准输出。如果两个文件相同, ‘cmp‘默认返回0;如果不同,将显示不同的字节数和第一处不同的位置。

  • 命令: wget

Wget是用于非交互式(例如后台)下载文件的免费工具.支持HTTPHTTPSFTP协议和 HTTP 代理。

 

  • 命令: mount

mount 是一个很重要的命令,用来挂载不能自动挂载的文件系统。你需要root权限挂载设备。

在插入你的文件系统后,首先运行”lsblk“命令,识别出你的设备,然后把分配的设备名记下来。

  • 命令: ifconfig

ifconfig用来配置常驻内核的网络接口信息。在系统启动必要时用来设置网络适配器的信息。之后,它通常是只需要在调试时或当系统需要调整时使用。

  •  命令: netstat

netstat命令显示各种网络相关的信息,如网络连接,路由表,接口统计,伪装连接,组播成员身份等….

  • 命令: uptime

你连接到你的 Linux 服务器时发现一些不寻常或恶意的东西,你会做什么?猜测……不,绝不!你可以运行uptime来验证当服务器无人值守式到底发生了什么事情。

root@raspberrypi:~# uptime
 04:09:59 up 7 min,  1 user,  load average: 0.01, 0.31, 0.24

 

  • 命令:w

是否觉得命令’w’很滑稽?但是事实上不是的。它是一个命令,尽管只有一个字符长!命令”w“是uptimewho命令,以前后的顺序组合在一起。

  • 命令: top

显示CPU进程信息。这个命令自动刷新,默认是持续显示CPU进程信息,除非使用了中断指令(Ctrl+c)。

  • 命令: mkfs.ext4

这个命令在指定的设备上创建一个新的ext4文件系统,如果这个命令后面跟的是个错误的设备,那么整个设备就会被擦除和格式化,所以建议不要运行这个命令,除非你清楚自己正在干什么。

Mkfs.ext4 /dev/sda1 (sda1 block will be formatted)
mkfs.ext4 /dev/sdb1 (sdb1 block will be formatted)
  • lsof -i:80  找出80端口

  • tail -f  filename      监视filename文件的尾部内容(默认10行,相当于增加参数 -n 10),刷新显示在屏幕上。退出,按下CTRL+C。

linux下vi的复制,黏贴,删除,撤销,跳转等命令

一,模式
vi编辑器有3种模式:命令模式输入模式末行模式。掌握这三种模式十分重要:

命令模式:vi启动后默认进入的是命令模式,从这个模式使用命令可以切换到另外两种模式,同时无论在任何模式下只要按一下[Esc]键都可以返回命令模式。

输入模式:在命令模式中输入字幕“i”就可以进入vi的输入模式编辑文件。在这个模式中我们可以编辑、修改、输入等编辑工作,在编辑器最后一行显示一个“–INSERT–”标志着vi进入了输入模式。当我们完成修改输入等操作的时候我们需要保存文件,这时我们需要先返回命令模式,在进入末行模式保存。

末行模式:在命令模式输入“:”即可进入该模式,在末行模式中有好多好用的命令。

二,复制
a,复制整行
命令模式下,光标位于要复制的当前行,输入 yy
b,复制一个单词
命令模式下,光标位于要复制的当前单词的第一个字母,输入 yw

三,黏贴
命令模式下,输入 p

四,删除
a,删除整行
命令模式下,光标位于要删除的所在行,输入 dd

b,删除一个单词
命令模式下,光标位于要删除的单词的第一个字母,输入 dw

五,撤销
命令模式下,输入 u

六,跳转
命令模式下,输入 要跳转的行数,然后再输入 gg
如:要跳转到当前文件的第150行,输入 150gg

善用mysql中join的on条件内可以带and建立多条件join

mysql join on 可以带and,例如:
SELECT pa.name as name, pa.sn as sn, re.created, sl.sn, re.phase, rd.times, ABS(sl.quantity) as quantity, dr.name as dname, dr.specifications as specifications
FROM rr AS re JOIN red AS rd ON re.id = rd.rid JOIN drug AS dr ON dr.id = rd.did JOIN {{bbbb}} AS sl ON re.id = sl.r_id AND sl.d_id = rd.d_id JOIN pp AS pa ON pa.id = re.p_id
WHERE $where AND sl.receive_id >0
用于将被join表没有对应数据的时候也可以将主join表的数据显示出来

QQ截图20160530000552

phpcms更换编辑器由CKEditor为UEditor,简单两步,没有网上说的那么复杂…

phpcms更换编辑器由CKEditor为UEditor,简单两步,没有网上说的那么复杂,下面直接上操作图:

QQ截图20160526000200 QQ截图20160526000323

就以上 两步骤,去UEditor官网下载源码,这个谁都会。下载完直接丢进根目录下/statics/js/目录即可。如果还有不会的,那我就没办法。

以上仅为分享麦芒个人心得,希望广大码农们,一旦解决了一些问题,都把它们分享出来,让朋友们少走弯路。