dropbear是轻量级的sshd服务器,与OpenSSH相比,他更简洁,更小巧,运行起来占用的内存也更少,因此被很多嵌入式设备所使用。SSH:Secure Shell (SSH) 是一个允许两台主机之间通过安全的连接进行数据交换的网络协议。SSH采用公钥加密技术来验证远程主机,以及(必要时)允许远程主机验证用户。scp是基于SSH协议的文件传输。在某些应用项目中,现场的嵌入式设备(linux内核)可能需要将数据或日志传输到后端的服务器上,此时可借助于shell脚本,利用scp定时传输数据至后台。因脚本是自动执行,则要求scp时不用输入服务器密码。
网上关于scp免密传输的文章很多,此文主要是学习记录,并给有需要的人参考。scp免密码输入传输文件的基本思路是:将主机A的SSH生成公钥和私钥,并将公钥的内容复制到主机B的 authorized_keys 文件内,从而建立主机B对主机A的信任关系。如此,主机A通过SSH连接主机B,或通过SCP向主机B传输文件就可不用输入密码连接。具体实现主要分以下四个步骤:
第一步:主机A生成公钥
假设主机A的SSH是基于dropbear实现,一般路径为:/etc/dropbear/
可见,该路径下已有2个密钥文件。若没有,也可以通过如下指令生成:
dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
dropbearkey -t rsa -s 1024 -f /etc/dropbear/dropbear_rsa_host_key
关于dropbearkey的用法说明如下:
Usage: dropbearkey -t <type> -f <filename> [-s bits]
-t type Type of key to generate. One of: rsa
-f filename Use filename for the secret key. ~/.ssh/id_dropbear is recommended for client keys.
-s bits Key size in bits, should be a multiple of 8 (optional)
-y Just print the publickey and fingerprint for the private key in <filename>.
通过密钥文件生成公钥Key:
dropbearkey -y -f /etc/dropbear/dropbear_rsa_host_key >> /etc/dropbear/authorized_keys_01
生成的公钥Key文件名字可以自己命名,此处命名为:authorized_keys_01
第二步:主机A的公钥加到主机B的authorized_keys中
进入主机B的用户 ~/.ssh 路径下( 即 /home/xxx/.ssh,可能是一个隐藏文件,可以在 /home/xxx 目录下用 ls -al 查看 。xxx表示系统的用户名称)。若没有该目录,则执行ssh-keygen可生成。ssh-keygen即是生成密钥文件,生成的密钥文件即是保存在~/.ssh 路径下。
将上述的主机A生成的authorized_keys_01中的【第二行】内容复制到~/.ssh 路径下的authorized_keys文件末尾。若没有该文件,可以手动建立一个该文件,命名为authorized_keys。
第三步:修改权限
需要修改上述的/home/xxx 、 ~/.ssh 和authorized_keys权限。
authorized_keys 文件必须是600权限(也就是-rw——-)或者644;
~/.ssh 目录必须是700权限,即drwx——;
/home/xxx 目录必须是755权限,即drwxr-xr-x。
网上有文章说,第(3)条权限不能为777,必须为755,否则无法建立信任关系。
第四步:修改主机B的sshd_config设置
修改主机B的系统sshd配置文件( /etc/ssh/sshd_config ),使允许使用密钥免密登录配置。配置项如下:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
在sshd_config中去除相关项前面的注释符#,并改为上述的值。重启sshd,service sshd restart 或 systemctl restart sshd.service。
按上述四步操作完成后,从主机A ssh连接或scp主机B,便不需要输入密码了!
但dropbear免密码ssh或scp需要按如下指令格式:
ssh -i /etc/dropbear/dropbear_rsa_host_key user@hostB-ip
scp -i /etc/dropbear/dropbear_rsa_host_key user@hostB-ip
即需要指定主机A所使用的密钥文件。(OpenSSH好像不需要 -i,直接ssh或scp就可以)。
作者补充:有的ssh服务端可能默认不支持RSA密码算法,导致免密SSH或SCP无法生效,此时需要在SSH服务端的 /etc/ssh/sshd_config 中添加:PubkeyAcceptedAlgorithms +ssh-rsa 。基允许SSH服务端公钥密码算法支持RSA。