通过ssh实现远程登录linux计算机,并且可以执行命令
ssh是一种安全协议,主要对其的使用一般在远程登录(如A电脑通过命令行远程操作B电脑)和为其他网络服务提供安全协议(常见的如sftp)
两台机器通过ssh建立链接的大概流程
- 首先,ssh由客户端和服务器端组成,若电脑A想要通过ssh远程控制电脑B,A则为客户端,B则为服务端;
- 接下来,A通过客户端进程向B机器发送链接请求,B机器的服务端进程接收到请求,进行验证等其他操作与A建立链接
- 至此,电脑A能够远程操作电脑B
开始配置
安装客户端程序
ubuntu系统自带有ssh-client,使用ssh命令即可发起连接请求
安装服务端程序
在被登录的linux电脑上执行
$ sudo apt-get update //更新一下apt
$ sudo apt-get install openssh-server //安装ssh服务器程序
安装完成后,可以尝试登录本机
$ shh localhost
首次登录会有个询问,输入yes,回车
{% asset_img ssh登录本机.png 询问 %}
这时候会提示输入密码,输入当前用户的登陆密码,回车,登录成功
{% asset_img ssh.png 登录到本机 %}
输入exit退出登录
此时ssh程序的安装就完事了
开始远程登录
执行,图中ip一样替换成想要登录的服务端ip
{% asset_img ssh无参数.png ssh无参数登录 %}
此时,ssh 会尝试用当前用户作为用户名来登录服务端电脑,即上图中尝试使用nairoj这个用户名登录目标电脑,如果目标电脑没有nairoj这个用户呢?
使用-l参数指定要登录的用户,指定用root账户登录:
{% asset_img sshroot.png 指定用户名 %}
接下来输入密码,登录成功!
{% asset_img sshrootlogin.jpg root登录成功 %}
上图最后一行
root@iZm5ec880z2roqeog3q978Z:~#
说明此时命令行已经相当于目标机的命令行了,
在这上面执行的命令即为在目标机上执行~
免密码登录
ssh提供了两种验证方式
- 密码验证
- 密钥验证
上面登录的方式就是密码验证,只要知道目标机的用户密码就可以登录,这种验证方式的有一个缺点,不能保证客户机连接上的就是目标机,可能存在有‘中间人’, 还有就是每次登录都需要输入密码。
再说一下密钥验证的登录方式:
1.先exit
退出刚刚的远程登录状态,回到本机
2.客户机采用非对称加密算法rsa建立一对密钥(一个公钥,一个私钥)
$ cd ~/.ssh/ #~表示用户目录,即‘/usr/你的用户名/’
$ ssh-keygen -t rsa #用rsa算法建立一对密钥,中间的提示一直按回车即可
说明:
- 若不存在.ssh文件夹,先执行一次
ssh localhost
- 非对称加密算法生成的密钥,公钥加密的文件只有密钥能解密,私钥加密的文件只有公钥能解密
- 上面的命令执行完,在.ssh文件下有多出两个文件
id_rsa
和id_rsa.pub
,.pub
后缀的文件即为公钥
3.将公钥上传到服务端的(这里将公钥上传到用户目录下),
这里会要求输入目标机用户的登陆密码
#将user替换成要登录的用户名,ip替换成服务机的ip地址
$ scp ~/.ssh/id_rsa.pub user@ip:/home/user/
出现下图即为传输成功,
{% asset_img sshtran.png 公钥传输完毕 %}
此时在服务端机器的用户目录下,可以找到这个文件
4.用密码登录的方式远程登录服务端,将公钥加入授权
$ ssh -l user ip # 登录,这里会要求输入密码
$ mkdir ~/.ssh # 如果不存在该文件夹需先创建,若已存在则忽略
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
#将用户目录下的客户机公钥加入授权
$ exit #退出登录,回到本机
5.此时已经可以使用密钥验证的方式登录服务端电脑了
$ ssh -l user ip
这一次不会要求输入密码,直接登录成功
这种验证方式的原理在于:将客户机A的公钥存入服务机,当客户机A发起ssh登录的请求时,服务机生成一个随机数X,用A的公钥加密随机数X后发给A,
A用自己的密钥解密发来的数据后,将解密得到的随机数发回给服务机
如果发回的随机数与X相同,则验证成功,实现远程登录且不用人工输入密码
最后
因为每次登录都输入ip很麻烦,可以将经常登录的ip写到/ect/hosts
文件
$ sudo gedit /ect/hosts
在其中写入自己常用的ip和并且给它取个名字,保存
{% asset_img sship.png sship%}
上图的144.111.111.56 即为常用的ip,myesc 是给它取得别名
以后进行远程登陆时,执行
$sudo -l user myesc
就可以进行远程登录
参考资料