Linux《远程联接服务SSH》学习总结

一、SSH服务连接工作原埋

第一个步骤:客户端执行远程连接命令
第二个步骤:客户端服务端建立三次握手过程
第三个步骤:服务端让客户端进行确认是否接收服务端公钥信息
第四个步骤:客户端进行公钥确认,接收到公钥信息
第五个步骤:服务端让客户端确认登录用户密码信息
第六个步骤:客户端进行密码信息确认
第七个步骤:客户端服务端远程连接建立成功

每一次启动 sshd 服务时,服务器会主动去找 /etc/ssh/ssh_host* 的档案,若系统刚刚安装完成时,由于没有这些公钥档案,因此 sshd 会主动去计算出这些需要的公钥档案,同时也会计算出服务器自己需要的私钥档

若客户端第一次连接到此服务器,则会将服务器的公钥数据记录到客户端的用户家目录内的 ~/.ssh/known_hosts 。若是已经记录过该服务器的公钥数据,则客户端会去比对此次接收到的与之前的记录是否有差异。若接受此公钥数据, 则开始计算客户端自己的公私钥数据;

服务器到客户端:服务器传送数据时,拿用户的公钥加密后送出。客户端接收后,用自己的私钥解密; 客户端到服务器:客户端传送数据时,拿服务器的公钥加密后送出。服务器接收后,用服务器的私钥解密

当你登入远程服务器时,本机会主动的用接收到的服务器的 public key 去比对 ~/.ssh/known_hosts 有无相关的公钥, 然后进行底下的动作:1、若接收的公钥尚未记录,则询问用户是否记录。若要记录 (范例中回答 yes 的那个步骤) 则写入 ~/.ssh/known_hosts 且继续登入的后续工作;若不记录 (回答 no) 则不写入该档案,并且离开登入工作;2、若接收到的公钥已有记录,则比对记录是否相同,若相同则继续登入动作;若不相同,则出现警告信息, 且离开登入的动作。这是客户端的自我保护功能,避免你的服务器是被别人伪装的

二、启动 SSH 服务

事实上,在我们使用的 Linux 系统当中,默认就已经含有 SSH 的所有需要的软件了!这包含了可以产生密码等协议的 OpenSSL 软件与 OpenSSH 软件,所以呢,要启动 SSH 真的是太简单了!就直接给他启动就是了!此外,在目前的 Linux Distributions 当中,都是预设启动 SSH 的,所以一点都不麻烦,因为不用去设定,他就已经启动了! 哇!真是爽快~无论如何,我们还是得说一说这个启动的方式吧!直接启动就是以 SSH daemon ,简称为 sshd 来启动的,所以,手动可以这样启动:

[root@www ~]# systemctl restart sshd
[root@www ~]# netstat -tlnp | grep ssh
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address  Foreign Address  State   PID/Program name
tcp        0      0 :::22          :::*             LISTEN  1539/sshd

需要注意的是,SSH 不但提供了 shell 给我们使用,亦即是 ssh protocol 的主要目的,同时亦提供了一个较为安全的 FTP server ,亦即是 ssh-ftp server 给我们当成是 FTP 来使用!所以,这个 sshd 可以同时提供 shell 与 ftp 喔!而且都是架构在 port 22 上面的呢!所以,底下我们就来提一提,那么怎么样由 Client 端连接上 Server 端呢?同时,如何以 FTP 的服务来连接上 Server 并且使用 FTP 的功能呢?

三、SSH基于密钥链接的配置

ssh管理端创建密钥

[root@batch01 ~]# ssh-keygen -t dsa  
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):       //指定私钥的存放位置,如果默认,就回车
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):      //私钥是否加密,如果不加密,就回车
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa.     
Your public key has been saved in /root/.ssh/id_dsa.pub. 
The key fingerprint is:
SHA256:keWLPbbmuFY+aAbnZvJ8OdrHzbUa8d9gNv+b/SafMqE root@batch01
The key's randomart image is:
+---[DSA 1024]----+
|          .      |
|         +       |
|        o .      |
|         + .     |
|        S =  .   |
|      . ...o .o .|
|       + +oo.+*o.|
|      ..O=*Eo===B|
|       O*+o+ .+B%|
+----[SHA256]-----+

将公钥进行分发给 192.168.93.223

