登陆
-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命令去杀掉进程。