OpenSSH移植到ARM Linux教程

應用移植 19256瀏覽 33評論
OpenSSH 是?SSH?(Secure?SHell) 協議的免費開源實現。SSH協議族可以用來進行遠程控制, 附加的SFTP協議可輕松實現在計算機之間傳送文件。而實現此功能的傳統方式,如telnet(終端仿真協議)、 rcp ftp、 rlogin、rsh都是極為不安全的,因為它們使用明文傳送密碼。
OpenSSH常常被誤認以為與OpenSSL有關聯,但實際上這兩個計劃的有不同的目的,不同的發展團隊,名稱相近只是因為兩者有同樣的軟件發展目標──提供開放源代碼的加密通訊軟件

1 下載

1、移植openssh需要三個包:openssh、openssl 和 zlib,地址如下:

因為它們之間沒有版本所謂的版本沖突,所以都下載最新板的即可。本文以zlib-1.2.8.tar.gzopenssl-1.0.1h.tar.gzopenssh-6.6p1.tar.gz這三個版本為例,其他版本過程一樣。

2 部署

因為移植過程涉及到三個包,所以先部署好工作目錄,有利于移植過程的順利進行。

$ cd                                                 # 切換到用戶目錄
$ mkdir ssh                                          # 新建 ssh 工作目錄
$ cd ssh                                             # 進入 ssh 目錄  
$ mkdir zlib.install                                 # 新建 zlib 安裝目錄,移植過程 zlib 鏡像會安裝到該目錄
$ mkdir openssl.install                              # 新建 openssl 安裝目錄,移植過程 openssl 鏡像會安裝到該目錄
$ export PATH=$PATH:/usr/local/arm-2010q1/bin/       # 配置交叉編譯器路徑到 PATH 環境變量

3 復制解壓

將?zlib-1.2.8.tar.gzopenssl-1.0.1h.tar.gzopenssh-6.6p1.tar.gz 三個源碼包復制到ssh目錄下,并解壓:

$ tar zxvf zlib-1.2.8.tar.gz
$ tar zxvf openssl-1.0.1h.tar.gz
$ tar zxvf openssh-6.6p1.tar.gz

4 交叉編譯 zlib

首先編譯zlib成鏡像,供最后編譯 openssh 用。

$ cd zlib-1.2.8
$ prefix=/home/veryarm/ssh/zlib.install CC=arm-none-linux-gnueabi-gcc ./configure
$ vi Makefile
$ make
$ make install

這里第二部配置的時候,prefix前面沒有“--”,CC后面是交叉編譯器,“./configure”要放在最后。完成后,會在指定目錄“/home/veryarm/ssh/zlib.install”下生成鏡像文件。

5?交叉編譯openssl

編譯 openssl 成鏡像,也是供最后編譯 openssh 用。

$ cd ../openssl-1.0.1h
$ ./Configure --prefix=/home/veryarm/ssh/openssl.install ?os/compiler:arm-none-linux-gnueabi-gcc
$ make
$ make install

其中./Configure第一個字母是大寫的,交叉編譯使用os/compiler來指定。

6?交叉編譯openssh

編譯openssh會引用上面編譯的zlib和openssl的安裝目錄,如下。
$ cd? ../openssh-6.6p1
$ ./configure --host=arm-none-linux-gnueabi --with-libs --with-zlib=/home/veryarm/ssh/zlib.install --with-ssl-dir=/home/veryarm/ssh/openssl.install --disable-etc-default-login CC=arm-none-linux-gnueabi-gcc AR=arm-none-linux-gnueabi-ar
$ make

注意:openssh不需要 make install。

7 目標板準備

確保目標板上有以下目錄,若沒有,則新建:

/usr/local/bin
/usr/local/etc
/usr/libexec
/var/run
/var/empty
將PC機?/home/veryarm/ssh/openssh-6.6p1/ 目錄下文件拷貝到目標板系統中,具體為:
  • scp、sftp、ssh sshd、ssh-add、ssh-agent、ssh-keygen、ssh-keyscan共8個文件拷貝到目標板/usr/local/bin
  • moduli、ssh_config、sshd_config共3個文件拷貝到目標板 /usr/local/etc
  • sftp-server、ssh-keysign 共2個文件拷貝到目標板 /usr/libexec

8 生成Key文件

在目標版 /usr/local/etc/ 目錄下生成key文件:

