本文章主要描述的SSH常用操作。

登陆

-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将所有的数据,转发到目标主机remotehostremotePort端口

remotehost是boardhost 的相对地址(或绝对地址),因为数据其实是由boardhost 传输到remotehost中的,与localhost无关

这样一来localhostremotehost之间将形成私密隧道,访问localPort就等于访问remotePort

远程端口转发

假定hostA是本地主机,hostB是远程主机,这两台主机之间无法连通,而且,boardhost是一台内网主机,即boardhost可以访问hostA,但是hostA无法访问boardhost

boardhost键入如下命令

$ ssh -R portA:hostB:portB hostA

R参数也是接受三个值,分别是”远程主机端口:目标主机:目标主机端口“。这条命令的意思,就是让hostA监听它自己的portA端口,然后将所有数据经由boardhost,转发到hostBportB端口。

boardhost来说hostA是远程机器,在boardhost机器上指定hostA监听某个端口,称为远程端口转发

远程端口转发的前提条件是,hostAboardhost两台主机都有sshd和ssh客户端,其原理就是:一开始由hostA充当Serverboardhost充当Clientboardhost发起请求建立一个连接;连接建立完成后,hostA就可以使用这个连接将充当Clinet,将数据转发至boardhost充当的Serverboardhost接收到数据后又需要充当Client将数据转发到hostB

其他参数

N参数,表示只连接远程主机,不打开远程shell;

T参数,表示不为这个连接分配TTY。

这个两个参数可以放在一起用,代表这个SSH连接只用来传数据,不执行远程操作。

$ ssh -NT -D port user@host

f参数,表示SSH连接成功后,转入后台运行。这样一来,就可以在不中断SSH连接的情况下,在本地shell中执行其他操作。

$ ssh -f -D port user@host

要关闭这个后台连接,就只有用kill命令去杀掉进程。