分类为‘小砸碎’的日志

02

cssh 是一个不错的多服务器登录工具, 采用平铺窗口的方式, 相比konsole的多tab, 更来得直观。 我也把它融合到自己的myssh中。

cssh在打开多窗口后, 会有个重排窗口使之不重叠的功能, 之前在gnome下用很正常, 但现在换到KDE, 却发现重排后依然没变化,乱且重叠了。搜了下,还真没找到啥解决方法, 想想cssh是perl写的, 就硬着头皮看看, 希望能解决这个小问题

稍微看了下函数, 发现有个与窗口重排有关的send_resizemove, 从函数名应该可以猜到它的作用。 整个cssh中, 只有一处地方调用了这函数. 大概在1367行。

        logmsg( 2, "Moving $server window" );
        send_resizemove(
            $servers{$server}{wid},
            $current_x, $current_y,
            $config{internal_terminal_width},    #该参数指定了重排时窗口的新宽度
            $config{internal_terminal_height}    #该参数指定了重排时窗口的新高度
        );

我修改了代码中最后两个参数, 并打开logmsg的调试信息, 希望能找到无法重排及重新调整窗口大小的问题。 写死了新的窗口大小, 但出来的结果却是只有最后一个窗口会改变大小, 其他窗口都没变化, 这倒很有意思, 不是send_resizemove无法起作用, 而是无法在全部窗口起作用。

Tiling top left going bot right
x:5 y:5, r:0 c:0
Moving 15.238.122.15  window
Moving window 65011726 to x:5 y:5 (size x:488 y:242)
x:498 y:5, r:0 c:1
Moving 15.238.122.16  window
Moving window 88080398 to x:498 y:5 (size x:488 y:242)
x:991 y:5, r:0 c:2
Moving 15.238.122.17  window
Moving window 75497486 to x:991 y:5 (size x:488 y:242)
x:1484 y:5, r:0 c:3
Moving 15.238.122.18  window
Moving window 62914574 to x:1484 y:5 (size x:488 y:242)
x:1977 y:5, r:0 c:4
Moving 115.238.122.19  window
Moving window 83886094 to x:1977 y:5 (size x:488 y:242)
x:2470 y:5, r:0 c:5
Moving 15.238.122.20  window
Moving window 92274702 to x:2470 y:5 (size x:488 y:242)
x:5 y:252, r:1 c:0
Moving 15.238.122.22  window
Moving window 77594638 to x:5 y:252 (size x:488 y:242)
x:498 y:252, r:1 c:1
Moving 15.238.122.23  window
Moving window 67108878 to x:498 y:252 (size x:488 y:242)
x:991 y:252, r:1 c:2
Moving 15.238.122.24  window
Moving window 69206030 to x:991 y:252 (size x:488 y:242)
x:1484 y:252, r:1 c:3
Moving 15.238.122.25  window
Moving window 73400334 to x:1484 y:252 (size x:488 y:242)
x:1977 y:252, r:1 c:4
Moving 15.238.122.26  window
Moving window 71303182 to x:1977 y:252 (size x:488 y:242)
x:2470 y:252, r:1 c:5
Moving 15.238.122.27  window
Moving window 81788942 to x:2470 y:252 (size x:488 y:242)
x:5 y:499, r:2 c:0
Moving 15.238.122.29  window
Moving window 79691790 to x:5 y:499 (size x:488 y:242)
x:498 y:499, r:2 c:1
Moving 15.238.122.20  window
Moving window 94371854 to x:498 y:499 (size x:488 y:242)
x:991 y:499, r:2 c:2
Moving 15.238.122.21  window
Moving window 90177550 to x:991 y:499 (size x:488 y:242)
x:1484 y:499, r:2 c:3
Moving 15.238.122.22  window
Moving window 96469006 to x:1484 y:499 (size x:488 y:242)
x:1977 y:499, r:2 c:4
Moving 15.238.122.23  window
Moving window 85983246 to x:1977 y:499 (size x:488 y:242)
x:2470 y:499, r:2 c:5
Moving 15.238.122.24  window
Moving window 111149070 to x:2470 y:499 (size x:488 y:242)
Setting focus on 15.238.122.24
Setting focus on 15.238.122.23
Setting focus on 15.238.122.22
Setting focus on 15.238.122.21
Setting focus on 15.238.122.20
Setting focus on 15.238.122.29
Setting focus on 15.238.122.27
Setting focus on 15.238.122.26
Setting focus on 15.238.122.15
Setting focus on 15.238.122.24
Setting focus on 15.238.122.23
Setting focus on 15.238.122.22
Setting focus on 15.238.122.20
Setting focus on 15.238.122.19
Setting focus on 15.238.122.18
Setting focus on 15.238.122.17
Setting focus on 15.238.122.16
Setting focus on 15.238.122.15
Sending console to front

这是cssh的调试信息中与窗口重排相关的部分, 最后的Setting focus 提示了我, 当前是重排所有窗口后, 再把焦点逐个定位到每个窗口(相当于鼠标点中的窗口状态), 是否在KDE下没有做这一步就无法调整大小? 根据Setting focus, 我找到了cssh中 相关的代码

    # Now remap in right order to get overlaps correct
    if ( $config{window_tiling_direction} =~ /right/i ) {
        foreach my $server ( reverse(@hosts) ) {
            logmsg( 2, "Setting focus on $server" );
            $xdisplay->req( 'MapWindow', $servers{$server}{wid} );

            # flush every time and wait a moment (The WMs are so slow...)
            $xdisplay->flush();
            select( undef, undef, undef, 0.1 );    # sleep for a mo
        }
    }
    else {
        foreach my $server (@hosts) {
            logmsg( 2, "Setting focus on $server" );
            $xdisplay->req( 'MapWindow', $servers{$server}{wid} );

            # flush every time and wait a moment (The WMs are so slow...)
            $xdisplay->flush();
            select( undef, undef, undef, 0.1 );    # sleep for a mo
        }
    }

不难看出, ‘$xdisplay->req( ‘MapWindow’, $servers{$server}{wid} );’ 这一句就是我要的, $servers{$server}{wid} 就是窗口的ID, 依葫芦画瓢, 我加了这么一句到send_resizemove的函数调用之前

       logmsg( 2, "Moving $server window" );
       $xdisplay->req( 'MapWindow', $servers{$server}{wid} );
        send_resizemove(
            $servers{$server}{wid},
            $current_x, $current_y,
            $config{internal_terminal_width},    #该参数指定了重排时窗口的新宽度
            $config{internal_terminal_height}    #该参数指定了重排时窗口的新高度
        );

很幸运的, 确实如我所想, 终于能在KDE下正确重排窗口了!!

, ,

25

帮一师弟解决一个无法通过公钥登录ssh服务器问题, 顺便总结下

现象: test帐号使用key无法登录某ssh服务器, 而同机器下的test2帐号却可以登录, 两个帐号都可以通过密码登录

在排查了所有配置错误的可能后, 初步怀疑test帐号的权限设置出问题

test@client:~$ ls -l ~/.ssh/
-rw------- 1 test test   1675 2010-03-25 15:15 id_rsa
test@server:~$ ls -l ~/.ssh/
-rw-r--r-- 1 test test    396 2010-03-25 15:15 authorized_keys

查看了客户端及服务器端的.ssh目录下的公钥与私钥权限, 可以看出, 并没有问题
私钥必须是600权限, 而公钥至少是644或者更严格的权限, 这都符合, 但依然无法登录

test@server:~$ ls -la ~ | grep -w .ssh
drwxr-xr-x  2 test  test  4.0K 12-23 16:59 .ssh

查看了服务器端的.ssh目录权限, 是755, 也是没问题的, ssh服务器要求在使用key登录时.ssh目录的权限必须是其他用户不可写。
一开始实在想不明为啥test2帐号使用key可以登录,test帐号使用key无法登录, ssh_config和sshd_config在检查了多遍后确实没有问题, 最后在服务器端对比两个帐号的不同时, 发现了可疑的地方

$ls -l /home/
drwxrwxrwx   3 test test 4096 2009-12-31 17:31 test
drwxr-xr-x   6 test2 test2 4096 2010-03-23 15:59 test2

两个帐号的home目录权限不同, test帐号是777, test2帐号是755, 会不会是这里不同导致的? 在服务器端把test目录修改成777后, 解决问题

为啥home目录的权限也会影响ssh的key登录?

ssh服务器的key方式登录对权限要求严格。对于客户端: 私钥必须为600权限或者更严格权限(400), 一旦其他用户可读, 私钥就不起作用(如640), 表现为系统认为不存在私钥
对于服务器端: 要求必须公钥其他用户不可写, 一旦其他用户可写(如660), 就无法用key登录, 表现为:Permission denied (publickey).
同时要求.ssh目录其他用户不可写,一旦其他用户可写(如770), 就无法使用key登录, 表现为:Permission denied (publickey).

但为什么home目录的可写也影响到ssh使用key登录?

我们知道linux下目录也是文件, 目录其他用户可写,代表其他用户可以删除目录里的所有文件或子目录,重命名目录下的所有文件或子目录.
home目录的可写,表示其他用户对.ssh子目录也有改写的权限(删除或重命令),也就导致ssh判断.ssh为其他用户可写, 拒绝使用key登录

, ,

06

终于弄好了自己的个人空间了,有了wordpress,真是方便多了,之前还想自己写一套简单的blog,但想想还是算了,还是留点时间多折腾点其他事情吧。

出于方便移植的考虑,我抛弃了wordpress的默认数据库mysql,改用了sqlite,需要安装pdo-for-wordpress, 倒也简单,php5默认就有pdo模块,需要另外装的就是php5-sqlite吧。

折腾好了后,再捣鼓捣鼓主题和页面设置,我的blog就人模人样拉。不过总觉得慢,200ms的延时,但访问时apache进程总是有几秒钟处于D状态,我的vps倒也没什么负载,我怀疑是真实主机的io太高导致的,没办法,只能自己尽量提高自己blog的速度了。

搜了下,有个国人写的加速插件cos-html-cache,原理就是把生成一份静态html来提高速度吧,看起来不错,我就装上了,确实速度有些许提高,还是有点欣慰的。

以后就得多写写心得。

附:整个过程还是遇到不少小问题的
1.Warning: implode() [function.implode]: Invalid arguments passed in /wp-includes/post.php
发生在我定义新页面时,搜了下,还不少人遇到,也有别人提供的解决方法
编辑/wp-includes/post.php

把以下语句

$check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type IN ( '" . implode("', '", $wpdb->escape($hierarchical_post_types)) . "' ) AND ID != %d AND post_parent = %d LIMIT 1";

改为

$hierarchical_post_types_string = implode("', '", $hierarchical_post_types);
$hierarchical_post_types_string = addslashes($hierarchical_post_types_string);
$check_sql = "SELECT post_name FROM $wpdb->posts WHERE post_name = %s AND post_type IN ( '" . $hierarchical_post_types_string . "' ) AND ID != %d AND post_parent = %d LIMIT 1";

出自:http://wordpress-hacks.com/warning-implode-function-implode-invalid-arguments-passed-in-wp-includespost-php-on-line-1762.php

2..htaccess: RewriteEngine not allowed here

开启了伪静态urls后,访问时就出现500错误,看了下error-log,提示.htaccess: RewriteEngine not allowed here
先确定了Rewrite模块在apache加载了,后来还是搜到了答案,编辑apache配置,在对应的vhost中修改AllowOverride FileInfo

附上AllowOverride的文档

AllowOverride 指令
说明    确定允许存在于.htaccess文件中的指令类型
语法    AllowOverride All|None|directive-type [directive-type] ...
默认值  AllowOverride All
作用域  directory
状态    核心(C)
模块    core

当服务器发现一个.htaccess文件(由AccessFileName指定)时,它需要知道在这个文件中声明的哪些指令能覆盖在此之前指定的配置指令。
仅允许存在于<Directory>配置段
AllowOverride仅在不包含正则表达式的<Directory>配置段中才是有效的。在<Location>, <DirectoryMatch>, <Files>配置段中都是无效的。

如果此指令被设置为None ,那么.htaccess文件将被完全忽略。事实上,服务器根本不会读取.htaccess文件。

当此指令设置为 All时,所有具有".htaccess"作用域的指令都允许出现在.htaccess文件中。

directive-type可以是下列各组指令之一:

AuthConfig
    允许使用与认证授权相关的指令(AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, 等)。
FileInfo
    允许使用控制文档类型的指令(DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, mod_mime中的 Add* 和 Remove* 指令等等)、控制文档元数据的指令(Header, RequestHeader, SetEnvIf, SetEnvIfNoCase, BrowserMatch, CookieExpires, CookieDomain, CookieStyle, CookieTracking, CookieName)、mod_rewrite中的指令(RewriteEngine, RewriteOptions, RewriteBase, RewriteCond, RewriteRule)和mod_actions中的Action指令。
Indexes
    允许使用控制目录索引的指令(AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, 等)。
Limit
    允许使用控制主机访问的指令(Allow, Deny, Order)。
Options[=Option,...]
    允许使用控制指定目录功能的指令(Options和XBitHack)。可以在等号后面附加一个逗号分隔的(无空格的)Options选项列表,用来控制允许Options指令使用哪些选项。

例如以下指令只允许在.htaccess中使用AuthConfig和Indexes组的指令:

AllowOverride AuthConfig Indexes

不在这两组中的指令将会导致服务器产生一个内部错误。

, ,