交叉编译的过程参考OpenSSH移植到ARM Linux教程。
其中openssl选用较新的openssl-1.1.0c.tar.gz,编译的过程中出现如下错误
*Warning! target os/compiler:/opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc doesn't exist!
至今未解决,可参考此页面。
我们需要的是sshd
,ssh
,scp
,利用arm-linux-strip
去除不需要的部分,大约节省1/3的体积,不耽误正常功能。还有两个配置文件ssh_config
,sshd_config
。
yy@ubuntu1204:~/test/ssh/openssh-7.4p1$ arm-linux-strip ssh -o ssh_bak
yy@ubuntu1204:~/test/ssh/openssh-7.4p1$ arm-linux-strip sshd -o sshd_bak
yy@ubuntu1204:~/test/ssh/openssh-7.4p1$ arm-linux-strip scp -o scp_bak
将这个三个文件拷贝到开发板上。
scp -> /usr/local/bin/ #通过ssh传输文件用,可以直接在PC端复制,非必须
ssh -> /usr/local/bin/ #在开发板上通过ssh连接其他设备,非必须
sshd -> /usr/local/sbin/ #ssh服务程序,必须
ssh_config ->/usr/local/etc/
sshd_config -> /usr/local/etc/ #sshd配置文件,必须
原来开发板上只有root用户,而且没有密码,就把和用户相关的文件删除了,现在都要修正回来。
1. 新建文件
touch passwd
touch group
2. 增加root用户
adduser root
3. 将root用户的uid,gid修改成0
vi passwd
root:x:500:500:Linux User,,,:/home/root:/bin/sh
修改成
root:x:0:0:Linux User,,,:/root:/bin/sh
vi group
root:x:500:
修改成
root:x:0:
否则,会提示root的uid不为0
,看到类似提示几个修改这里就好了。
4. 增加root用户密码
passwd root
通过ssh连接,是需要用户设置过密码的。
5. 修改配置文件
修改sshd_config
#PermitRootLogin prohibit-password
修改成
PermitRootLogin yes
这是新版本中的更改,可能是安全的考虑。如果提示没有权限或者被拒绝,可以考虑修改这个地方。
6. 增加sshd用户
adduser sshd
如果没有这个用户它会提示的,按照提示修补就可以。
7. 新建并修改sshd用户的根目录
mkdir -p /var/empty
vi /etc/passwd
sshd:x:500:500:Linux User,,,:/home/sshd:/bin/sh
修改成
sshd:x:500:500:Linux User,,,:/var/empty:/bin/sh
同样,如果没有/var/empty
这个目录会报错,按照提示排查即可。
8. 添加库文件libz.so.1
注意看错误信息,它提到找不到libz.so.1
,可以看到这个应该是和zlib相关的库文件。在zlib.install/lib/
中找到了这个文件。
#ls -l zlib.install/lib/
total 228
-rw-r--r-- 1 yy yy 119278 12月 29 19:18 libz.a
lrwxrwxrwx 1 yy yy 13 12月 29 19:18 libz.so -> libz.so.1.2.8
lrwxrwxrwx 1 yy yy 13 12月 29 19:18 libz.so.1 -> libz.so.1.2.8
-rwxr-xr-x 1 yy yy 103131 12月 29 19:18 libz.so.1.2.8
drwxrwxr-x 2 yy yy 4096 12月 29 19:18 pkgconfig
将libz.so.1.2.8复制到开发板。
libz.so.1.2.8 -> /lib/
建立软连接ln -s libz.so.1.2.8 libz.so.1
起初放在了/usr/local/lib/
下,提示找不包libz.so.1
,后来放在了/lib/
下,貌似解决了问题,待验证。
9. 增加key文件
ssh是一种基于加密的安全的传输方式,需要事先添加密钥对。参考OpenSSH移植到ARM Linux教程。如果主机上有ssh_keygen
命令,可直接在主机上生成4个文件,拷贝到开发板上。
10. 这时连接ssh时会有如下提示,密码已过期,需要更改。
这个/etc/shadow
文件里的密码设置时间有关系,具体内容参考/etc/passwd 和 /etc/shadow 文件内容及其解释。
WARNING: Your password has expired.
You must change your password now and login again!
这个地方比较坑,我的板子上修改密码这个值也不变,始终都是0
,但问题还是要解决的,自己算一下47年,按365天,大约17000天吧。
vi /etc/shadow
root:**********************************:0:0:99999:7:::
sshd:**********************************:0:0:99999:7:::
修改第三个字段,是上次修改密码到1970年1月1日的天数。
root:**********************************:17000:0:99999:7:::
sshd:**********************************:17000:0:99999:7:::
改完大致是这个样子。
11. 现在基本上就没啥问题了。
大概还有
- 把libz.so.1的路径增加的环境变量LD_LIBRARY_PATH中;
- 增加sshd的开机启动,不知道出于什么考虑必须用绝对路径启动;
大致的用法就是
- 在远程主机ssh root@9261ip
连接开发板进行控制;
- 在主机端通过scp file-to-send root@9261ip:/destination/path
从主机向开发板发送文件。
OVER!!