简介

ssh是一种用于远程登录的一种协议。通过它我们可以进行远程操作来管理远程主机以及传输文件,同时利用ssh隧道我们也可以突破防火墙。


口令登录

$ ssh [-p port] username@hostname

口令登录的原理

  • localhost(本地主机)发送一个登录请求;
  • remotehost(远程主机)收到请求后会发送自己的public key(公钥)给localhost;
  • localhost用remotehost的public key加密自己登录的password(密码)并且发送回去;
  • remotehost用自己的private key(私钥)解开发送的password并且核对是否正确,如果正确就允许远程登录。公钥和私钥的详情可以参考阮一峰的数字证书和数字签名;
$ ssh alps@192.168.0.105
The authenticity of host '192.168.0.105 (192.168.0.105)' can't be established.
ECDSA key fingerprint is SHA256:O4DYkK+I3LBeOFsEvb06y+YcSb1wcZi5wXuizETBtg4.
Are you sure you want to continue connecting (yes/no)?yes 

这是我们第一次ssh登录的情况,上面提示的意思是只知道remotehost的public key的fingerprint(指纹),是否继续。我们输入yes。

Warning: Permanently added '192.168.0.105' (ECDSA) to the list of known hosts.
alps@192.168.0.105's password:
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-29-generic x86_64)* Documentation:  https://help.ubuntu.com* Management:     https://landscape.canonical.com* Support:        https://ubuntu.com/advantage147 packages can be updated.
52 updates are security updates.Last login: Tue Jun 21 08:37:04 2016 from 192.168.0.103

可以看到我们输入password后登录成功。根据提示可以看到public key已经被添加到列表,这个列表就放在我们本地的~/.ssh/know_hosts。

$ cat ~/.ssh/known_hosts
|1|4++LGU0cmvp8/jBQgC3wzVyaAGQ=|0ZjnEkO/yvmznPSAjJ8pnHDc8tw= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBIYW9MlqOuRMr9JYiWlooF9JFC8jZ9b6YbcabG+8wWybMup36OGSGvcyGq4egAz/p6W3k1oHp1QtKYShJmAKvl8=

这样代表我们就信任这个远程主机了,以后登录我们只要输入password,不要输入yes了。每次都要输入password我们还是觉得很麻烦,这个时候我们可以使用公钥加密。


公钥登录

$ ssh-keygen
$ ssh-copy-id username@hostname

公钥加密的原理

  • localhost通过ssh-copy-id命令将自己的public key放到remotehost的~/.ssh/authorized_keys;
  • remotehost收到登录请求后向localhost发送一个随机字符串;
  • localhost用自己的private key将随机字符串加密后发回给remotehost;
  • remotehost收到回信后用localhost的public key能够解开这个字符串那么用户身份就确认成功。公钥和私钥的详情可以参考阮一峰的数字证书和数字签名;
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/alps/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/alps/.ssh/id_rsa.
Your public key has been saved in /home/alps/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:LUsZyEqSOc9MpPJkJil9myW/P5QudYghtXYKNsL17jM alps@localhost
The key's randomart image is:
+---[RSA 2048]----+
|    .            |
| o =....         |
|=.@.=o+..        |
|.BoX=B= .+       |
|  .oB*.=So.      |
|      +o=o.      |
|     ..+..       |
|      E.o        |
|       +..       |
+----[SHA256]-----+

ssh-keygen会为我们在~/.ssh下面生成一对public key和private key,分别保存到~/.ssh/id_rsa.pub和~/.ssh/id_rsa。输入命令后一路回车,私钥设置口令(passphrase)如果你可以自主选择设置。然后我们再输入ssh-copy-id将公钥传递到remotehost上面。

$ ssh-copy-id alps@192.168.0.105
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
alps@192.168.0.105's password: Number of key(s) added: 1Now try logging into the machine, with:   "ssh 'alps@192.168.0.105'"
and check to make sure that only the key(s) you wanted were added.

以后我们ssh登录不再需要输入密码了。

crawler@LocalHost:~$ ssh alps@192.168.0.105
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-29-generic x86_64)* Documentation:  https://help.ubuntu.com* Management:     https://landscape.canonical.com* Support:        https://ubuntu.com/advantage147 packages can be updated.
52 updates are security updates.Last login: Tue Aug 16 15:02:05 2016 from 192.168.0.103
alps@RemoteHost:~$ 

实际上ssh-copy-id就是将本地主机的public key复制到远程主机的~/.ssh/authorized_keys里面,这个过程就是下面这一条命令的执行过程。

$ ssh alps@192.168.0.105 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

通过ssh远程传送文件

ex1
$ cd && tar czv src | ssh alps@192.168.0.105 'tar xz'
src/

复制本地~/src/目录下面的所有文件到远程主机的~/src/目录。

ex2
$ ssh alps@192.168.0.105 'tar cz src' | tar xzv
src/

复制远程主机~/src/目录下面的所有文件到本地的当前目录。

