Linux下两台机器scp无需密码传输

原文链接:http://www.gaoxuan1989.com/2018/04/13/scp_file_between_two_linux_server/

前言

在工作中,经常需要发布代码到服务器,之前使用rz的方式上传zip的压缩包,可还是有些不智能,于是想到怎么通过scp的方式上传到服务器。

于是我就想到使用git bash的scp方法来操作,使用过scp的都知道需要指定远端服务器的帐号并手动输入密码,下面就讲一下如何避免每次都需要输入密码这个操作。

建立ssh的信任关系

在这里先介绍两个概念:SSH公钥(~/.ssh/id_rsa.pub)和公钥授权文件(~/.ssh/authorized_keys),这两个文件的作用具体可以参考ssh的man手册:

 ~/.ssh/id_rsa.pub
         Contains the public key for authentication.  These files are not sensitive and can (but need not) be readable by anyone.

 ~/.ssh/authorized_keys
         Lists the public keys (DSA/ECDSA/RSA) that can be used for logging in as this user.  The format of this file is described in the sshd(8) manual page.  This file is not highly sensitive, but the recommended permissions are read/write for the user, and not accessible by others.

从描述中我们可以知道,~/.ssh/id_rsa.pub文件中包含了认证的公钥信息,而且该文件可以被任何人读取;而~/.ssh/authorized_keys文件中则列举了登录用户的公钥信息(换句话说就是使用这些公钥信息可以登录当前设备),而为了安全考虑,该文件一般建议只有本用户可以有读写权限(这条信息很关键,后面会讲)。

公钥和私钥

提到公钥对应的就会有私钥,在谈这两个概念之前我们先了解另外一组概念:加密认证

  • 加密是对数据进行处理,添加保护信息,如果非法用户得到被加密过的数据,也无法获取到原始的有效数据内容,所以加密的重点在于数据的安全性。
  • 认证是对数据进行处理,添加鉴权信息,如果在传输的过程中被非法篡改,接收方就会校验失败并丢弃该非法数据,所以认证的重点在于数据的合法性。

上面是从业务概念来上描述了加密和认证的区别,但是从具体技术实现上,认证使用的是加密中的非对称加密算法来实现鉴权和认证的操作。

  • 对称加密算法在加密和解密时使用的是同一个秘钥;
  • 非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。

下面就分别描述一下,采用非对称算法(即使用公钥和私钥)的加密和认证各自的过程。

基于公钥和私钥的加密过程

有两个用户Alice和Bob,Alice想把一段数据加密后发送给Bob(注意这里强调的是数据的安全性),那么如何保证除了Bob之外的人即使窃取了数据也无法解密得到原始的数据?基于公钥和私钥的加密可以完成这个需求,具体流程如下:

  1. Bob将他的公钥发送给Alice
  2. Alice用Bob的公钥加密需要传输的数据然后发送给Bob
  3. Bob用他的私钥解密Alice的消息

基于公钥和私钥的认证过程

还是Alice和Bob,Alice想把一段数据发送给Bob(注意这里并不强调数据的安全性),当Bob收到数据时如何判断该数据确实是Alic发送的且传输过程中没有被篡改?基于公钥和私钥的认证可以完成这个需求,具体流程如下:

  1. Alice用她的私钥对数据加密(或者对于数据的哈希值进行加密作为签名)
  2. Alice将加密后的数据(或者明文数据+签名)发送给Bob
  3. Bob用Alice的公钥解密数据(或校验签名),如果解密(校验)成功则可以保证数据的发送方肯定是Alice

基于公钥和私钥的信任关系

了解了公钥/私钥以及加密/认证这些概念后,我们就可以在scp中使用公钥/私钥来建立一个信任关系,从而在数据传输时完成自动认证而无需输入密码。

  1. User在A主机将SCP请求使用自己的私钥进行加密,然后传输给B主机
  2. B主机在收到SCP请求时,使用User的公钥进行解密
  3. 如果解密成功,则表示该请求确实是User发送的请求,则允许操作;如果解密失败,则表示该请求无效,直接丢弃

