每次都输入密码会很烦,而且也不安全,同时还有其他一些潜在的风险,所以SSH也提供基于密钥的认证机制,你必须为自己创建一对密钥,并把公钥放在 需要访问的服务器上。客户端软件会向服务器发出请求,请求用你的私匙进行安全验证。服务器收到请求之后,先在你在该服务器的用户根目录下寻找你的公钥,然 后把它和你发送过来的公钥进行比较。如果两个密钥一致,服务器就用公有密钥加密“质询”(challenge)并把它发送给客户端软件。从而避免被“中间 人”攻击。

由于之前所说的原因,会出现一种蛋疼的情况,有些公司还喜欢使用SSH2版本的SSH服务,SSH2和OpenSSH的加密算法是完全不一样的,他们所使用的的密钥对也不兼容,所以会出现下面4种组合
1. OpenSSH客户端对OpenSSH服务器
2. SSH2客户端对SSH2服务器
3. OpenSSH客户端对SSH2服务器
4. SSH2客户端对OpenSSH服务器
假设客户端C试图使用用户tester登录服务器S,我们来看看各种组合下如何使用密钥登录

1. OpenSSH客户端对OpenSSH服务器,这是最简单和最常见的情况
首先在C上操作

ssh-keygen -t rsa

生成的私钥保存在~/.ssh/id_rsa,注意私钥一定要是这个名字,除非你更改C的ssh客户端配置,然后将公钥id_rsa.pub上传到S上去

#这里S_IP是服务器的真实IP,并假定用户tester的主目录是/home/tester scp ~/.ssh/id_rsa.pub tester@S_IP:/home/tester/.ssh/

然后在服务器S上做如下操作

cd /home/tester/.ssh cat id_rsa.pub >> authorized_keys

退出服务器S,然后从C上重新登录一下

ssh tester@S_IP

不出意外,你再也不用输入密码了。

2. SSH2客户端对SSH2服务器
这种情况也很简单,因为SSH2版本的ssh服务已经有了个新的工具ssh-keygen2。
首先在C上操作

ssh-keygen2 -t rsa

注意,这将会在C上当前用户的目录的这个位置~/.ssh2/生成一对密钥id_rsa_2048_a和id_rsa_2048_a.pub
你必须在~/.ssh2/目录下建立一个文件identification,并通过它来指定私钥

cd ~/.ssh2/ vi identification #输入如下内容 IdKey id_rsa_2048_a #保存修改

然后将公钥id_rsa_2048_a.pub传到服务器S上去

#这里S_IP是服务器的真实IP,并假定用户tester的主目录是/home/tester scp ~/.ssh2/id_rsa_2048_a.pub tester@S_IP:/home/tester/.ssh2/

然后在服务器S上做如下操作

cd /home/tester/.ssh2 vi authorization #在里面新增一行 Key id_rsa_2048_a.pub #保存修改

退出服务器S,然后从C上重新登录一下

ssh tester@S_IP

不出意外,这能够工作了。

3. OpenSSH客户端对SSH2服务器
这种情况是最复杂的一种,网络上很多的免密码登录SSH的文章都没有涉及到这种,下面具体介绍一下应该如何配置
首先在C上操作

ssh-keygen -t rsa

生成的私钥保存在~/.ssh/id_rsa,注意私钥一定要是这个名字,除非你更改C的ssh客户端配置,然后你需要做一件事情,就是将公钥转换成为SSH2所兼容的模式,使用以下的指令

cd ~/.ssh/ ssh-keygen -e -f id_rsa.pub > id_rsa_2.pub

然后将公钥id_rsa_2.pub上传到S上去

#这里S_IP是服务器的真实IP,并假定用户tester的主目录是/home/tester scp ~/.ssh2/id_rsa_2.pub tester@S_IP:/home/tester/.ssh2/

然后在服务器S上做如下操作

cd /home/tester/.ssh2 vi authorization #在里面新增一行 Key id_rsa_2.pub #保存修改

退出服务器S,然后从C上重新登录一下

ssh tester@S_IP

不出意外,这能够工作了。