$ cd /usr/local/etc/
$ ssh-keygen -t rsa -f ssh_host_rsa_key -N ""
$ ssh-keygen -t dsa -f ssh_host_dsa_key -N ""
$ ssh-keygen -t ecdsa -f ssh_host_ecdsa_key -N ""
$ ssh-keygen -t dsa -f ssh_host_ed25519_key -N ""

修改?ssh_host_ed25519_key 權限為 600:

$ chmod 600 ssh_host_ed25519_key

其中 ssh_host_ed25519_key 是SSH第二版協議用到的key,需要修改權限,否則會提示以下錯誤:

Permissions 0644 for '/usr/local/etc/ssh_host_ed25519_key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /usr/local/etc/ssh_host_ed25519_key
Could not load host key: /usr/local/etc/ssh_host_ed25519_key

9 目標板用戶信息

打開 /etc/passwd 文件,在最后添加下面這一行:

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

如果開發板的 root 用戶還沒有密碼,鍵入以下命令然輸入兩次密碼來修改,否其他設備無法連:

$ passwd root

10?測試

在目標板上運行:

$ /usr/local/bin/sshd

可以用 ps 命令查看sshd是否在工作。

如果運行的過程中有提示缺少動態連接庫,可以在主機上搜索相應文件,拷貝到目標板/lib/目錄下面,注意創建軟連接!
OK!不出意外的話可以成功,

主機上:

$ ssh [email protected](開發板的ip)
然后輸入開發板的root密碼就就可以了。
發表我的評論
取消評論

表情

Hi,您需要填寫昵稱和郵箱!

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址

