arm linux 移植 ssh


背景:

自己擁有一塊開發板,但是苦於上面沒有ssh,比較不方便。正好趁這個機會,移植ssh。我們使用的ssh是openssh。

host平台   :Ubuntu 18.04

arm平台   : S5P6818

openssh   :4.6p1

openssl   :0.9.8e

zlib     :1.2.11

arm-gcc   :4.8.1

准備

一個腳本做完所有的事情

##
#    Copyright By Schips, All Rights Reserved
#    https://gitee.com/schips/
#    File Name:  make.sh
#    Created  :  Sat 30 Nov 2019 01:56:37 PM CST
##
#!/bin/sh

BUILD_HOST=arm-linux
ARM_GCC=${BUILD_HOST}-gcc
BASE=`pwd`
OUTPUT_PATH=${BASE}/install
ZLIB=zlib-1.2.11
OPENSSL=openssl-1.0.2t
OPENSSH=openssh-4.6p1

FIN_INSTALL=/usr/${OPENSSH}
make_dirs () {
    #為了方便管理,創建有關的目錄
    cd ${BASE} && mkdir compressed install source -p
}

tget () { #try wget
    filename=`basename $1`
    echo "Downloading [${filename}]..."
    if [ ! -f ${filename} ];then
        wget $1
    fi

    echo "[OK] Downloaded [${filename}] "
}

download_package () {
    cd ${BASE}/compressed
    #下載包
    tget https://www.zlib.net/${ZLIB}.tar.gz
    tget https://www.openssl.org/source/${OPENSSL}.tar.gz
    tget http://mirrors.mit.edu/pub/OpenBSD/OpenSSH/portable/${OPENSSH}.tar.gz
}

tar_package () {
    cd ${BASE}/compressed
    ls * > /tmp/list.txt
    for TAR in `cat /tmp/list.txt`
    do
        tar -xf $TAR -C  ../source
    done
    rm -rf /tmp/list.txt
}

make_zlib () {
    # 編譯安裝 zlib
    cd ${BASE}/source/${ZLIB}
    echo "ZLIB ABOUT"
    CC=${ARM_GCC} ./configure --prefix=${OUTPUT_PATH}/${ZLIB}
    make && make install
}

pre_make_ssl () {
    cd ${BASE}/source/${OPENSSL}
    startLine=`sed -n '/install_html_docs\:/=' Makefile`
    echo $startLine
    # 為了避免 多行結果
    for startline in $startLine
    do
        lineAfter=99
        endLine=`expr $startline + 999`
        sed -i $startline','$endLine'd' Makefile
        echo "install_html_docs:" >> Makefile
        echo "\t@echo skip by Schips" >> Makefile
        echo "install_docs:" >> Makefile
        echo "\t@echo skip by Schips" >> Makefile
        echo "# DO NOT DELETE THIS LINE -- make depend depends on it." >> Makefile
        break
    done
}

make_ssl () {
    # 編譯安裝 zlib
    cd ${BASE}/source/${OPENSSL}
    echo "SSL ABOUT"
    ./Configure --prefix=${OUTPUT_PATH}/${OPENSSL}  os/compiler:${ARM_GCC}
    #sudo mv /usr/bin/pod2man /usr/bin/pod2man_bak
    #mv doc/apps /tmp/
    pre_make_ssl
    make && make install
}

do_copy () {
    cd ${BASE}/source/${OPENSSH}
    mkdir ${OUTPUT_PATH}/${OPENSSH}/bin -p
    mkdir ${OUTPUT_PATH}/${OPENSSH}/sbin -p
    mkdir ${OUTPUT_PATH}/${OPENSSH}/etc -p
    mkdir ${OUTPUT_PATH}/${OPENSSH}/libexec -p

    cp scp  sftp  ssh  ssh-add  ssh-agent \
        ssh-keygen  ssh-keyscan         ${OUTPUT_PATH}/${OPENSSH}/bin
    cp moduli ssh_config sshd_config    ${OUTPUT_PATH}/${OPENSSH}/etc
    cp sftp-server  ssh-keysign         ${OUTPUT_PATH}/${OPENSSH}/libexec
    cp sshd                             ${OUTPUT_PATH}/${OPENSSH}/sbin



    #scp  sftp  ssh  ssh-add  ssh-agent  ssh-keygen  ssh-keyscan  拷貝到目標板/usr/local/bin
    #moduli ssh_config sshd_config拷貝到目標板 /usr/local/etc
    #sftp-server  ssh-keysign 拷貝到目標板 /usr/local/libexec
    #sshd 拷貝到目標板 /usr/local/sbin/
}