ex3
$ ssh alps@192.168.0.105 'ps aux' | grep apache2
root      6596  0.0  0.1  71568  4588 ?        Ss   16:09   0:00 /usr/sbin/apache2 -k start
www-data  6599  0.0  0.1 360724  5980 ?        Sl   16:09   0:00 /usr/sbin/apache2 -k start
www-data  6600  0.0  0.1 360724  5980 ?        Sl   16:09   0:00 /usr/sbin/apache2 -k start

查看远程主机是否运行进程apache2。


ssh隧道(端口转发)

ex1
$ ssh -D 1080 username@hostname

这条命令可以结合Shadowsocks翻墙来理解,我们将经由本地1080端口的数据全部转发到Shadowsocks远程主机,我们如果用Chrome上网的话可以通过SwitchProxy将浏览器的请求转发到本地1080端口,然后通过本地的Shadowsocks-QT5进行代理。

ex2

现在学校机房禁止我们内网主机连接到外网的213.83.72.215进行ftp,但是我们可以借助外网的93.184.216.34,它可以和213.83.72.215:21进行ftp。这个时候我们可以在192.168.0.103和93.184.216.34之间建立一条双向ssh隧道。我们在本地192.168.0.103执行下面这条命令。

$ ssh -N -f -L 2121:213.83.72.215:21 93.184.216.34

-N和-f参数的作用是使命令在后台运行,-L参数一共接受三个值,分别是”本地端口:目标主机:目标主机端口”,它们之间用冒号分隔。这条命令的意思是将通过本地主机2121端口的数据全部通过ssh隧道传送到隧道另外一边的93.184.216.34,通过93.184.216.34我们来连接213.83.72.215:21的端口。

$ ftp 127.0.0.1 2121

在到本地主机执行ftp命令,通过2121端口的数据通过ssh隧道间接传送到192.168.0.100:21了。

ex3

假设现在192.168.0.103是台内网机器,它可以访问外网的93.184.216.34但是外网的机器却不能访问它。现在我们想让192.168.0.103访问无法直接访问的213.83.72.215进行ftp。解决方法是,既然内网的192.168.0.103能够访问93.184.216.34,那么我们就建立这样一条双向ssh隧道,然后我们192.168.0.103使用这条ssh隧道就可以了。
我们首先在93.184.216.34上执行下面命令.

$ ssh -N -f -R 2121:213.83.72.215:21 192.168.0.103

-R参数也是接受三个值,分别是”远程主机端口:目标主机:目标主机端口”。这条命令的意思是让192.168.0.103监听2121端口,然后将所有数据通过93.184.216.34转发到213.83.72.215。对于93.184.216.34来说192.168.0.103是远程主机,所以这也就做远程主机端口转发。

$ ftp localhost:2121

最后我们在192.168.0.103通过ftp连接本地的2121端口就成功ftp到了213.83.72.215:21。
还有一种情况就是我们只有两台机器,93.184.216.34和192.168.0.103,我们将上面这条命令改为。

$ ssh -N -f -R 2121:127.0.0.1:21 192.168.0.103

这个时候就变为在我们在93.184.216.34和192.168.0.103建立一条ssh隧道,然后通过这条隧道在外网93.184.216.34访问192.168.0.103的21端口。


数字签名和数字证书

Internet通信过程中,我们每一个人都有public key(公钥)和private key(私钥),可以在~/.ssh下面查看,其中每个人的public key在Internet中都是公开的,private key只有我们自己知道。为了保证让接收方确认发信方的身份,由certificate authority(证书机构)诞生了digital signature(数字签名)和digital certificate(数字证书)。

我们首先来看一下只有数字签名而没有数字证书的情况:当A向B发送信息的时候A会先用B的public key加密,这份信息只能由B的private key解开。当B给A回信息的时候,首先调用hash函数生成信息的digest(摘要),然后A用自己的private key对digest加密就生成了digital signature。A收到这份回信后,首先会用B的public key对digital signature解密得到digest,由此证明这封信确实是由B发送的。同时对信件本身使用hash函数也会生成一个digest,如果这个digest和前面那个digest相等,可以证明信息确实没有被修改过。但是这也造成一个问题,如果C将A手中的B的public key替换为自己C的public key,但是A还是会以为自己手中的public key还是B的,这个时候如果C向A发送一份信息,A会以为是B发送的。这个时候我们要做的就是保证public key的身份。

为了避免这种情况,certificate authority就用自己的private key对B的public key和相关信息加密生成digital certificate。B以后向A发送信息,就只要搭上digital signature和digital certificate就可以放心了。A收到B的回信后,用CA的public key得到B的public key,然后和上面一样利用这个public key解密digital signature的得到digest来判断信息是不是由A发送的,因为digital signature就是利用public key加密的。

digital certificate的一个实例就是https协议,首先client向server发送加密request,server向client响应一个自己private key加密的网页和digital certificate。client(browser)的certificate manager(数字证书管理器)有一份合法证书颁布机构的列表,client会根据这份列表的public key解密digital certificate。如果列表记录的网址和你现在访问的网址不一致就会发出一个warning来告诉你这份digital certificate被别人冒用了。还有一种可能就是这份证书没有记载到合法证书颁布机构列表,也会发出另外一种warning。


