ubuntu下如何切换到root登陆
0最近一直在学习linux,选择ubuntu作为联系的操作系统。然后一直发现自己所创建的用户和root用户不是一个概念,执行好多命令 的时候都提示没有权限。这样,最后终于发现原来是ubuntu是默认关闭root用户的,只有开启了root用户之后才能登陆。。首先在现有用户名终端输 入:sudo passwd root,这样就会要求输入root的新密码。。同时会切换到root目录。。。
转帖如下:
Ubuntu是一套基于Debian的Linux系统,它追求的是“Just Work”,最新的7.10版本发布于2007年10月,不同于其他Linux发行版本,Ubuntu的所有版本都是免费的,包括企业版。
第一次安装Ubuntu,发现比较“奇怪”的一点是,在安装过程中,不像其他发布版本那样,要求设置root的密码,也就无法以root登录了。经过去网上查询才发现:Ubuntu默认是关闭root帐户的,这样做有如下优点:
起初Ubuntu团队希望安装尽可能的简单,不使用root,在安装期间的两个用户交互步骤可以省略。(科林·沃森)
更进一步, 如果在安装中使用root,用户将被要求永远记住他们选择的密码–即使他们很少使用到它。Root密码经常被对Unix安全模型不熟悉的用户忘记。(马特·齐默曼)
它 防止了缺省登录时“我能做任何事情”–在较大的变化发生之前,你将被提示输入口令,这可以使你考虑你这样做的结果。 如果你作为root登录,你可以删除一些“没用的文件夹”并且不会意识到你正处于错误的目录,那时已经太晚了。它是在Unix下长时间使用“su- command-^D”练习的情况下,代替一直呆在root shell–除非你做严重的系统维护(那时你仍然可以使用 “sudo su”)。(吉姆·奇塔姆 和 安德鲁·索巴拉)
Sudo 增加了运行命令的日志记录(在/var/log/auth.log)。如果你陷入困境,你总是可以返回并看见那些运行的命令。(安德鲁·Zbikowski)
开启root帐号的方法:
为了启用root 帐号(也就是设置一个口令)使用:
sudo passwd root
当你使用完毕后屏蔽root帐号使用:
sudo passwd -l root
这个将锁住root帐号。
如何在终端模式下切换到root身份?
sudo -s -H
Password: <在此输入密码>
==================================================================================
Ubuntu使用root登录
Ubuntu系统默认是不允许用户以root身份登录的,虽然有一定的安全性,不过不符合我操控系统的天性
。在网上找到的方法如下:
1、首先设置root密码,利用现有管理员帐户登陆Ubuntu,在终端执行命令:sudo passwd root,接着输入密码和root密码,重复密码。这样就有了可用的root用户。
2、默认情况是不允许用root帐号直接登录图形界面的。这可以通过修改/etc/gdm/gdm.conf文件来允许root直接登录,在该文件中找到 AllowRoot=false 将其改为 AllowRoot=true 切换用户就可以了。
注:有的系统中 gdm.conf 默认是只读属性,修改前可使用sudo chmod 777 /etc/gdm/gdm.conf 修改文件权限。
用 Aptana3 调试Node.js代码
0node.js是基于Google V8的,而Google V8有一个Eclipse的调试插件,这个插件同样也支持node.js。
1、安装Eclipse debugger for V8
这个,用过Eclipse的应该都知道,不过还是简单说下吧:
选择“Install New Software”
点“Add”
Location为: http://chromedevtools.googlecode.com/svn/update/dev/
Name你喜欢,整一个方便你记忆的就好。
点击确定后,在“Work with“选择你刚才添加的站点:
然后选择“Chromium JavaScript Remote Debugger”,然后一直下一步,安装完后会提示重启Eclipse,重启Eclipse后就可以开始调试了。
2、怎样调试Nodejs?
从插件名称中的“Remote”可以预想到这是一个远程调试的工具,大概的流程就是node开一个tcp的调试端口,然后这个调试工具通过这个tcp端口来和node通讯实现调试。
要启用node的调试端口,在执行node脚本的时候需要添加 –-debug 参数:
or
node –debug-brk[=port] NodeApp.js
其中port为开启的调试端口,默认为5858.
–debug和–debug-brk的区别在于,–debug执行脚本的时候会直接运行该脚本,而–debug-brk执行脚本的时候,并不会马上执行,而是等待调试器的连接,然后按调试器的指令来执行。
我们写个简单的代码来用于调试:
然后用 node –debug hello_world.js 来运行:
可以看到输出一行:debugger listening on port 5858
5858为默认端口,你也可以用 –debug=5859 来指定不同的端口
好,现在node的调试模式已经运行起来了,我们去配置Eclipse来连接到node并进行调试。
首先我们要到debug config里面去添加一个新的V8 VM的调试配置:
右键,选择“new”来新建一个配置项:
因为我们刚才node起的调试端口为默认的5858,所以这里我们的端口就是5858,名称我们定为“Node-5858”。
然后点debug开始调试,或者你使用下面的方式开始调试:
调试模式大概会是这样:
(注:这是调试视图,点击右上角的臭虫按钮。如果你的Eclipse上没有这个按钮,请点击上图右上角臭虫左边的添加按钮,找到debug然后添加就可以)
在调试模式连接成功后,你会在你的“Project Explorer”里面看到多了一个“Node-5858”(刚才debug config里面设置的名称)的项目,里面的文件都是调试的文件或者调试的文件require进来的文件。
打开这些文件,你就可以在里面加断点开始调试了。例如上图的第8行加了一个断点,则每次在浏览器访问的时候都会进入这个断点。
其他的调试和你平时用Eclipse调试其他代码是一样的。
Eclipse的调试快捷键是,F5单步进入,F6单步跳过。
最后说一下 –debug-brk 方式启动的调试模式:
可以看到仅仅是输出了一行“debugger listening on port 5858”而已,后面并没有继续输出“Server running at …..”。
这是因为用 启动的调试模式并不会马上执行代码,而是会等待调试器的连接(可以理解为在hello_world.js的第一行加了断点),具体还是各位童鞋自己实践吧。
参考: https://github.com/joyent/node/wiki/Using-Eclipse-as-Node-Applications-Debugger
在Windows平台上安装Node.js及NPM模块管理
0之前9月份的时候我写了一篇关于如何在Windows平台上手工管理Node.js Modules的文章[在Windows上安装Node.js模块]。当时一方面我本身对Node.js了解有限,另外当时Node.js在Windows平台上部署确实很麻烦,所以选择了手工管理Node.js模块。
现在情况已经大有变观,一方面Node.js已经完成了在Windows平台上基于完成端口的网络模型改造,另一方面NPM也可以比较好地工作在Windows平台上。所以现在在Windows平台部署Node.js已经比较容易。下面说说我的操作步骤。
1. 下载Node.js官方Windows版程序:
http://nodejs.org/#download
从0.6.1开始,Node.js在Windows平台上提供了两种安装方式,一是.MSI安装文件,另外还有一个.EXE可执行文件。
我选择了.EXE文件。因为.MSI安装文件除了将node.exe复制到C:\Program File (x86)\目录中及修改系统Path之外,没发现还有其他作用。
我使用的版本为0.6.2: http://nodejs.org/dist/v0.6.2/node.exe
2. 创建D:\nodejs目录,并将node.exe保存在这个目录中。并将”D:\nodejs”加入系统环境变量PATH中,便于在任意位置执行node应用。
3. 下载npm源代码:
https://github.com/isaacs/npm/tags
这里需要注意一下,在写这篇文章时npm最新版本为1.0.106,但是这个最新版本及1.0.105在Windows平台下都有问题。所以我选择了安装1.0.104版本:
https://github.com/isaacs/npm/zipball/v1.0.104
4. 将npm源代码解压到D:\npmjs目录中。
在命令提示符窗口中执行下面的操作,完成npm的安装:
D:\>cd npmjs D:\npmjs>node cli.js install -gf
另外:
node cli.js install npm -gf //可以安装最新版的NPM node cli.js install npm@1.0.105 -gf //可以安装指定版本的NPM
上面两种方法都是通过网络从代码库中下载并安装,但是代码库一般只保留最近的两个版本。
5. NPM安装完成后,将”D:\nodejs\node_modules”加入系统环境变量NODE_PATH中。
6. 安装express:
npm install express -g //安装最新版express npm install express@2.5.0 //安装指定版本express npm remove express -g //删除express
更多npm使用方法,请参考npm官方网站:http://npmjs.org
至此部署完成。
D:\>node -v v0.6.2 D:\>npm -v 1.0.104 D:\>express -v 2.5.1 D:\>express hello //创建exrpess项目 D:\>cd hello D:\hello>node app.js //启动
在浏览器中打开:http://localhost:3000,查看结果。
补充:npm源代码包中不包含依赖模块。为了方便大家安装,这里提供下载:
http://files.cnblogs.com/seanlv/node_modules.zip
下载后,覆盖npm目录中的node_modules文件夹。
ucenter通信失败-分析及解决
0尝试使用ucenter作 为用户的控制中心,测试范例可以正常使用,不过ucenter管理中心-应用栏目里面,应用的通信状态总是连接中,而且当我添加了一个应用后,管理中心开 始出现无法访问的访问的情况,错误代码是504。花费了几个晚上的时间后,终于一步步解决了这些问题,包括一直提示连接中以及通信失败的的各种情况,下面 一步步道来:
既然是504错误,先从服务器及fastcig查起,后来修改了nginx的几个缓存参数。
1 2 3 4 5 6 7 8 |
fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 128k; fastcgi_buffers 2 256k;#8 128 fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; |
经过测试确实有效,缓解了504错误出现的情况,不过管理中心登录异常缓慢,这样问题应该出现在php代 码上面,有地方应该做了死循环一类的请求导致执行时间超时,这个从nginx的errror log里面也可以看出来,看样子要分析代码了。不过这件事情给了我一个教训:使用nginx的时候上面这几个fastcig的参数是很有必要设置的,这样 可以大大减少502、504一类错误的产生,过几天再研究这几个参数的详细作用。
得出是源代码导致的问题,就开始分析源代码,首先看看“正在连接”及“通信失败”是怎么生成的,在页面上右击选择查看源代码,会看到如下代码:
1 2 3 4 5 6 7 8 9 10 |
function testlink() {
if(apps[run]) {
$('status_' + apps[run]).innerHTML = '正在连接...';
$('link_' + apps[run]).src = $('link_' + apps[run]).getAttribute('testlink') + '&sid=41b3%2BrDVNPa0jwkBODC3A3Elw5t02aiL56vnOUuGQjolMRKdS6WC7B0gggT0%2B6%2FYpqF3SiyM1H9ztA';
}
run++;
}
|
1 2 3 4 |
<a href="admin.php?m=app&a=detail&appid=2"><strong>手机软件下载</strong></a> <a href="/mob" target="_blank">/mob</a> <script id="link_2"><!--mce:0--></script><script type="text/javascript"><!--mce:1--></script> <a href="admin.php?m=app&a=detail&appid=2">编辑</a> |
可以很明显的看出,上面那段代码生成了默认的“正在连接…”的代码。下面的html代码中包含的js脚本去请求了服务器段的php代码,用于判断是 否通信成功。所以我们可以直接浏览admin.php?m=app&a=ping&inajax=1&url=%2Fmob& amp;ip=&appid=2&random=6880,看看他的返回值,如果是像我这样一直显示“正在连接”的这个url应该是访问 超时,“通信失败”的就直接显示通信失败。找到的源码出处,进一步查看php源代码。
根据m=app&a=ping,可以得知执行的函数是ucenter里面controladmin目录下的app.php文件里面的 onping函数,函数很简单,就是根据设置的应用信息去请求相应应用里面的api文件夹下的文件,然后根据返回结果判断是否连接成功。我们可以在函数结 束的地方加上
1 2 |
die("url = $url
status = $status");
|
这样就可以看到应用的返回值了,也可以直接把url放到浏览器中查看返回值。如果$status返回的是1那么应该就是正确的,其他的都是错误的。这里分成两种情况写:
1.如果看到了1的返回值,但是还是提示通信失败的话
最大的可能性就是你应用的api文件夹下通信文件(文件名默认为uc.php)的编码问题,在Windows平台把代码转为utf-8的时候,会添加 bom头,这个也是引起很多session_start错误的原因,解决办法就不多说了,我自己一般都是使用16进制编辑工具把开头的三个字节去掉,或者 直接用dw新建一个网页,把内容拷贝进去保存,这样都可以去掉bom头。
2.如果没有看到返回值
没有返回值的情况就比较多了,应该检查应用api目录下的接口文件(如uc.php)是否有问题。看看是否是include了错误的文件,这个文件是否本身就运行错误等等,还有就是接口文件的uc_note类里面的test函数返回值是否是1。
如果保证了应用接收管理中心通知的api接口没有问题的话,就还是检查onping函数了。比如我的的情况,经过多次检查出 在$_ENV['app']->test_api($url, $ip);这个代码上了,想继续跟踪test_api函数,不过就太麻烦了。后来无意中看到“应用的主 URL”(该应用与 UCenter 通信的接口 URL,结尾请不要加“/” ,应用的通知只发送给主 URL),有范例设置的是本机的目录,而我设置的却是一个标准的url路径。应该就是在通过test_api读取远程api接口的时候导致了一个致命的错 误直到504错误,这样管理中心也就只显示“正在连接”了。
ucenter确实很不错的,提供了很完整的一整套sso及用户管理的解决方案,而且可以跟原有的系统对接。过几天再写一下个人对ucenter的理解,相信对从来没有使用过的人还是会有点帮助的。
纯静态文件环境下的Nginx优化思路
0Nginx以其消耗资源少,承受并发量大,配置文件简洁等特点,深受广大sa们的喜欢,但是网上传播的nginx 配置并没有对做过多的优化。那么接下来,我就从某大型媒体网站的实际运维nginx优化角度,来给大家讲解一下nginx主要优化的那些方面。
一、编译方面优化
1、首先就要从configure 参数分析,根据网上最常用的configure 参数来说,大都是
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module
应该说这个参数是通用的,适用于各种环境的需要,比如php环境、纯静态文件环境、代理环境等等。编译nginx程序文件大约有2M大小,跟全面优化的500多K,相差了不少。
下面我们修改一下参数,减少不必要的功能。
纯静态文件环境参数
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --without-http_fastcgi_module --without-http_proxy_module --without-http_upstream_ip_hash_module --without-http_autoindex_module --without-http_ssi_module --without-http_proxy_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --without-http_uwsgi_module --without-http_scgi_module --without-http_memcached_module
去掉了在mail模块fastcgi模块 代理模块 ip_hash模块等,在纯静态文件用不到的模块,现在看看nginx程序文件是不是少了一些。
Php环境的话,只需要去掉–with-http_fastcgi_module 重新编译即可。
代理环境的话,只需要去掉–with_proxy_module重新编译即可。
2、去掉nginx 默认的debug跟踪设置。这一步需要修改nginx 源码。
cd nginx-1.0.x vim auto/cc/gcc
第175行
CFLAGS="$CFLAGS -g"
前面加#注释掉改行。
这样的话,编译的参数,就会减少到500多K的标准,这样在大并发量的条件下,性能提升明显。
二、利用google-perftools来优化高并发条件下的nginx
在32位系统下,可以直接安装google-peftools,64位条件下,需要先安装libunwind库。然后再nginx configure 参数增加–with-google_perftools_module 重新编译安装nginx 。
这里以64位环境为准
1)安装libunwind库
wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99.tar.gz tar zxvf libunwind-0.99.tar.gz cd libunwind-0.99/ CFLAGS=-fPIC ./configure –prefix=/usr make CFLAGS=-fPIC make CFLAGS=-fPIC install
2)安装google-perftools
wget http://google-perftools.googlecode.com/files/google-perftools-1.7.tar.gz tar xzvf google-perftools-1.7.tar.gz cd google-perftools-1.7
然后开始配置:
./configure --prefix=/usr --enable-frame-pointers (32位可以不添加--enable-frame-pointers) make --j4 && make install
nginx configure 参数加上–with-google-perftools 重新编译nginx
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --without-http_fastcgi_module --without-http_proxy_module --without-http_upstream_ip_hash_module --without-http_autoindex_module --without-http_ssi_module --without-http_proxy_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --without-http_uwsgi_module --without-http_scgi_module --without-http_memcached_module –with-google_perftools_module make && make install
3、在nginx.conf 的pid部分下,增加
google_perftools_profiles /data0/google_cache;
重启
service nginx restart
即可生效。
三、nginx 工作进程优化
通常的做法是在nginx.conf 的
worker_processes 8;
下面增加
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
但是在纯静态文件环境下,我们可以增加nginx 工作进程,来提升nginx的工作效率。
工作进程 为24个,worker_cpu_affinity 可以这样来调整
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
重启nginx后生效,可以充分利用nginx的对多核心cpu的良好的特性,大幅提升网站的访问速度。
MongoDB安装并随windows开机自启
0MongoDB服务器下载
MongoDB的官方下载站是http://www.mongodb.org/downloads,可以去上面下载最新的程序下来。在下载页面可以看到,对操作系统支持很全面,OS X、Linux、Windows、Solaris都支持,而且都有各自的32位和64位版本。目前的稳定版本是1.8.1版本。
1、Windows版本安装
(1)、下载MongoDB
url地址: http://downloads.mongodb.org/win32/mongodb-win32-i386-1.8.1.zip
(2)、设置MongoDB目录
解压到D盘下面的MongDB文件夹,路径为d:\MongDB
3)设置数据文件路径
在D:\MongoDB里面新建logs和data文件夹
在D:\MongoDB\logs里面新建mongodb.log文件
2,配置Mongo服务端:
打开cmd窗口:输入下面命令:
> d:
> cd D:\MongoDB\bin
> mongod –dbpath D:\MongoDB\data –logpath=D:\MongoDB\logs\mongodb.log –install