make_key () {
    cd ${BASE}/source/${OPENSSH}
    ssh-keygen -t rsa   -f  ssh_host_key -N ""
    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_host_*_key這4個文件copy到目標板的 /usr/local/etc/目錄下
    cp ssh_host*key ${OUTPUT_PATH}/${OPENSSH}/etc
}


make_ssh () {
    cd ${BASE}/source/${OPENSSH}
    ./configure \
    --host=${BUILD_HOST} \
    --with-libs --with-zlib=${OUTPUT_PATH}/${ZLIB} \
    --with-ssl-dir=${OUTPUT_PATH}/${OPENSSL} \
    --disable-etc-default-login \
    CC=${BUILD_HOST}-gcc \
    AR=${BUILD_HOST}-ar

    make -j4 # 不需要 install
}

make_dirs
sudo ls
download_package
tar_package
make_zlib
make_ssl
make_ssh
do_copy
make_key
exit $?

開發板准備

新建以下目錄

mkdir -p /usr/local/bin/
mkdir -p /usr/local/sbin/
mkdir -p /usr/local/etc/
mkdir -p /usr/local/libexec/
mkdir -p /var/run/
mkdir -p /var/empty/

拷貝:
從PC機上將以下文件拷貝到目標板Linux系統中

PC機 ssh/source/openssh-4.6p1/ 目錄下的

  • scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan 拷貝到目標板/usr/local/bin
  • moduli ssh_config sshd_config拷貝到目標板 /usr/local/etc
  • sftp-server ssh-keysign 拷貝到目標板 /usr/local/libexec
  • sshd 拷貝到目標板 /usr/local/sbin/

生成Key文件
在PC機 ssh/source/openssh-4.6p1/ 目錄下運行:

ssh-keygen -t rsa -f ssh_host_key -N ""
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_host_*_key這4個文件copy到目標板的 /usr/local/etc/目錄下

修改目標板passwd文件

在/etc/passwd 中添加下面這一行 “ sshd❌74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin ”

cp /etc/passwd  /etc/passwd_bak
echo "sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin" >> /etc/passwd

此后,只需要運行一次 /usr/local/sbin/sshd 此后即可使用遠程登錄

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

passwd root

如果連接不上,請直接運行 /usr/local/sbin/sshd 查看是什么原因

  • 有提示 動態鏈接庫 找不到的(工具鏈的動態鏈接庫)
  • 有提示 ssh_host 文件找不到的 生成即可

開發板設置開機自啟動ssh:

/etc/init.d目錄下新建Sxxsshd.sh文件 (xx 指的是具體的數字,可任意,一般越晚后越好)

#! /bin/sh
sshd=/usr/local/sbin/sshd
test -x "$sshd" || exit 0
case "$1" in
  start)
    echo -n "Starting sshd daemon"
    start-stop-daemon --start --quiet --exec $sshd  -b
    echo "."
    ;;
  stop)
    echo -n "Stopping sshd"
    start-stop-daemon --stop --quiet --exec $sshd
    echo "."
    ;;
  restart)
    echo -n "Stopping sshd"
    start-stop-daemon --stop --quiet --exec $sshd
    echo "."
    echo -n "Waiting for sshd to die off"
    for i in 1 2 3 ;
    do
        sleep 1
        echo -n "."
    done
    echo ""
    echo -n "Starting sshd daemon"
    start-stop-daemon --start --quiet --exec $sshd -b
    echo "."
    ;;
  *)
    echo "Usage: /etc/init.d/sshd {start|stop|restart}"
    exit 1
esac
exit 0

附錄: SSH連接慢優化

修改vim /etc/ssh/sshd_config 文件,主要修改如下兩個參數

GSSAPIAuthentication no
UseDNS no

然后reload或者resart sshd服務,即可生效

  /etc/init.d/sshd reload
  /etc/init.d/sshd restart


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM