##安裝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標識執行的順序,數字越小,越早執行,這樣能夠處理服務之間的相互依賴關係。