網友最新評論 (33)

  1. 運行sshd時出現sshd: /lib/libc.so.6: version `GLIBC_2.7' not found (required by sshd)
    Wincom 5年前 (2014-11-11) 回復 編輯
    • 說明你編譯等時候指定等glibc和目標板所使用的不一致。 解決辦法:配置openssh,即./configure時,使用對用等--host參數,如--host=arm-linux,或者--host=arm-none-linux-gnueabi。
      ARM Linux 5年前 (2014-11-11) 回復 編輯
  2. make openssl的時候,指定的prefix目錄已經存在,無法創建。
    Niki 5年前 (2014-11-11) 回復 編輯
    • 這是因為在prefix目錄的時候,使用了相對路徑,如../../install。 解決辦法:prefix參數需要用指定絕對路徑來安裝,prefix參數應該如:--prefix=/work/ssh/install/openssl-1.0.0
      ARM Linux 5年前 (2014-11-11) 回復 編輯
  3. 使用arm-2007q3-51-arm-none-linux-gnueabi.bin的make編譯ssh時出錯: /root/CodeSourcery/Sourcery_G++_Lite/bin/../lib/gcc/arm-none-linux-gnueabi/4.2.1/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lgcc_s collect2: ld returned 1 exit status make: *** [example] 錯誤 1
    美麗石頭 5年前 (2014-11-11) 回復 編輯
    • cannot find -lgcc_s,即沒有發現-libgcc_s.so。 解決辦法:查找/root/CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/libc/lib目錄,如果有libgcc_s.so.1,做一個鏈接:ln -s libgcc_s.so.1 libgcc_s.so,重新make,此問題可以解決。 如果再出現以下問題: 同理,其他的問題,也在/arm-none-linux-gnueabi/libc/lib目錄下, 問題:cannot find /lib/libc.so.6 inside,解決:ln -s libc-2.5.so libc.so.6 問題:cannot find /lib/ld-linux.so.3 inside,解決:ln -s ld-2.5.so ld-linux.so.3
      ARM Linux 5年前 (2014-11-11) 回復 編輯
  4. 用nfs從主機復制到目標板時出現: cp: omitting directory '/etc/boa' 等錯誤。
    六天 5年前 (2014-11-11) 回復 編輯
    • 權限不夠,或者目標板中等/usr/local/etc已經有文件。解決辦法:在cp命令后加-r參數,如:cp -r /etc/* /usr/local/etc/
      ARM Linux 5年前 (2014-11-11) 回復 編輯
  5. 錯誤:Privilege separation user sshd does not exist
    跳河才洗的請 5年前 (2014-11-11) 回復 編輯
    • 需要在開發板的系統里adduser shhd //或者在/etc/passwd 中添加下面這一行 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
      ARM Linux 5年前 (2014-11-11) 回復 編輯
  6. Permissions 0755 for '/usr/local/etc/ssh_host_dsa_key' are too open.
    OpenSSH 5年前 (2014-11-11) 回復 編輯
    • 把目標板/usr/local/etc/下的ssh_host_*幾個文件的權限改為700。如果出現權限不夠問題,用su - root進入root用戶再改。 命令:# chmod 700 ssh_host_*
      ARM Linux 5年前 (2014-11-11) 回復 編輯
  7. Permission denied (publickey,password,keyboard-interactive).
    Linux天才 5年前 (2014-11-11) 回復 編輯
    • 打開開發板/usr/local/sshd_config,將PermitRootLogin yes前的注釋“#”號去掉。
      ARM Linux 5年前 (2014-11-11) 回復 編輯
  8. configure配置openssh的時候出錯:configure: error: *** zlib missing - please install first or check config.log ***
    visani 5年前 (2014-11-11) 回復 編輯
    • 沒有找到zlib。問題解決:重新交叉編譯zlib,再configure即可。openssl也是同樣的道理。
      ARM Linux 5年前 (2014-11-11) 回復 編輯
  9. 以下兩個函數沒找到: /home/arm/ssh-omap/source/openssh-5.8p2/ssh-keygen.c:1410: undefined reference to `pkcs11_init' /home/arm/ssh-omap/source/openssh-5.8p2/ssh-keygen.c:1493: undefined reference to `pkcs11_terminate'
    visani 5年前 (2014-11-11) 回復 編輯
    • 打開ssh-keygen.c:vi ssh-keygen.c 屏蔽這1410和1493這兩行函數。
      ARM Linux 5年前 (2014-11-11) 回復 編輯
  10. 開啟sshd后,沒有找到sftp-server服務,不能傳輸文件, Failed to connect SFTP subsystem: Remote host may not have sftp-server installed : java.io.IOException: inputstream is closed
    豬想瘦 5年前 (2014-11-11) 回復 編輯
    • 顯然,這是沒有找到sftp子服務。 問題解決:打開目標版/usr/local/etc/sshd_config,找到這么一行: Subsystem sftp /usr/libexec/sftp-server 看出問題了吧?配置文件中指明的sftp子服務并不是我們放的目錄,所以修改為: Subsystem sftp /usr/local/libexec/sftp-server 然后kill掉sshd,再啟動就可以用sftp-server了。
      OpenSSH 5年前 (2014-11-11) 回復 編輯
  11. 運行sshd時出現: Could not load host key: /usr/local/etc/ssh_host_dsa_key Could not load host key: /usr/local/etc/ssh_host_ecdsa_key Could not load host key: /usr/local/etc/ssh_host_ed25519_key
    123 5年前 (2014-11-11) 回復 編輯
    • 看文章第八步《生成key文件》可解決
      visani 5年前 (2014-11-11) 回復 編輯
  12. xiexie!!
    康秋華 4年前 (2015-12-30) 回復 編輯
  13. 不錯啊! 一個字牛啊!
    康秋華 4年前 (2015-12-30) 回復 編輯
  14. 頂也~~~
    徐曉曉 4年前 (2016-01-28) 回復 編輯
  15. 請問下 ftp上傳到板子上 運行sshd 的時候 顯示段錯誤 是什么原因呀?
    _ 4年前 (2016-04-28) 回復 編輯
    • 老哥問也是Segmentation fault,請問有沒有解決啊
      111 2年前 (2017-09-12) 回復 編輯
    • 這個問題怎么解決?
      abc 2年前 (2018-04-19) 回復 編輯
    • 同問。我運行/usr/local/bin/sshd 就段錯誤了
      shapeless 2年前 (2018-06-10) 回復 編輯
  16. 在目標板上運行/usr/local/bin/sshd 提示Segmentation fault,請問這個問題怎么解決?
    shapeless 2年前 (2018-06-10) 回復 編輯
  17. segmentation fault的一個解決方法: 第4步 交叉編譯 zlib 進行配置的時候,添加AR=arm-none-linux-gnueabi-ar 若不加,則AR=ar,沒有用交叉編譯工具,肯定會出錯。
    shapeless 2年前 (2018-06-15) 回復 編輯
    • 非常感謝!
      小青團 10個月前 (03-21) 回復 編輯
七星彩走势图2元网官网