创建博客

This commit is contained in:
lemonchann
2019-11-17 01:12:14 +08:00
commit 6f0c102626
133 changed files with 20640 additions and 0 deletions

126
_posts/2014-06-10-ssh.md Normal file
View File

@@ -0,0 +1,126 @@
---
layout: post
title: SSH
tags: Linux 命令 SSH
categories: Linux
---
* TOC
{:toc}
## 登陆
**`-p`指定主机的端口**
`$ ssh -p port user@host`
**默认端口为22**
`$ ssh user@host`
**默认使用本机用户名**
`$ ssh host`
## 过程
1. 远程主机接收到用户的登陆请求,把自己的公钥发给用户
2. 用户使用这个公钥,将密码加密后发回来
3. 远程主机用自己的私钥,解密登陆密码,如果密码正确,就同意用户登陆
>此处如果有攻击者截取了用户请求,再将自己的公钥发送给用户,然后就可以用自己的私钥解密出用户的私密信息,这就是`中间人攻击`
>
>应对的方法用户首次连接远程主机时远程主机将发送一段128位长的公钥指纹用户需要自行与远程主机网站发布的公钥指纹进行对比以判断真伪当用户信任了此公钥后它将被保存在`$HOME/.ssh/known_hosts`中,下次连接时无需再次确认。
<br>
## 公钥登陆
原理:用户将自己的`公钥`保存在远程主机上,登录时,远程主机向用户发送一段随机码,用户用自己的`私钥`签名后,在发回远程主机,远程主机用实现保存的`公钥`进行验证,如果成功,表示用户的身份正确,无需输入密码
1. 用户生成一对自己的密钥
2. 将用户的`公钥`内容添加到 `$HOME/.ssh/authorized_keys`中(可以用`ssh-copy-id user@host`进行该操作)
3. 重启ssh服务 `/etc/init.d/ssh restart`
>公钥登陆相关配置 /etc/ssh/sshd_config
>
>RSAAuthentication yes
>
>PubkeyAuthentication yes
>
>AuthorizedKeysFile .ssh/authorized_keys
## 远程操作
1. 直接操作 `$ ssh user@host command`
2. 用户和远程主机之间,建立命令和数据的传输通道
>将当前目录下的src文件复制到远程主机的$HOME目录
>
>`$ tar czv src | ssh user@host "tar xz"`
>
>将远程主机$HOME目录下面的src文件复制到用户的当前目录
>
>`$ ssh user@host "tar cz src" | tar xzv`
## 绑定本地端口
`ssh -D port user@host`
`-D` 指定与远程host建立隧道的本地端口
## 本地端口转发
假定`localhost`是本地主机,`remotehost`是远程主机,这两台主机之间无法连通。但是,另外还有一台`boardhost`,可以同时与前面两台主机互连。
在本机键入如下命令
`$ ssh -L localPort:remotehost:remotePort boardhost`
`L`参数一共接受三个值,分别是"`本地端口:目标主机:目标主机端口`"
该命令的意思是指定SSH绑定本地端口`localPort`,然后指定`boardhost`将所有的数据,转发到目标主机`remotehost``remotePort`端口
>remotehost是boardhost 的相对地址(或绝对地址)因为数据其实是由boardhost 传输到remotehost中的与localhost无关
这样一来`localhost``remotehost`之间将形成私密隧道,访问`localPort`就等于访问`remotePort`
## 远程端口转发
假定`hostA`是本地主机,`hostB`是远程主机,这两台主机之间无法连通,而且,`boardhost`是一台内网主机,即`boardhost`可以访问`hostA`,但是`hostA`无法访问`boardhost`
`boardhost`键入如下命令
`$ ssh -R portA:hostB:portB hostA`
`R`参数也是接受三个值,分别是"`远程主机端口:目标主机:目标主机端口`"。这条命令的意思,就是让`hostA`监听它自己的`portA`端口,然后将所有数据经由`boardhost`,转发到`hostB``portB`端口。
`boardhost`来说`hostA`是远程机器,在`boardhost`机器上指定`hostA`监听某个端口,称为远程端口转发
>远程端口转发的前提条件是,`hostA``boardhost`两台主机都有sshd和ssh客户端其原理就是一开始由`hostA`充当`Server``boardhost`充当`Client``boardhost`发起请求建立一个连接;连接建立完成后,`hostA`就可以使用这个连接将充当`Clinet`,将数据转发至`boardhost`充当的`Server``boardhost`接收到数据后又需要充当`Client`将数据转发到`hostB`
## 其他参数
`N`参数表示只连接远程主机不打开远程shell
`T`参数表示不为这个连接分配TTY。
这个两个参数可以放在一起用代表这个SSH连接只用来传数据不执行远程操作。
`$ ssh -NT -D port user@host`
`f`参数表示SSH连接成功后转入后台运行。这样一来就可以在不中断SSH连接的情况下在本地shell中执行其他操作。
`$ ssh -f -D port user@host`
要关闭这个后台连接就只有用kill命令去杀掉进程。