Linux必会之SSH安装/配置/使用/进阶指北

请注意,本文编写于 1363 天前,最后修改于 669 天前,其中某些信息可能已经过时。

安装SSH服务,配置SSH服务,SSH免密登录,SCP传输文件,SSH的常见高级用法; 做开发,关于SSH服务,这一篇就够了。

Linux安装配置SSH服务

ssh服务是什么?

传统的网络服务程序,如:ftppoptelnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。通过使用SSH,你可以把所有传输的数据进行加密,有效的防止中间人攻击,也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTPPoP、甚至为PPP提供一个安全的"通道"。

1. 安装SSH

安装前检查ssh服务状态:
sudo ps -e |grep ssh

如果显示只有ssh-agent, 而没有sshd服务项, 那么你的系统中ssh服务端程序便没有启动, 启动ssh服务:

sudo service ssh start
#或者使用
systemctl start ssh

如果找不到sshd服务,那就说明ssh服务端没有安装。

也可以用查看下端口监听,有没有22端口也可以识别ssh服务是否正常启动。

红帽系发行版

RedhatCentos 等系列linux发行版,用yum在线安装:

sudo yum install openssh-server
Debian系发行版

UbuntuLinux Mint, Kali等系列的linux发行版,则用apt来在线安装:

sudo apt-get install openssh-server

2. SSH服务常用操作

启动服务

确定安装ssh服务完成后,启动ssh服务:

sudo service ssh start        
#或者
sudo systemctl start ssh    
查看ssh状态:
sudo service ssh status        
#或者
sudo systemctl status ssh    
停止服务
sudo service ssh stop        
#或者
sudo systemctl stop ssh    
ssh服务操作

启动,停止,重启,运行状态等服务操作如下:

sudo service ssh {start/stop/reload/force-reload/restart/try-restart/status}
#或者如下:
systemctl {start/stop/reload/force-reload/restart/try-restart/status} ssh

Redhat7|Centos7|Ubuntu18.04及以上版本使用 systemctl , 老旧旧版本可使用service

3. 配置SSH

3.1 开机自启动
sudo systemctl enable ssh     # 开机自启动
sudo systemctl disable ssh     # 禁止开机启动

有关ssh服务端配置文件 /etc/ssh/sshd_config 的详细都可以用下面这条语句查看获取:

man sshd_config
3.2 更改默认端口:

ssh服务默认使用22端口,若需更改在ssh_config 文件中修改成自己想要的端口.

vim /etc/ssh/sshd_config

Port 22 这一行, 命令模式下x 键 删除#号字符, yy 复制此行内容, p 键复制到下行,并更改成要修改的端口号. 命令模式下:x 保存,或者wq保存. 编辑完后重启下ssh服务:

service sshd restart

两行Port项 的注释都要去掉,上一行是默认端口,下一行是自定义端口.

如果是Centos,Redhat等系发行版,需关闭selinx才能更改端口成功.

3.3 sshd配置文件

sshd 配置文档sshd_config还有很多安全选项可自行更改,具体不细述,可以来一篇Linux系统安全专题细讲下,除非有安全需求;可以用ssh密钥登陆,提高了系统安全性。

4. SSH高级用法

4.1 SSH连接远程主机:

(比如你用Windows连接服务器)

ssh 用户名@IP              
ssh root@192.168.1.22     
# 输入yes回车,输入密码即可登录。端口默认22的情况下,可直接用户名密码连接登录

ssh -P 端口 用户名@IP                 
ssh -P 2522 root@192.168.75.188        
#如果更改了默认端口,则加上参数:大写的P 指定端口。
4.2 SSH免密登录远程主机:

为什么要SSH免密?
比如在Windows上,不想每次登录都输入系统密码。免密登录是利用非对称加密(RSA加密算法)的原理,在本地客户端保存SSH私钥,服务器保存SSH公钥的方法实现的。理论上,在一定基础上提高了账户安全性,因为用用户名密码登录方式的话有被爆破的风险,恰好你又使用了弱口令,即便是普通用户,也可以进一步的进行提权。

  1. 先修改SSH配置文件的密钥验证,这里以Ubuntu 22.04 LTS环境root用户为例,在/etc/ssh/sshd_config文件中去除如下语句的注释:
#去掉前面的注释 #字符即可

PubkeyAuthentication yes                #启用密钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys #公钥存放文件路径

重启SSH服务:

systemctl restart ssh
  1. 然后在远程服务器的终端上生成SSH密钥:
