登陆
-p
指定主机的端口
$ ssh -p port user@host
默认端口为22
$ ssh user@host
默认使用本机用户名
$ ssh host
过程
-
远程主机接收到用户的登陆请求,把自己的公钥发给用户
-
用户使用这个公钥,将密码加密后发回来
-
远程主机用自己的私钥,解密登陆密码,如果密码正确,就同意用户登陆
此处如果有攻击者截取了用户请求,再将自己的公钥发送给用户,然后就可以用自己的私钥解密出用户的私密信息,这就是
中间人攻击
应对的方法:用户首次连接远程主机时,远程主机将发送一段128位长的公钥指纹,用户需要自行与远程主机网站发布的公钥指纹进行对比以判断真伪,当用户信任了此公钥后,它将被保存在
$HOME/.ssh/known_hosts
中,下次连接时无需再次确认。
公钥登陆
原理:用户将自己的公钥
保存在远程主机上,登录时,远程主机向用户发送一段随机码,用户用自己的私钥
签名后,在发回远程主机,远程主机用实现保存的公钥
进行验证,如果成功,表示用户的身份正确,无需输入密码
-
用户生成一对自己的密钥
-
将用户的
公钥
内容添加到$HOME/.ssh/authorized_keys
中(可以用ssh-copy-id user@host
进行该操作) -
重启ssh服务
/etc/init.d/ssh restart
公钥登陆相关配置 /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
远程操作
-
直接操作
$ ssh user@host command
-
用户和远程主机之间,建立命令和数据的传输通道
将当前目录下的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命令去杀掉进程。