更新移植ARM-Linux openSSH 版本到openssh-9.7p1

声明:该文章主要引用了 arm linux 移植 ssh 博客,在其基础上根据实际移植过程中遇到的一些问题添加了一些补充,其中还借鉴了移植SSH到ARM开发板(保姆级教程)[Openssh] OpenSSH移植到ARM Linux教程 中的一些内容,具体链接如下:
引用文章:
移植SSH到ARM开发板(保姆级教程)
arm linux 移植 ssh
[Openssh] OpenSSH移植到ARM Linux教程

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

2.准备

一个脚本做完所有的事情

##
#    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
# 需要注意的地方1:    BUILD_HOST需要指向交叉编译链的路径,使用绝对路径           
BUILD_HOST=/home/cc/CC/arm-linux-gcc/IOT-NET-S/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf
ARM_GCC=${BUILD_HOST}-gcc
BASE=`pwd`
OUTPUT_PATH=${BASE}/install
# 需要注意的地方2:    下面的zlib、openssl、openssh的版本根据需求修改,具体版本号可通过打开官方下载网站查看
ZLIB=zlib-1.3.1
OPENSSL=openssl-3.2.0
OPENSSH=openssh-9.7p1

FIN_INSTALL=/usr/${OPENSSH}
make_dirs () {
    echo "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 () {
    echo "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 () {
    echo "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 () {
    echo "make_zlib"
    # 编译安装 zlib
    cd ${BASE}/source/${ZLIB}
    echo "ZLIB ABOUT"
    CC=${ARM_GCC} ./configure --prefix=${OUTPUT_PATH}/${ZLIB}
    make && make install
}

pre_make_ssl () {
    echo "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 -e "\t@echo skip by Schips" >> Makefile
        echo "install_docs:" >> Makefile
        echo -e "\t@echo skip by Schips" >> Makefile
        echo "# DO NOT DELETE THIS LINE -- make depend depends on it." >> Makefile
        break
    done
}

make_ssl () {
    echo "make_ssl"
    # 编译安装 openssl
    cd ${BASE}/source/${OPENSSL}
    echo "SSL ABOUT"
    # 需要注意的地方3:    下面命令中的 linux-armv4 需要根据开发板的平台的架构来修改,可通过uname -m命令查看,在这里没有指定编译链,所以需要在执行脚本前通过如下命令将编译链配置到环境变量中去:
    export CROSS_COMPILE=${BUILD_HOST}-
    # ./Configure linux-armv4 --prefix=${OUTPUT_PATH}/${OPENSSL}  os/compiler:${ARM_GCC}
    ./Configure linux-armv4 --prefix=${OUTPUT_PATH}/${OPENSSL}
    #sudo mv /usr/bin/pod2man /usr/bin/pod2man_bak
    #mv doc/apps /tmp/
    #pre_make_ssl    # 这条需要注释,不然会出现编译openssl报错的问题
    make && make install
}

do_copy () {
    echo "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 () {
    echo "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 () {
    echo "make_ssh"
    cd ${BASE}/source/${OPENSSH}
    # 需要注意的地方4:    --host需要指定目标主机类型,在这里使用了交叉编译链中的:arm-linux-gnueabihf
    ./configure \
    --host=arm-linux-gnueabihf \
    --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 $?

3.开发板准备

新建以下目录

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/

拷贝:
将脚本中 OUTPUT_PATH 指向的目录中openssh文件夹拷贝到开发板中,使用的方式,根据实际情况决定,在这里使用了U盘拷贝:

  1. 先将openssh文件夹拷贝到U盘中
  2. 执行下面的命令,将U盘中的openssh相关文件拷贝到对应的目录中去:
cp /udisk/openssh-9.7p1/bin/* /usr/local/bin/
cp /udisk/openssh-9.7p1/sbin/* /usr/local/sbin/
cp /udisk/openssh-9.7p1/etc/* /usr/local/etc/
cp /udisk/openssh-9.7p1/libexec/* /usr/local/libexec/
  1. 创建软链接命令 或者 是将/usr/local/bin/ 和 /usr/local/sbin/ 添加到环境变量中
# 创建软连接
cd /bin
ln -s /usr/local/bin/scp 
ln -s /usr/local/bin/sftp 
ln -s /usr/local/bin/ssh 
ln -s /usr/local/bin/ssh-add 
ln -s /usr/local/bin/ssh-agent 
ln -s /usr/local/bin/ssh-keygen 
ln -s /usr/local/bin/ssh-keyscan
cd /sbin/
ln -s /usr/local/sbin/sshd

添加环境变量

export PATH=$PATH:/usr/local/bin/:/usr/local/sbin/

4.修改配置文件

# 修改配置文件
vim /usr/local/etc/sshd_config  # 将PermitRootLogin yes前的注释“#”号去掉 就可以以root登录,如果是#PermitRootLogin prohibit-password,则把prohibit-password改为yes
# 如果开发板的 root 用户还没有密码,键入以下命令然输入两次密码来修改,否其他设备无法连:有设置root用户密码的就直接跳过即可
passwd root
# 打开 /etc/passwd 文件,在最后添加下面这一行:如果是更新openssh版本,/etc/passwd文件中应该已有一条sshd的配置,使用原来的配置即可
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

5.修改 秘钥文件的 权限为 600:

chmod 600 /usr/local/etc/ssh_host_rsa_key  
chmod 600 /usr/local/etc/ssh_host_ecdsa_key
chmod 600 /usr/local/etc/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_ke

6. 测试

在目标板上运行:

/usr/local/bin/sshd

可以用 ps 命令查看sshd是否在工作。
==如果运行的过程中有提示缺少动态连接库,可以在主机上搜索相应文件,拷贝到目标板/lib/或/usr/lib/ 建议在/usr/lib/目录下面,注意创建软连接!==
OK!不出意外的话可以成功,
主机上:

ssh root@192.168.1.250(开发板的ip)

然后输入开发板的root密码就就可以了。

7.开发板设置开机自启动ssh:

etc/init.d目录下新建Sxxsshd.sh文件 (xx 指的是具体的数字,可任意,一般越晚后越好),如果是更新openssh版本已经有ssh的脚本,直接编辑替换路径即可,需要绝对路径

#! /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
  • 31
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值