ssh-keygen
# 默认即可,可选 `-t rsa`参数选择加密算法,不过不需要,默认就是rsa加密。

连按三次回车,无需添加密码修改路径。生成完毕后,会有两个文件:id_rsaid_rsa.pub ;一个是私钥(在本地),一个是公钥(在服务端)。
如果是Linux,密钥在/home/用户名/.ssh/ 目录中也就是~/.ssh
如果是Windows,密钥便在C:\Users\Administrator/.ssh/ 目录中(自己用户名的文件下)。

  1. 服务器密钥拷贝
    ①在本地系统环境生成密钥后,把公钥id_rsa.pub上传至远程服务器即可;

②如果是操控着远程主机生成的密钥,则把私钥id_rsa下载到本机。
本地指的是主控端主机,远程是值被控端主机,操作如下:

  • 可以利用终端连接工具自带的sftp功能,找到密钥文件直接拖拽保存到本地,方便快捷,如:FinalShellMobaXterm等。
  • SSH终端工具没有自带SFTP功能的:
## 将远程服务器上生成的私钥文件 `id_rsa` 下载到本地

#安装传输工具,非root用户加sudo
apt install lrzsz
#确认私钥文件并执行下载,会弹窗供选择本地存储的位置      
sz ~/.ssh/id_rsa 

#在线拷贝      
ssh-copy-id -p 端口 用户名@IP        
ssh-copy-id geek0ne@192.168.8.8        
  • 也可以用scp命令将密钥文件传输到远程主机,后面有scp用法。

SSH密钥分配好后,就可以用终端工具以密钥的方式进行登录主机了,将存储在本地的私钥导入,与远程服务器的公钥进行匹配认证,即可成功登录二无须用户密码。

4.3 SCP传输文件

不管是Linux与Linux,还是Windows与Linux,互传文件的方法和软件有很多;但只要两台机器上有安装ssh服务,那么就可以使用ssh协议传输文件,用法如下。

  1. 本机传输文件至远程服务器:
# scp 文件名 远程用户名@IP:远程存放路径                
scp demo.c geek0ne@192.168.8.8:/home/geek0ne/Code    #传输单个文件
scp -r Demo geek0ne@192.168.8.8:/home/geek0ne/Code      #传输目录
  1. 从远程服务器下载文件到本机:
# scp 远程用户名@IP:远程目录/文件存放路径 本地目录文件                
scp geek0ne@192.168.8.8:/home/geek0ne/Code/demo.c demo.c   #传输单个文件
scp -r geek0ne@192.168.8.8:/home/geek0ne/Code/Demo Demo       #传输目录

上传和下载的使用方法只是目前对象前后调换位置而已,不仅可传输文件,也能传输文件夹/目录,加参数-r
目标存储位置如果不设置,则默认在当前路径下。

注意:

IP地址和目录之间有个冒号不能遗漏,如果冒号后面不是绝对路径,则以用户家目录为参照。
如果更改端口,还是加参数: -P port
如果是目录必需要加参数:-r

4.4 SSH配置别名

如果不用shell终端工具,每次登录连接,都要输入ssh 用户名@IP 这一串字符,时间一长,会不会觉得这种重复性的操作有点浪费时间,况且你每次都能准确无误的手敲IP和username么,如果服务器数量一多呢。(用shell终端管理工具的请不要发言 /滑稽

配置别名就能进一步的减少输入,比如用ssh ave 替代连接字符串,方便"偷懒",提高工作效率,毕竟一滴水积少成多,亦能成塘池。在主目录下,~/.ssh/config 里面追加下面内容:

Host ave
    HostName IP
    User geek0ne
    Port 22

追加编辑保存后,就可用ssh ave 来连接远程主机了, scp 命令也同样适用 。

5. 卸载SSH

ssh服务是远程服务器必备服务,当然也可以卸载掉服务端,只留下ssh客户端来主动连接登录其它主机,即便不装sshd 服务也是可以连接远程机器,只是不能被远程主机连接。避免了本机被别的机器进行爆破,减少了安全风险,增加了安全性。下面卸载sshd服务端:

红帽系发行版Redhat, Centos等linux发行版,卸载用以下命令:

sudo yum remove sshd

Debian系发行版,Ubuntu,Linux mint等linux发行版,卸载用以下命令:

sudo apt –purge remove sshd

本文作者:Geek0ne
本文链接:https://geek0ne.com/LinuxAce/ssh.html
本文根据知识共享署名4.0国际许可进行许可,转载/引用请标注来源!

Comments

添加新评论