参考链接

https://chamibuddhika.wordpress.com/2012/03/21/ssh-tunnelling-explained/
http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html
http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.html

ssh和scp(未完)相关推荐

  1. 开源任务调度平台dolphinscheduler部署及使用指南(未完)

    目录 一 dolphinsheduler调研 支持的任务类型: 1.1 dolphinsheduler集群部署 1.1.1 需要的环境 1.1.2 dolphinsheduler安装 可能的报错:zk ...

  2. Linux常用传输协议ssh和scp tcp udp http https ssh

    Linux常用传输协议ssh和scp   tcp udp http https ssh 1,SSH ssh介绍 SSH为Secure Shell的缩写,由 IETF 的网络工作小组(Network W ...

  3. linux无密码ssh,scp,rsync

    维护中,常常遇到需要ssh,scp,或者rsync,每次都需要输入密码,非常麻烦.特别是在自动化shell脚本中,涉及到scp或者rsync的操作时,就需要无密码执行命令.以下来看一下,如何无密码ss ...

  4. Centos下关于ssh、scp与rsync设置与应用

    最近应公司要求,需要对文件数据进行远程传输与备份操作,特此写了一篇文章记录下了关于ssh.scp以及rsync的应用配置全过程,可能过程太过罗嗦,但主要就是想在不遗漏每个过程的情况下对此进行阐述,希望 ...

  5. Linux下简单创建ThinkPHP 6.0的网站 - 简单前后端 (未完待续)

    步骤 ssh user@ip-of-linux cd /var/www/ mkdir xiazai.rudon.cn cd xiazai.rudon.cn/ composer create-proje ...

  6. 在win10上使用SSH和SCP

    前言 最近写了一个微服务项目,本地调试很麻烦,每次修改一部分都得把代码提交到仓库,再用Jenkins编译.整个流程感觉有点慢,想着改完代码执行一个脚本,直接编译并且将jar包发布到测试环境上.幸运的是 ...

  7. 《今日简史》读书笔记(未完待续)

    <今日简史>读书笔记(未完待续) 这本书是尤瓦尔·赫拉利的简史三部曲的最后一本,前2本书是<未来简史>和<人类简史>.根据豆瓣上网友的评价,这本书是尤瓦尔·赫拉利写 ...

  8. [每周软件]:Cucumber:未完待续的原因

    2019独角兽企业重金招聘Python工程师标准>>> 本来这个计划是一周的 剩下未完的三篇才是核心 两篇源码分析,一篇总结+BDD分析,但是因为目前水平有限 源码追了一部分之后追丢 ...

  9. ExtJs之Ext.grid.GridPanel(部分未完)

    今天在家休息,年假不用就作费啊. 看了几部香港老电影,陪爸爸看了勇士占奇才, 然后,测试了一下EXTJS未完的内容, 在京东上订了七本历史普及书,近两百块..:) 搞定. ? 1 2 3 4 5 6 ...

最新文章

  1. 艰难就业季,2020 AI算法岗春招汇总 面经大全来了!!!
  2. Javascript图像处理之将彩色图转换成灰度图
  3. 软工第二次结对作业---部门录取方案实现
  4. java baas_调试后台Baas(Java):调试用户自己的java代码
  5. Windows Server Core Command (管理服务器核心的具体操作命令)
  6. 利用HttpWebRequest和HttpWebResponse做黑客注射工具
  7. db2 联合数据源 mysql_详解DB2中联合SQL Server数据
  8. DotNetTextBox V3.0 所见即所得编辑器控件Ver3.2.5 Free(免费版)
  9. zookeeper管理mysql_Mysql系列九:使用zookeeper管理远程Mycat配置文件、Mycat监控、Mycat数据迁移(扩容)...
  10. 全国地图poi数据下载
  11. CVTE(商务类)一面二面记录
  12. setting配置文件详解
  13. 此页上的ActiveX控件和本页上的其他部分的交互可能不安全的解决办法
  14. 网页设计1-1李清照人物简介
  15. 什么是信念?信任?信仰?
  16. 相机投影变换(位姿)
  17. debian10 buster 在thinkpad T470P 上安装指纹驱动 138a:0097 Validity Sensors
  18. 问题 G(1203): 【基础算法】0/1字符串问题
  19. 高频前端面试问题及答案整理
  20. 写了个移动端可滑动(惯性滑动回弹)Vue导航栏组件 ly-tab

热门文章

  1. 2021年软件测试工具趋势
  2. Win7/Win10安装AutoCAD+CASS
  3. 20多岁跳槽去国企,是自甘堕落还是享受生活?
  4. mysql(通用语法)
  5. 四川省赛 SCU - 4438
  6. MATLAB 制作一个圆的模板
  7. 数学建模之长江水质的评价与预测部分代码---编程部分
  8. ZYNQ有两个CPU?(一)——AMP搭建
  9. 用blender为模型贴图并在gazebo中显示
  10. c语言足球赛设计报告,c语言实现足球比赛积分统计系统