4. SSH2客户端对OpenSSH服务器
这种情况是最蛋疼的,应该非常少见吧?这意味你将用一台商业授权的服务器去管理一台开源的服务器?希望你的工作不用这么纠结,虽然这种情况的配置是非常简单的,基本和1一致,因为SSH2原生也支持SSH1,所以就请大家参见1的配置了。

如果了解完了上面所说的一切,包括引用链接,你就完全够将SSH应用到工作的各个方面的,下面还会稍微透露一下,平时可能需要了解到的一些秘籍

1.SSH2密钥和OpenSSH密钥的相互转换。

#OpenSSH转SSH2 ssh-keygen -e -f OpenSSH.pub > SSH2.pub #SSH2转OpenSSH2 ssh-keygen -i -f SSH2.pub > SSH2.pub

2.平时如果我们在Windows环境下,通常会使用SecureCRT,XShell以及Putty等优秀的SSH客户端软件,它们可以让SSH 的工作变得更轻松,但如果在Mac或者Linux环境下,命令行的SSH操作则更自然,那么你知道在命令行下的SSH如何使用代理嘛,当需要的时候?
下面以OpenSSH客户端为例,假设有两个服务器S1和S2,需要通过一个代理服务器P1的80端口才能够连接。

vi ~/.ssh/config #修改如下内容 Host S1_IP S2_IP     ProxyCommand nc -X connect -x P1:80 %h %p     ServerAliveInterval 60此外,在使用scp都时候还有可能因为ssh和ssh2的问题出现如下错误:
"scp - FATAL: Executing ssh1 in compatibility mode failed (check that scp1 is in your PATH)."Quote 1:This problem is often quite perplexing, since a ssh -V trace may show that you're using SSH-2 - so what is a message about "ssh1 compatibility mode " doing in there?What's happening is this:1. On the OpenSSH client, you run say, scp foo server:bar2. scp runs ssh in a subprocess to connnect to the server, and run the remote command scp -t bar. This is intend to start an instance of the scp program on the server, and the two scp's will cooperate byspeaking over the SSH connection, to retrieve the file.3. ssh connects to the server (using either protocol 1 or 2, it doesn't matter), and runs the remote scpcommand. However, the "scp" that gets run on the server is the SSH2 scp program (scp2), not the OpenSSH one. The crux of the problem is: besides the name, these two scp's have exactly nothing in common. scp2 cannot speak the file-transfer protocol that OpenSSH scp does. However, scp2 recognizesfrom the "-t" flag what's expected, and tries exec scp1 to service the connection (this is the extentof SSH2's SSH-1 compatibility; where OpenSSH has code for both protocols in a single set of programs,SSH2 expects to execute programs from a parallel SSH1 installation). It fails (presumably becauseyou don't have SSH1 installed), and reports the problem.The solution is to install either the OpenSSH or SSH1 version of scp on the server under the name "scp1",somewhere in the sshd2's PATH.Quote 2:OpenSSH implements "scp" via RCP over an SSH channel.ssh.com implement "scp" via FTP over an SSH channel.OpenSSH's server has both implementations, but it's client only usesthe RCP version.So if the client is OpenSSH, use "sftp" to get to an ssh.com server.
上述情况发生的场景一般是openssh作为client,要连接一个ssh2都server,
如果上述两种解决方案都觉得麻烦的话,可以通过tar来绕过这个问题:
scp2() {tar cf - -C $(dirname $1) $(basename $1) | ssh user_name@server_ip -- "tar xmf - -C $2" }scp2r () {ssh user_name@server_ip -- "tar cf - -C $(dirname $1) $(basename $1)" | tar xmf - -C ${2:-.}; }

