##安装opensshphp
电脑中只有Ubuntu11.04,且系统中默认自带的只有ssh的客户端,而没有服务端。可是想体验下ssh登陆Linux功能,只好本身编译安装虚拟机里面的openssh。查看系统中是否有ssh服务端运行ps -e | grep ssh
css
30 ? 00:00:00 sshd 373 ? 00:00:00 ssh-agent
其中ssh-agent是ssh的客户端,而sshd才是后台服务,桌面版本系统通常都没有,须要自行安装linux
在Ubuntu中编译安装程序须要build-essential
,经常使用的gcc编译工具系统已经自带,缺乏的只是autoconf和automake,编译autoconf须要m4,所以须要先安m4,直接到官网上下载最新的m四、autoconf和automake,使用tar -xzvf xxx.tar.gz
解压后,进入目录,参考readme和Install两个文件编译,make install
须要root权限,由于安装时通常须要安装到/usr/local/
目录下,而普通用户没有写权限nginx
./configure
make make test sudo make install
安装完编译环境后,准备安装openssh,在它的说明文档中写了依赖3个库,autoconf、zlib和openssl,安装时须要注意版本的匹配,不必定用最新的版本。我在ubuntu上zlib使用的最新版本,openssl使用的1.0.2m版本,openssh下载的时7.6版本。shell
安装方法仍是同样的make一套,只是openssl用的时./config
,它里面根据系统的差别再去调用./Configure
。须要注意的地方:ubuntu
No rule to make target
../include/openssl/bio.h', needed by cryptlib.o'. Stop.MAKE
./config --shared
checking OpenSSL header version... not found
错误。查看当前系统openssl版本openssl version -a
。正常本身编译安装的程序若是在configure时不指定--prefix=dir
安装目录的话,通常会安装在/usr/local/ssl
,而系统默认的目录为/usr/bin/openssl
以及/usr/include/openssl
,所以须要建立符号连接,将刚编译的openssl做为默认,具体路径须要参考安装说明中的路径。sudo mv /usr/bin/openssl /usr/bin/openssl.old
sudo ln -s /usr/local/ssl /usr/bin/openssl sudo ln -s /usr/local/include/openssl /usr/include/openssl # 动态库目录设置,这个命令执行时提示没有权限,失败 sudo echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
在ubuntu中/etc/ld.so.conf
指明了系统当前动态库的查找目录其中只有一句话缓存
include /etc/ld.so.conf.d/*.conf
本质上就是包含了ld.so.conf.d
这个目录下的全部动态库配置,例如其中就有一个libc.conf指明了c库的默认位置为/usr/local/lib
,同理能够在这个目录下新建一个openssl.conf的文件,在其中加一句话/usr/local/ssl/lib
便可。在设置库目录后,须要执行一次sudo ldconfig
来让系统更新一下库目录缓存/etc/ld.so.cache
文件安全
至此,openssh的make已经没有问题,可是在install时会提示Privilege separation user sshd does not exist
,这个和openssh的分权用户有关,bash
所谓特权分离(Privilege Separation)其实是一种 OpenSSH 的安全机制,该特性默认开启,可经过配置文件中的 UsePrivilegeSeparation 指令开启或关闭。ssh
须要执行如下操做后,再sudo make install
sudo mkdir -p /var/empty #设置一个空目录 sudo chown 0:0 /var/empty #全部者和组,0表明"root" sudo chmod 000 /var/empty #目录权限设置为"000" sudo groupadd sshd #创建sshd组 sudo useradd -g sshd -c 'sshd privsep' -d /var/empty -s /bin/false sshd #用于特权分离的非特权用户"sshd"
编译安装的ssh不会建立/etc/init.d/sshd
服务启动脚本,只有使用安装包安装的才有。所以要启动sshd服务,须要直接执行sudo /usr/local/sbin/sshd
,注意此处不能直接执行sudo sshd
,系统会提示要用绝对路径执行,网上有讲这个是由于sbin属于root用户,普通用户下是不能直接执行sbin下的命令。
自动启动sshd
在/etc/rc.local
中的exit 0以前添加/usr/local/sbin/sshd &
,让系统在初始化时执行
本身手动建立一个sshd的shell脚本文件放在/etc/init.d/
目录下,并给文件增长执行权限chmod +x sshd
,文件的内容为
#!/bin/bash cd /usr/local/sbin ./sshd &
而后到/etc/rc3.d/目录下创建一个连接到刚刚的sshd文件,标识系统在3级运行时就启动这个服务
# cd /etc/rc3.d # ln -s ../init.d/sshd S13sshd
/etc/rcN.d/
简要说明
init.d 目录下放了系统安装程序时对应的服务启动或中止的脚本,可是系统不是直接从这个目录中直接执行脚本文件,而是根据当前系统的运行级别来决定指定哪些脚本。 init进程上来首先作的事是去读取/etc/目录下inittab文件中initdefault id值,这个值称为运行级别(run-level)。它决定了系统启动以后运行于什么级别。运行级别决定了系统启动的绝大部分行为和目的。这个级别从0到6 ,具备不一样的功能。不一样的运行级定义以下:
/etc/rcN.d/
中的数字N就表明了对应的运行级别要执行的脚本的目录,经过这些目录将不一样级别执行的服务区分。而全部的服务脚本本质都在init.d这个目录中,而rcN.d中则是软连接到了实际的脚本文件。例如级别3要启动的服务都放在rc3.d这个目录下。这个目录下文件名又以Sxx或Kxx开头,其中S表示启动一个服务,K标识中止一个服务,而xx标识执行的顺序,数字越小,越早执行,这样能够处理服务之间的相互依赖关系。