3,客户端连接验证
新打开一个CMD输入:d:\mongodb\bin\mongo,如果出现下面提示,那么您就可以开始MongoDB之旅了:
D:\mongodb\bin>d:\mongodb\bin\mongo
MongoDB shell version: 1.8.1
connecting to: test
>
4,查看日志
D:\MongoDB\logs下面的mongodb.log
让Nginx作为Windows服务开机自启动
0参考了其官网文档:了解到它的基本启停命令如下:(假设,解压到了 “F:\nginx-0.9.4″ 目录下)
# 启动:
F:\nginx-0.9.4> nginx.exe
# 查看状态:
F:\nginx-0.9.4> tasklist /fi “imagename eq nginx.exe”
# 立即停止:
F:\nginx-0.9.4> nginx.exe -s stop
# 结束所有会话后再停止(平滑退出):
F:\nginx-0.9.4> nginx.exe -s quit
# 重新加载配置文件
# (当修改配置文件后,他会先启动一个新的worker,在把原来的worker停止,也即对用户透明)
F:\nginx-0.9.4> nginx.exe -s reload
# 重新打开日志文件
F:\nginx-0.9.4> nginx.exe -s reopen
只可惜,nginx.exe自己不管注册windows 服务器,需要自己手动命令行下启动/停止。
用Google百度了下,发现一个不错的文章——《Nginx Windows Service》,同时在文章里也发现了
一个不错的程序:”Windows Service Wrapper” —— 用来将你的程序封装成Windows的服务。
你可以在这里下载。
使用方法:
1. 下载最新版的 Windows Service Wrapper 程序,比如我下载的名称是 “winsw-1.9-bin.exe”,
然后,把它命名成你想要的名字(比如: “myapp.exe“,当然,你也可以不改名)
2. 将重命名后的 myapp.exe 复制到 nginx 的安装目录(我这里是 “F:\nginx-0.9.4″)
3. 在同一个目录下创建一个Windows Service Wrapper的XML配置文件,名称必须与第一步重命名时使用的名称一致(比如我这里是 “myapp.xml“, 如果,你没有重命名,则应该是 “winsw-1.9-bin.xml”)
文件内容如下:
- <?xml version=”1.0″ encoding=”UTF-8″ ?>
- <service>
- <id>nginx</id>
- <name>nginx</name>
- <description>nginx</description>
- <executable>F:\nginx-0.9.4\nginx.exe</executable>
- <logpath>F:\nginx-0.9.4\</logpath>
- <logmode>roll</logmode>
- <depend></depend>
- <startargument>-p F:\nginx-0.9.4</startargument>
- <stopargument>-p F:\nginx-0.9.4 -s stop</stopargument>
- </service>
4. 命令行下执行以下命令,以便将其安装成Windows服务。
F:\nginx-0.9.4> myapp.exe install
OK, 至此,完工,确认一下:我的电脑 右键 -> 管理 -> 服务 -> 是否有了个 nginx 呢?启动起来,在浏览器中 访问 http://localhost 确认一下,再 停止服务,再访问一下 http://localhost 确认一下。
补充:
Windows Servcie Wrapper的命令格式如下:
# 安装服务
CMD:\> myapp.exe install
# 卸载服务
CMD:\> myapp.exe uninstall
# 启动服务
CMD:\> myapp.exe start
# 停止服务
CMD:\> myapp.exe stop
WINDOWS INSTALLER无法启动解决方法
0第一步:使用记事本编写installer.reg文件,内容如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSIServer]
“ImagePath”=-
“ImagePath”=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,\
00,73,00,69,00,65,00,78,00,65,00,63,00,2e,00,65,00,78,00,65,00,20,00,2f,00,\
56,00,00,00
然后将文件保存为”.reg“格式,双击该文件,将文件内容导入注册表。
==================================================================
呵呵,我也遇到过这问题,是在装MSN时.有高人指点,已经搞定了,你也试试吧!
开始-运行 打开里面填写msiexec /unreg 确定.
然后开始-运行 打开里面填写msiexec /regserver 确定。
一、微软Windows Installer 组件介绍:
微软Windows Installer作为 Win2K/WinXP的组件之一,是专门用来管理和配置软件服务的工具。在Win95、Win98、WinMe与WinNT4,0下,作为额外的产品提 供,允许用户有效地安装与配置软件产品与应用程序。新的Installer提供给软件产品新的特性,例如使用命令行安装产品、增加了用户的可定制性。
Windows Installer 软件安装技术。该技术包括适用于 32 位 Windows 操作系统的 Windows Installer 服务器,以及一个用于存储有关配置和安装信息的新软件包文件格式。
Windows Installer 不仅仅是一个安装程序,它还是一个可扩展的软件管理系统。Windows Installer 管理软件的安装,管理软件组件的添加和删除,监视文件复原,并通过使用回滚来维护基本的灾难恢复。
此外,Windows Installer 还支持从多个源安装和运行软件,并且可以由要安装自定义程序的开发人员定制。
二、Windows Installer 的功能包括:
” 在安装失败时将计算机还原为原始状态:Windows Installer 跟踪在程序安装过程中对系统进行的所有更改。如果安装失败,Installer 可以将系统恢复到其初始状态。这称为“回滚”。
” 帮助防止特定形式的程序之间产生冲突:正在安装或卸载的程序可能会导致计算机上已安装的另一个程序出现问题,甚至导致计算机停止响应(挂起)。 Installer 可以强制实施一些安装规则,以帮助防止当安装操作更新由现有程序共享的动态链接库 (DLL) 文件时,或当卸载操作删除由另一个程序共享的 DLL 文件时出现冲突。
” 诊断并修复损坏的程序:程序可以要求 Installer 确定已安装的程序是否缺少文件,或者文件是否已损坏。然后,它可以要求该服务根据需要再次只复制已发现丢失或损坏的文件来修复该程序。
” 可靠地卸载现有程序:Installer 可以可靠地卸载以前安装的任何程序,并删除所有相关联的注册表条目和程序文件,但其他已安装的软件所共享的文件及注册表条目除外。
” 支持按需安装程序功能:可以指示 Installer 首先安装程序的最小子集。之后,在您首次使用需要附加组件的功能时,会自动安装附加组件。
” 支持无人参与的程序安装:Installer 支持根据管理员的指令使用脚本来安装程序。
Windows Installer 技术分为以下两部分,它们结合在一起工作:客户端安装服务 (Msiexec.exe) 和 Microsoft 软件安装 (MSI) 软件包文件。Windows Installer 使用软件包文件中包含的信息安装程序。
Msiexec.exe 程序是 Windows Installer 的一个组件。当安装程序调用 Msiexec.exe 时,它使用 Msi.dll 读取软件包 (.msi) 文件,应用任何转换 (.mst) 文件,并合并安装程序所提供的命令行选项。Installer 执行所有与安装有关的任务,包括将文件复制到硬盘、修改注册表、在桌面上创建快捷方式,以及在必要时显示对话框以提示用户输入安装首选项。
在计算机上安装 Windows Installer 后,它将更改注册的 .msi 文件的文件类型,以便当您双击 .msi 文件时,将运行 Msiexec.exe。
每个 MSI 软件包文件都包含一个关系类型的数据库,用于存储在各种安装方案中安装(或卸载)该程序所需的指令和数据。
三、Windows Installer出错的解决方案
Windows Installer(windows安装服务)是一种通用的软件发布方式,现在许多软件都使用windows Installer作为自己的安装程序,有时因为各种原因以及windows Installer本身的缺陷,会导致windows Installer出错。
症状一:删除某个程序后,在运行某些软件时,老会弹出一个“windows正在配置Windows Installer,请稍候”的窗口。
解决办法:
1、重新安装Windows Installer,office XP安装盘的根目录有两个名为instmsi.exe和InstMsiW.exe的文件,instmsi.exe用于win9X/Me,InstMsiW.exe用于Win2000/XP;
2、打开组策略→计算机配置→管理模板→Windows组件→Windows Installer→禁用Windows Installer,只是这样一来,很多软件就有能安装了,此法用于Win2000/XP。
3、请看本文最后的“终级解决方案”
症状二:Win2000/XP安装软件时提示“无法访问windows安装程序,服务中windows Installer状态为停止,不能启动”
解决办法:
1、命令提示符下输入:misiexec /regserver
2、在“管理工具”→“服务”中启动windows Installer
症状三:Win2000/XP安装软件时提示“不能访问Windows Installer服务……”
解决办法:
1、检查当前用户有无管理员权限;
2、结束进程Ikernel,exe后再安装;
3、删除系统安装目录Program FilesCommon FilesInstallShieldEngine下的所有文件再安装。
4、首先,运行“msiexec /unregserver”,停止Windows Installer服务;
接着,安装InstMsiW.exe(office XP安装盘的根目录下有,也可以从网上下载,地址为:http://download.microsoft.com/download /WinfowsInstaller/Install/2.0/NT45/EN-US/InstMsiW.exe),用Winrar解压至设定的目录;进 入目录,右键点击msi.inf选“安装”,右键点击mspatcha.inf,选安装;
最后运行“msiexec /regserver”启用服务。
症状四:安装软件时提示“系统管理员设置了系统策略,禁止进行此项安装”
解决办法:
1、尝试用症状三的解决方法;
2、打开组策略→用户配置→管理模板→Windows组件→Windows安装服务→将“禁止从媒体安装”设为“禁用”,将“永远以高特权进行安装”设置为“启用”
四、以上问题的终级解决方案:
下载安装微软提供的Windows Installer CleanUp Utility 1.0,它的主要功能是清除程序的Windows Installer配置信息。启动该工具,它会列出目前系统中所有Windows Installer使用安装的软件,选中出问题的软件,然后点“Remove”按钮即可。
Windows Installer CleanUp Utility 1.0下载地址:http://www.onlinedown.net/soft/27518.htm
php分页函数[未完善]
0<?php
/**
* 1.创建表的语句
* CREATE TABLE `t_admin` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uname` varchar(100) NOT NULL,
`upass` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
*
* 2.继续执行下面的语句插入测试数据
* INSERT INTO `t_admin`(id,uname,upass) VALUES (NULL,’www.w3hacker.com’,md5(uname));
* INSERT INTO `t_admin`(id,uname,upass) VALUES (NULL,’www.baidu.com’,md5(uname));
* INSERT INTO `t_admin`(id,uname,upass) VALUES (NULL,’www.google.com’,md5(uname));
* INSERT INTO `t_admin`(uname,upass) SELECT uname,upass FROM `t_admin`;
*
* http://www.test.com/t.php?page=1&pagesize=5
* $.getJSON(‘http://www.test.com/t.php?page=1&ajax=1&pagesize=5′,function(data){});
*/
header(‘Content-type:text/html;charset=utf-8′);
$page = intval(@$_GET['page']);
$paging = new stdClass();
$paging->pageSize = @$_GET['pagesize']?intval(@$_GET['pagesize']):10;
$paging->pageLen = 5;
$page = $page > 0?$page:1;
@mysql_connect(‘localhost’,'root’,'root’) or die();
@mysql_select_db(‘test’);
@mysql_set_charset(‘utf-8′);
$sql = “SELECT COUNT(id) AS total FROM `t_admin`”;
if($result = @mysql_query($sql)){
$row = @mysql_fetch_assoc($result);
$paging->total = $row['total'];
$paging->pages = ceil($paging->total/$paging->pageSize);
$paging->page = $page <= $paging->pages?$page:$paging->pages;
$paging->offset = ($paging->page-1)*$paging->pageSize;
$paging->limit = $paging->pageSize;
$paging->start = $paging->offset + 1;
$paging->end = $paging->page*$paging->pageSize;
$paging->pre = $paging->page > 1?$paging->page-1:null;
$paging->next = $paging->page < $paging->pages?$paging->page+1:null;
$sql = “SELECT id,uname FROM `t_admin` LIMIT $paging->offset,$paging->limit”;
$contents = ”;
if($result = mysql_query($sql)){
$contents .= ‘<div id=”content” style=”border:1px dotted black;”>’;
$resultset = array();
while(false!==($row = mysql_fetch_assoc($result))){
array_push($resultset,$row);
}
$contents .= ‘</div>’;
}
$pageCode = “”;
$pageCode .= “[{$paging->page}/{$paging->pages}]“;
$pageCode .= ‘<a href=”?page=1″>首页</a>’;
if($paging->pre){
$pageCode .= “<a href=\”?page={$paging->pre}\”>上一页</a>”;
}else{
$pageCode .= “上一页”;
}
$min = $page – 3>0?$page – 3:1;
$max = $page + 3<$paging->pages?$page + 3:$paging->pages;
if($paging->pages > $paging->pageLen){
for ($i=$min; $i <= $max; $i++) {
if($paging->page != $i)
$pageCode .= “<a href=\”?page={$i}\” style=\”padding:5px;\”>$i</a>”;
else
$pageCode .= $i;
}
}
if($paging->next){
$pageCode .= “<a href=\”?page={$paging->next}\”>下一页</a>”;
}else{
$pageCode .= “下一页”;
}
$pageCode .= “<a href=\”?page={$paging->pages}\”>尾页</a>”;
if(@$_GET['ajax']){
echo ‘<script type=”text/javascript”>’;
echo ‘var records = ‘.json_encode($resultset).”\r\n”;
echo ‘console.dir(records);’;
echo ‘</script>’;
}else{
echo $_SERVER['QUERY_STRING'];
foreach ($resultset as $record) {
echo $record['id'].’ => ‘.$record['uname'].’<br />’;
}
echo $pageCode;
}
}
@mysql_close();
?>“
用php模拟登陆discuz并发帖
1万维网黑客联盟
<?php
header(‘Content-type:text/html;charset=utf-8′);
function login($url = ”, $request = array()){
$cookie_jar = tempnam(‘./’, ‘w3_’);
//检测curl模块可用性
if(!function_exists(‘curl_init’)){
exit(‘curl模块未安装…请联系系统管理员…’);
}
//初始化
$ch = curl_init();
//设置url
curl_setopt($ch, CURLOPT_URL, $url);
//设置post方式提交
curl_setopt($ch, CURLOPT_POST, 1);
//设置post提交的内容
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
//把返回的cookie信息保存到$cookie_jar文件中
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);
//设置返回的数据是否自动显示
curl_setopt($ch, CURLOPT_RETURNTRANSFER, FALSE);
//是否显示头信息
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//是否显示页面内容
curl_setopt($ch, CURLOPT_NOBODY, FALSE);
//执行
curl_exec($ch);
curl_close($ch);
return $cookie_jar;
}
/**
* 获取列表 采集用
*/
function get_contents_by_cookie($url, $cookie_jar){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);
$contents = curl_exec($ch);
return $contents;
}
/**
* 模拟提交数据
*/
function post($url, $data, $cookie_jar){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, 1);
//设置post提交的内容
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);
$contents = curl_exec($ch);
unlink($cookie_jar);
return $contents;
}
//登陆成功
$cookie_jar = login(‘http://utf8.discuz.com/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1′,array(
‘fastloginfield’=>’username’,
‘username’=>’admin’,
‘password’=>’gkf986512′,
‘quickforward’=>’yes’,
‘handlekey’=>’ls’
));
/**
* 获取发布文章页面
*/
$subject = get_contents_by_cookie(‘http://utf8.discuz.com/forum.php?mod=post&action=newthread&fid=37′, $cookie_jar);
//各种hash值
$pattern1 = “/<input type=\”hidden\” name=\”formhash\” value=\”(.*?)\” \/>/”;
$pattern2 = “/<input type=\”hidden\” name=\”hash\” value=\”(.*?)\”>/”;
if(preg_match($pattern1, $subject, $arr)){
$formhash = $arr[1];
}
if(preg_match($pattern2, $subject, $arr)){
$hash = $arr[1];
}
post(‘http://utf8.discuz.com/forum.php?mod=post&action=newthread&fid=37&extra=&topicsubmit=yes’,array(
‘formhash’=>$formhash,
‘posttime’=>’1320142399′,
‘wysiwyg’=>’1′,
‘subject’=>’垃圾信息’,
‘message’=>’黑客制造[img]图片url[/img]‘,
‘replycredit_extcredits’=>’0′,
‘replycredit_times’=>’1′,
‘replycredit_membertimes’=>’1′,
‘replycredit_random’=>’100′,
‘replycredit_membertimes’=>’1′,
‘usesig’=>’1′,
‘allownoticeauthor’=>’1′
), $cookie_jar);
/*
echo post(‘http://utf8.discuz.com/misc.php?mod=swfupload&operation=upload&simple=1&type=image’,array(
‘uid’=>’1′,
‘hash’=>$hash,
‘Filedata’=>’@D:/wamp/apps/www.test.com/bb.jpg’
),$cookie_jar);
*
*/
?>












近期评论