ssh 和 ssh2 之间的 转换相关推荐

  1. 各种格式SSH 公钥和私钥之间的转换

    前天给客户安装环境,没想到在生成SSH密钥上耽误很多时间. 先从一个实验开始吧. 先生成密钥对,公钥为/tmp/key.pub,私钥为/tmp/key.命令行选项中 -t表示key type,-b表示 ...

  2. 时间不同单位之间的转换

    在观察仿真波形的时候,经常会出现微妙,毫秒,皮秒之间的转换,出现过错误,每次记不清楚的时候还要重新查资料,现总结如下. 秒(second)是国际单位制中时间的基本单位,符号是s.有时也会借用英文缩写标 ...

  3. java类型转换面试题_JavaSE:数据类型之间的转换(附常见面试题)

    数据类型之间的转换 分为以下几种情况: 1)低级到高级的自动类型转换: 2)高级到低级的强制类型转换(会导致溢出或丢失精度): 3)基本类型向类类型转换: 4)基本类型向字符串的转换: 5)类类型向字 ...

  4. java 嵌套对象转xml_Gson对Java嵌套对象和JSON字符串之间的转换 | 学步园

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,具有良好的跨平台特性.近几年来已经和XML一样成为C/S架构中广泛采用的数据格式.有关JSON的更多知识, ...

  5. ROS与PCL中点云数据之间的转换

    此为文章初稿还没有完善,应该还有一些问题,等待后面有时间再继续更新,原创文章,未经允许,请勿转载!!! 首先介绍在PCL库中经常使用的两种点云之间的转换,这里将根据工程中的经验,从代码层面举例分析如何 ...

  6. 日期与unix时间戳之间的转换C++实现

    之前在https://blog.csdn.net/fengbingchun/article/details/107023645 中介绍过gmtime和localtime的区别,这里介绍下日期与Unix ...

  7. java怎么改变数据类型_java数据类型之间的转换,是怎么回事啊? - 收获啦

    1.数据类型的分类 2.比较数据类型之间的字节大小 1字节=8位 . 3.转换中的知识点 *java中整数类型默认的int类型:小数类型默认的double: *String的字符串转化为char类型时 ...

  8. java字符串与基本数据_java --字符串与基本数据类型之间的转换

    public static void main(String[] args) { /** * 1.字符串与基本数据类型之间的转换 * 字符串-->基本数据类型,调用xx.parseXxx(Str ...

  9. csv文件与字典,列表等之间的转换小结【Python】

    本文针对前面利用Python 所做的一次数据匹配实验,整理了其中的一些对于csv文件的读写操作和常用的Python'数据结构'(如字典和列表)之间的转换 (Python Version 2.7) cs ...

最新文章

  1. 树莓派Android Things物联网开发:创建一个Things项目
  2. linux ssh Unused,ssh免密码登录 - leopardlinux的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. ngx_lua_API 指令详解(一)ngx.timer.at 指令
  4. 什么样 信号_深圳停止商务公寓用地审批释放着什么样的信号,会引起房价下跌吗...
  5. Ubuntu 下一个 vim 建立python 周围环境 构造
  6. 解决Can't connect to MySQL server on 'localhost' (10048)
  7. 利用Linq在RadCombobox中输出分类后的数据
  8. RTCPeerConnection.onicecandidate属性
  9. n条直线相交最多有几个邻补角_【初中数学】102条做初中几何辅导线的规律
  10. Python判断一个集合族是否为σ代数
  11. SpringCloud 实战:禁止直接访问后端服务
  12. vue slot的使用介绍
  13. 安装dhcp服务方法(系统为linux 7.0)
  14. 理解委托的两类必要方法
  15. wordpress不登陆后台禁用插件
  16. 配置docker加速器
  17. linux oracle 强制覆盖_赤兔Oracle数据库恢复软件下载-赤兔Oracle数据库恢复软件v11.6免费版...
  18. CentOs网络管理:ifconfig家族,iproute家族及配置文件
  19. Java程序的编辑、编译、运行
  20. 使用Latex画三线表时出现线条宽度不一致的情况

热门文章

  1. 一个程序员可以差到什么程度?真诚地感激曾经没有当面嘲笑我的每一个同事
  2. 经久不衰的远古时代产物——WebService。
  3. C++实现十进制与十六进制转化
  4. 集成学习boosting算法:AdaboostGBDTXgboostLightGBMCatBoost
  5. Eclipse Validating缓慢的优化
  6. android应用 程序结构,Android应用结构
  7. 工行网银 请选择证书列表为空的解决办法
  8. vue单页面应用和多页面应用
  9. 常见的编程语言有哪些?
  10. Qt QSS基本属性设置