--- 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`中,下次连接时无需再次确认。
## 公钥登陆 原理:用户将自己的`公钥`保存在远程主机上,登录时,远程主机向用户发送一段随机码,用户用自己的`私钥`签名后,在发回远程主机,远程主机用实现保存的`公钥`进行验证,如果成功,表示用户的身份正确,无需输入密码 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命令去杀掉进程。