Submitted by gouki on 2013, March 9, 10:02 PM
有了服务器,怎么着都得装个Ftp吧,否则,必须得让人用ssh连接来上传文件 ?
于是我找了proftpd,因为比较简单vsftpd太麻烦了。proftpd的教程很简单
1、先apt-get update,apt-get upgrade
2、apt-get install proftpd-basic proftpd-mod-mysql
3、修改 /etc/proftpd/proftpd.conf
因为原内容都注释了,所以直接在文件的最后加上:
XML/HTML代码
- DefaultRoot ~
- Include /etc/proftpd/sql.conf
- RequireValidShell off
4、添加一个组,和一个用户:
XML/HTML代码
- groupadd -g 2001 ftpgroup
- useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser
5、去mysql里增加一个用户,如proftpd/proftpdpass,建一个数据库,如:proftpd
6、插入表结构:
SQL代码
- CREATE TABLE ftpgroup (
- groupname varchar(16) NOT NULL default '',
- gid smallint(6) NOT NULL default '2001',
- members varchar(16) NOT NULL default '',
- KEY groupname (groupname)
- ) ENGINE=MyISAM COMMENT='ProFTP group table';
-
- CREATE TABLE ftpuser (
- id int(10) unsigned NOT NULL auto_increment,
- userid varchar(32) NOT NULL default '',
- passwd varchar(32) NOT NULL default '',
- uid smallint(6) NOT NULL default '2001',
- gid smallint(6) NOT NULL default '2001',
- homedir varchar(255) NOT NULL default '',
- shell varchar(16) NOT NULL default '/sbin/nologin',
- count int(11) NOT NULL default '0',
- accessed datetime NOT NULL default '0000-00-00 00:00:00',
- modified datetime NOT NULL default '0000-00-00 00:00:00',
- PRIMARY KEY (id),
- UNIQUE KEY userid (userid)
- ) ENGINE=MyISAM COMMENT='ProFTP user table';
7、修改/etc/proftpd/modules.conf,去掉两行注释:
XML/HTML代码
- LoadModule mod_sql.c
- LoadModule mod_sql_mysql.c
8、修改/etc/proftpd/sql.conf
XML/HTML代码
- SQLBackend mysql
- SQLAuthTypes Crypt
- #下面一行就是用户名密码
- SQLConnectInfo 数据库@localhost 用户名 密码
- SQLUserInfo ftpuser userid passwd uid gid homedir shell
- SQLGroupInfo ftpgroup groupname gid members
- # Update count every time user logs in
- SQLLog PASS updatecount
- SQLNamedQuery updatecount UPDATE "countcount=count+1, accessed=now() WHERE userid='%u'" ftpuser
- SQLLog STOR,DELE modified
- SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser
9、插入用户:
XML/HTML代码
- INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');
- INSERT INTO `ftpuser` ( `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`) VALUES ( 'username', ENCRYPT('password'), 2001, 2001, '/var/www/www.example.com/', '/sbin/nologin', 0);
10、重启proftpd:/etc/init.d/proftpd restart
上面这段其实是来自:http://www.sysadminworld.com/2011/install-proftpd-with-mysql-backend-on-debian-ubuntu/
--------EOF---
至此,上面的内容基本上就能够登录成功了,如果还是失败,建议先停掉proftpd,然后运行proftpd -nd6,查看错误信息,比如我就看到了这个:
XML/HTML代码
- Mar 09 00:22:29 test proftpd[8850] test (0.0.0.0[0.0.0.0]): notice: unable to use '~/' [resolved to '/server/wwwroot/htdocs/']: Permission denied
- Mar 08 16:22:29 test proftpd[8850] test (0.0.0.0[0.0.0.0]): Preparing to chroot to directory '~/'
- Mar 08 16:22:29 test proftpd[8850] test (0.0.0.0[0.0.0.0]): chroot to '~/' failed for user 'xxxxxx': Operation not permitted
- Mar 08 16:22:29 test proftpd[8850] test (0.0.0.0[0.0.0.0]): error: unable to set default root directory
- Mar 08 16:22:29 test proftpd[8850] test (0.0.0.0[0.0.0.0]): FTP session closed.
我靠,这个怎么办?
这时候我又请vampire帮忙了。他就帮我检查了一下,做了几个处理:
1、vim /etc/groups ,在www-data:x:33后面加了:www-data:x:33:ftpgroup ,表示权限跟着www-data,因为我们的ftp目录里的文件都是基于www-data的
2、修改/etc/proftpd/proftpd.conf,改其中的:user / group ,都改成www-data
3、还是/etc/proftpd/proftpd.conf ,改 Umask ,原来是Umask 022 022,去掉一个022
4、因为我的www-data是gid是33,所以刚才在数据库里插的gid统统换成33,而不是原来的2001,这时候再登录其实还是不正常。
5、最重要的一个,在刚才的sql.conf里面,加入:SQLMinID 33,这个玩意要参考:http://www.proftpd.org/docs/directives/linked/config_ref_SQLMinID.html,我晶,这个东西,居然在默认的sql.conf里是没有这一行的。果然还是vampire有经验。因为www-data的gid是33,所以sqlminid就是33了。
这时候,终于一切正常了。折腾了好久。。。
Tags: aliyun, proftpd
苹果相关 | 评论:0
| 阅读:17917
Submitted by gouki on 2013, March 9, 9:18 PM
最近在试用阿里云,但是遇到了一些问题。
我在安装数据库的时候,是通过apt-get install mysql-server进行安装的,然而我安装完后,想将数据存储到额外挂载的磁盘时,却发现数据不能写入。。。
因为我老是启动失败。。所以看了下LOG,LOG是说写入目录失败。
于是请vampire帮忙看了一下,他测试了mysql_install_db,但是。。。
XML/HTML代码
- # mysql_install_db --datadir=/server/software/mysql_data
- Installing MySQL system tables...
- 130308 16:14:25 [Warning] Can't create test file /server/software/mysql_data/AY130304113437124704.lower-test
- 130308 16:14:25 [Warning] Can't create test file /server/software/mysql_data/AY130304113437124704.lower-test
- ERROR: 1005 Can't create table 'db' (errno: 13)
- 130308 16:14:25 [ERROR] Aborting
-
- 130308 16:14:25 [Note] /usr/sbin/mysqld: Shutdown complete
-
-
- Installation of system tables failed! Examine the logs in
- /server/software/mysql_data for more information.
-
- You can try to start the mysqld daemon with:
-
- shell> /usr/sbin/mysqld --skip-grant &
-
- and use the command line tool /usr/bin/mysql
- to connect to the mysql database and look at the grant tables:
-
- shell> /usr/bin/mysql -u root mysql
- mysql> show tables
-
- Try 'mysqld --help' if you have problems with paths. Using --log
- gives you a log in /server/software/mysql_data that may be helpful.
-
- Please consult the MySQL manual section
- 'Problems running mysql_install_db', and the manual section that
- describes problems on your OS. Another information source are the
- MySQL email archives available at http://lists.mysql.com/.
-
- Please check all of the above before mailing us! And remember, if
- you do mail us, you MUST use the /usr/scripts/mysqlbug script!
oh shit,还是安装不了。试了很多都没有用。最后从官方下载了5.6的包进行安装。居然就OK了。我靠,这个源是cn.ubuntu的源啊。。。苦逼了。
所幸问题解决了。
多谢vampire,同时各位朋友也注意下。如果真的不行,也可以尝试从网上直接下载源码编译,要么。就换成中科大的源,然后再upgrade。中科大的更新比较快。
但因为要修改内容和启动参数还是有点危险的。。。
苹果相关 | 评论:0
| 阅读:14140
Submitted by gouki on 2012, February 17, 6:10 PM
看到一段歇斯底里的话:
在该死的程序员生涯中应当遵循的守则:
- 保持该死的主线干净!
- 在该死的独立分支上进行该死的新功能的开发!
- 一旦你公布了代码,并且某些人使用了它,那就 TMD 不要修改 API!
- 如果想要或者必须修改 API,修改 TMD 主版本号 并且 在独立于原代码库的新的代码库上进行该死的开发!
- 如果有必要,非常有必要使用某些特别的标签,做分支或提交作为依赖,你得 TMD 用自己 fork 出来的代码库进行 TMD 所需要的提交!
- 哦,还有保持简单,狗娘养的!
好吧。我看了很恐怖。
当然,顺便说一下taoAPI的SDK,里面有一段居然是:
PHP代码
- public function execute($request, $session = null)
- {
- if($this->checkRequest) {
- try {
- $request->check();
- } catch (Exception $e) {
- $result->code = $e->getCode();
- $result->msg = $e->getMessage();
- return $result;
- }
- }
- }
哥,你能不能先定义一下$result = new StdClass;
搞得我IDE里全是血红一片。。。
PHP | 评论:0
| 阅读:12918
Submitted by gouki on 2011, December 19, 10:40 PM
奇技淫巧?其实不能算是什么特别的东西,但有些小技巧还是可以试试的,比如说第一个,我们一般都会是用setInterval,然后每1秒执行一次,10秒后取消,但setTimeout也可以。只是意义不大而已喽
原文来自:http://www.cnblogs.com/nothingbrother/archive/2011/12/19/2293131.html
应用案例:比如你想一个函数循环执行10次,怎么办?以前通常是先setInterval,然后clearInterval,技巧一就是克服这个问题
JavaScript代码
- (function () {
- var i = 0;
- function job() {
- console.log(i++);
- if (i < 10) {
- setTimeout(job, 1000);
- }
- }
- job();
-
- })();
上面这个job函数就只会乖乖的执行10次.然后自动停止
技巧二之高效的for循环
应用案例:抛弃传统的循环方式
JavaScript代码
- (function () {
- var arr=[];
- for(var i=arr.length;i--;){
- doStuff();
- }
- })();
这个方式为什么高效?
一:少了一个参数l=arr.length;
二:for语句中间那个玩意少进行了一次计算,以前的话是for(i=0;i<l;i++)这样的话中间的语句会先比较i<l 然后比较出来的结果在
跟true 或者false比较,自然多了次计算
技巧三之高效赋值
应用案例:抛弃传统的if判断赋值
JavaScript代码
- var i=1,ret;
- ret=i!==1||true;
- console.log(ret);
以上代码会很神奇的告诉你ret会是true.高效吧不用if(i!==1)了在赋值了
技巧四之强悍的简短的attr
应用案例:setAttribute,getAttribute.这个方法不仅可以设置标准的属性,还可以设置任意属性,兼容好
JavaScript代码
- function attr(elem, name, value) {
- var ret;
- if (value) {
- if (/msie [6-7]\.0/i.test(navigator.userAgent)) {
- ret = elem.getAttributeNode(name);
- if (!ret) {
- ret = document.createAttribute(name);
- elem.setAttributeNode(ret);
- }
- ret.nodeValue = value + "";
- } else {
- elem.setAttribute(name, value);
- }
- return elem;
- } else {
- ret = elem.getAttribute(name);
- fixIe = elem.getAttributeNode(name).nodeValue;
- ret = ret ? ret : fixIe ? fixIe : undefined;
- return ret;
- }
- }
以上方法如何测试呢?
attr(document.getElementById("test"), "classxx", "xx")
alert(attr(document.getElementById("test"),"classxx"));
技巧五之getElementsByClassName.
应用案例 :以前js没什么框架的时候,大家都再模仿这个方法,看看今天我是怎么高效的模仿出它来.这也不愧是js初学者的经典代码
JavaScript代码
- (function () {
- var getElementsByClassName=function(cls,context){
- var root = context || document;
- return document.querySelectorAll ? root.querySelectorAll("." + cls) : root.getElementsByClassName ?
- root.getElementsByClassName(cls) : help("*", cls, context);
- }
- var help=function(tagName,cls,context){
- var root= context || document,
- ret=[],elems,i,
- rcls=new RegExp("^|\\s+"+cls+"\\s+|$");
- elems = root.getElementsByTagName(tagName || "*");
- for(i=elems.length;i--;){
- if(rcls.test(elem[i].className)){
- ret.push(elems[i]);
- }
- }
- return ret;
- }
- })();
以上几个js淫荡技巧还是蛮实用的,前提是你没用使用别人的js框架,用原生创造效率为前提的代码.
----------
上面的代码其实真要说的话也就这样样了,但如果你以前没有接触过原生代码,还是可以折腾的。比如最后一个函数,在JS的高版本中(或者说FF5以上,Safari5以上,)都在支持了querySelector了。这个玩意可是直接支持.class或者#id之类(就象jQuery的选择器)
多学一点东西还是有好处的。
Javascript | 评论:0
| 阅读:15815
Submitted by gouki on 2011, November 19, 10:12 PM
其实这很正常,也不意外,这么久了。。。也该正式版了
不过,jQueryMobile里我想找那个DoubleTap事件也没有好好找到。可能是我没有仔细关注吧?
然后一些clientX移动的事件,也不是特别的爽。。。
OK,去官网看看吧,http://jquerymobile.com
官方说这次正式版的性能提高了很多,在这里有一张图片:http://jquerymobile.com/blog/2011/11/16/announcing-jquery-mobile-1-0/
demo其实也能看,不过要好效果的话,还是建议使用webkit核心的浏览器:Demos & Documentation
Tags: jquerymobile
Javascript | 评论:0
| 阅读:14474