利用expect,结合su,通过web启动sshd
本文按署名·非商业用途·保持一致授权作者:
,发表于2009年01月04日00时06分
有两台服务器,A和B,都是GNU/Linux。B的sshd挂掉,现在需要把sshd启动起来。
条件和环境:
*B的某个目录通过NFS指向A的目录AD
*B的这个NFS目录,可以通过web访问,可以执行php脚本。但web权限较低,只能对特定的目录写入
*iptable drop掉了除22,80之外的几乎所有端口
*可登录A,知道B的root密码
*几百年都不会有人来的机房
解决方法:
#0
在服务器A下载tcl8.4.6到目录AD,./configure –disable-shared && make,这样就可以编译一个.a(静态lib)出来。这里的tcl,最新版本,无法被expect使用,暂时不知道原因。于是我用了8.4.6。
#1
在服务器A下载expect到目录AD,./configure && make。这样,一个静态的expect就出来了。
注意:tcl和expect需要在同一个目录下解压,例如:/path/to/tcl和/path/to/expect。编译好之后,在AD目录下写php和expect脚本。
#2
sys.php
< ?php
system(‘/usr/local/apache/htdocs/sites/liver/upload/back_expert/startsshd 2>&1′);
#3
startsshd
#!/path/to/expect-5.43/expect
spawn su root
expect “Password:”
send “root’s pass\r”
send “/etc/init.d/sshd start\r”
expect eof
#4
chmod +x startsshd。
完成上面之后通过web访问服务器B的sys.php(通过NFS从A mount过来的)。看有什么错误提示,有则改之。我这里遇到两个错误,都和/path/to/tcl/library有关。一个是权限问题,一个是lib路径问题。chmod和ln一下,解决。
其实这个问题遇到了两次,前几天遇到第二次,因为没记录下来,导致花的时间比预期多了一点。sys.php里的2>&1这个实在是很重要,我因为一开始没有把标准错误重定向,导致我走了一些弯路,浪费了不少时间。
上面的解决方法看似很简单,但是实际上,即使是第二次的解决,也花了我2个小时的时间。我的故事很复杂,本来打算说一说的,不过说了一半,觉得过于流水了,还是不说了。
这个问题,不知道大家有没有更好的解决方案。
另外我计划在所有的服务器开启telnetd,作为备用的登录方案。不知道除了作为备用登录时候可能会被窃取密码(因为传输是明文),是否还有其他安全问题。
btw:
今天(昨天?)写了个php版本的ed2k hash,需要的朋友可在这个地址获得:http://code.google.com/p/nehcfrus/source/browse/trunk/php/lib/ed2k.php

2009-01-09 12:37:22
哥们真牛. 这个方法都想的出. 刺那.