所以这里的需要做的就是:

  • User在A主机上需要创建一个公私钥对
  • 在B主机上,将User在A主机的公钥加入到ssh的信任公钥列表中(即公钥授权文件)

创建公私钥对

在Linux上使用ssh-keygen工具来生成公私钥对,在man手册中关于ssh-keygen工具的说明如下:

ssh-keygen : authentication key generation, management and conversion
 -t    type
     Specifies the type    of key to create.  The possible    values are 'rsa1' for protocol version 1 and 'dsa', 'ecdsa', 'ed25519', or 'rsa' for protocol version 2.

在上面提到了ssh-keygen支持rsa1、dsa、ecdsa、ed25519和rsa这几种非对称加密算法,其中最常用的就是RSA和DSA,比如使用RSA算法来生成公私钥对的过程如下:

nfer@nfer-VirtualBox:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/nfer/.ssh/id_rsa): 
Created directory '/home/nfer/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/nfer/.ssh/id_rsa.
Your public key has been saved in /home/nfer/.ssh/id_rsa.pub.
The key fingerprint is:
16:77:45:71:31:7c:67:4f:91:09:07:74:4d:30:83:48 nfer@nfer-VirtualBox
The key's randomart image is:
+--[ RSA 2048]----+
|         .E..*@XO|
|          . ..oBB|
|        . . .  o+|
|         o .    .|
|        S        |
|       .         |
|                 |
|                 |
|                 |
+-----------------+
nfer@nfer-VirtualBox:~$

注意上面有三处需要输入信息,分别是:

  1. 存储公私钥的文件夹位置,如果不输入,则默认为~/.ssh/,文件名则默认是id_rsa和id_rsa.pub
  2. 使用该公私钥时是否需要密码,如果不输入则表示不需要密码
  3. 再次确认是否需要密码

将User在A主机的公钥加入到ssh的信任公钥列表中

将刚才创建的~/.ssh/id_rsa.pub文件中的内容拷贝添加到B主机上的~/.ssh/authorized_keys文件中(如果没有则创建一个),这个时候就建立了一条A-->B的信任关系。注意这个信任关系是有方向性的,如果要建立从B-->A的信任关系,则操作步骤和上面的类似,只不过要反过来。

:上面讲过,.ssh文件建议只给只有本用户可以有读写权限,所以需要执行权限设置的命令,否则会不成功:

 chmod -R 700 ~/.ssh/
 chmod 600 ~/.ssh/authorized_keys

建立好信任关系后,这个时候使用任何ssh相关的工具则都无需输入远端的登陆密码(如果在创建公私钥对时输入了密码,那么这个时候还需要输入这个密码才能使用公私钥对)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 公钥密码系统及RSA公钥算法 本文简单介绍了公开密钥密码系统的思想和特点,并具体介绍了RSA算法的理论基础,工作原...
    火狼o阅读 4,272评论 2 15
  • 在现代密码体制中有保密和认证两种机制,一般发送者和接收者拥有自己的公钥和密钥,公钥是公开的,密钥不公开。 保密机制...
    F麦子阅读 1,052评论 0 0
  • 很多运营同学都会觉得做运营是一件很苦的事情,重复地做着别人眼里没有技术含量的事儿。但运营真的就只是打杂的吗?本文中...
    诸葛io阅读 432评论 0 3
  • 北大西门,是一个地名,也是北京大学西侧的出入口,在上个世纪九十年代还比较偏僻,属于海淀区,北大西门附近没什么景点,...
    f5ea170be7e9阅读 795评论 0 0
  • 想要为你写一首歌作一曲天荒地老 上一章:一日一话,藏尽对你的思念(一) 下一章:一日一话,藏尽对你的思念(三)
    情书短句阅读 245评论 0 1