[root@batch01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub 192.168.93.223
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_dsa.pub"
The authenticity of host '192.168.93.223 (192.168.93.223)' can't be established.
ECDSA key fingerprint is SHA256:sp3Q7ycZUnORwsl+W7Dbje+ROODPY3CZeQswgOUQqHQ.
ECDSA key fingerprint is MD5:4f:06:bb:ab:a8:a6:8a:c1:31:1d:18:1f:75:55:3e:28.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.93.223's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.93.223'"
and check to make sure that only the key(s) you wanted were added.

测试:链接 192.168.93.223,是否可以不用输入密码链接

[root@batch01 ~]# ssh 192.168.93.223
Last login: Thu Jan  7 16:02:45 2021
四、直接登入远程主机的指令

SSH 在 client 端使用的是 ssh 这个指令,这个指令可以指定联机的版本 (version1, version2), 还可以指定非正规的 ssh port (正规 ssh port 为 22)。不过,一般的用法可以使用底下的方式:

ssh [-f] [-o 参数项目] [-p 非正规埠口] [账号@]IP [指令]
选项与参数:
-f :需要配合后面的 [指令] ,不登入远程主机直接发送一个指令过去而已;
-o 参数项目:主要的参数项目有:
	ConnectTimeout=秒数 :联机等待的秒数,减少等待的时间
	StrictHostKeyChecking=[yes|no|ask]:预设是 ask,若要让 public key
           主动加入 known_hosts ,则可以设定为 no 即可。
-p :如果你的 sshd 服务启动在非正规的埠口 (22),需使用此项目;
[指令] :不登入远程主机,直接发送指令过去。但与 -f 意义不太相同

一般使用 ssh 登入远程主机,都会填写『 ssh 账号@主机IP 』的格式, 意思是说,使用该主机的某账号登入的意思。但是很多朋友都不喜欢写账号,亦即使用『 ssh 主机IP 』的格式。 如同上面的范例情况。要注意喔,如果不写账号的话,那么会以本地端计算机的账号来尝试登入远程。 也就是说,如果近端与远程具有相同的账号,那么不写账号也没有关系,如上表中的范例。但是,为了以后习惯着想, 还是一开始就使用类似 email 的方式来登入远程主机,这样的行为习惯比较好啦!

# 2. 使用 student 账号登入本机
[root@www ~]# ssh student@127.0.0.1
student@127.0.0.1's password:
[student@www ~]$ exit

由于加入账号,因此切换身份成为 student 了!另外,因为 127.0.0.1 曾登入过,所以就不会再出现提示你要增加主机公钥的讯息啰!

# 3.登入对方主机执行过指令后立刻离开的方式
[root@www ~]# ssh student@127.0.0.1 find / &> ~/find1.log
student@localhost's password:

此时你会发现怎么画面卡住了?这是因为上头的指令会造成,你已经登入远程主机,但是执行的指令尚未跑完,因此你会在等待当中。那如何指定系统自己跑?

# 4. 与上题相同,但是让对方主机自己跑该指令,你立刻回到近端主机继续工作
[root@www ~]# ssh -f student@127.0.0.1 find / &> ~/find1.log

此时你会立刻注销 127.0.0.1 ,但 find 指令会自己在远程服务器跑喔!
上述的范例当中,第 4 个范例最有用!如果你想要让远程主机进行关机的指令,如果不加上 -f 的参数, 那你会等待对方主机关机完毕再将你踢出联机,这比较不合理。因此,加上 -f 就很重要~因为你会指定远程主机自己跑关机, 而不需要在空空等待。例如:『ssh -f root@some_IP shutdown -h now 』之类的指令啰。

# 5. 删除掉 known_hosts 后,重新使用 root 联机到本机,且自动加上公钥记录
[root@www ~]# rm ~/.ssh/known_hosts
[root@www ~]# ssh -o StrictHostKeyChecking=no root@localhost
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
root@localhost's password:

如上所示,不会问你 yes 或 no 啦!直接会写入 ~/.ssh/known_hosts 当中!
时如果每台计算机都在主动加上公钥文件记录,都得要输入『 yes 』,会累死!那么加上这个 StrictHostKeyChecking=no 就很有帮助啦!他会不询问自动加入主机的公钥到档案中,对于一般使用者帮助不大,对于程序脚本来说, 这玩意儿可就很不错用了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值