SSH 免密登陆,SCP 免密传输
工作经常用到 scp ssh sftp 等命令,每次都需要输入密码。能否实现免密传输、免密登陆?答案是 肯定,可以实现。只需要将设备公钥添加到服务器认证列表,ssh 或 scp 交互过程检测到匹配公钥后 无需再输入密码。请详看此篇文章。
提示:此文章 SSH 免密认证。
Linux ssh密钥登陆 (免密码登陆)
ssh 两种认证方式:口令(密码)认证方式和密钥认证方式。其中口令(密码)认证方式是我们最常用的一种,出于安全方面的考虑,介绍密钥认证方式登录到linux/unix的方法。
使用密钥登录分为3步:
1、生成密钥(公钥与私钥)
2、放置公钥到服务器~/.ssh/authorized_key文件中
3、配置ssh客户端使用密钥登录。
1 密钥认证
1.1 生成密钥
ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/lamborghini/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/lamborghini/.ssh/id_rsa
Your public key has been saved in /home/lamborghini/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:Mx3EzUAL1B9mIquGG4L96GbNWkUuY5zIc7hTcaDFu/U lamborghini@TRACTOR
The key's randomart image is:
+---[RSA 2048]----+
| .o .o+++ |
| o.. .o+.* |
| . ..o oo= . |
| . +.*. .. .. |
| o= O+ooS . |
|. o*++o Eo |
| o*.+ |
| +o= |
| +o. |
+----[SHA256]-----+
1.2 添加密钥认证到服务器
将密钥拷贝到服务端,手动添加密钥到认证列表
# user_name指用户名,host_name指服务器用户名,host_ip指服务器地址
scp ~/.ssh/id_rsa.pub host_name@host_ip:/home/host_name/user_name.pub
ssh host_name@host_ip
cp ~/user_name.pub >> ~/.ssh/authorized_keys
亦可直接添加到需要认证服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub user_name@host_ip
2 scp 命令详解
2.1 scp 命令详解
scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。linux的scp命令可以在linux服务器之间复制文件和目录。
scp [参数] [原路径] [目标路径]
命令参数
-1 强制scp命令使用协议ssh1
-2 强制scp命令使用协议ssh2
-4 强制scp命令只使用IPv4寻址
-6 强制scp命令只使用IPv6寻址
-B 使用批处理模式(传输过程中不询问传输口令或短语)
-C 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
-p 保留原文件的修改时间,访问时间和访问权限。
-q 不显示传输进度条。
-r 递归复制整个目录。
-v 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
-c cipher 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
-F ssh_config 指定一个替代的ssh配置文件,此参数直接传递给ssh。
-i identity_file 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
-l limit 限定用户所能使用的带宽,以Kbit/s为单位。
-o ssh_option 如果习惯于使用ssh_config(5)中的参数传递方式,
-P port 注意是大写的P, port是指定数据传输用到的端口号。
-S program 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。
命令示例
传输文件
scp local_folder/local_file remote_username@IP:/remote_folder
scp local_folder/local_file remote_username@IP:/remote_folder/remote_file
# 交换原路径和目标路径 实现文件拷贝到本地
scp remote_username@IP:/remote_folder/local_file local_folder
scp remote_username@IP:/remote_folder/remote_file local_folder/local_file
传输目录
scp -r local_folder remote_username@IP:/remote_folder
# 交换原路径和目标路径 实现文件拷贝到本地
scp -r remote_username@IP:/remote_folder local_folder
Tips
a) 服务器免密传输已实现,服务器向设备端免密传输呢?同样添加认证密钥方式 由服务端向设备端执行一次即可;换个理解方式:此时服务器应该变身 “设备端”,而设备端则变成“服务器”。
b) 认证过后,首次传传输文件 由于没有添加本机未添加到可信设备列表,可能会询问是否认证;需要输入 yes 才能继续。ssh / scp里加上 -o “StrictHostKeyChecking no” 即可跳过这个yes/no询问,直接进入下一步。
c) 设备端如果有多个密钥,且通过服务器认证密钥非默认密钥;ssh 时提示密钥不正确,此时可以指定使用密钥。 ssh / scp 增加 -i ~/.ssh/xxx.pub 指定此次操作中要用到密钥。
总结
哪有所谓的岁月静好,只不过有人在默默替你负重前行。