SSH的使用

SSH经常都会用到,简单的来说就是对远程的设备进行操作,简称命令行;前段时间,弄了一台服务器回来,发现SSH不进去!就有了这篇文章

SSH介绍:

Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,可有效弥补网络中的漏洞。通过SSH,可以把所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。目前已经成为Linux系统的标准配置。

SSH的安装

这里重点讲Linux的SSH,Windows上的有很多SSH的软件,使用也非常的简单使用,除非你使用windows里的命令行(好像再说我自己),这里就推荐两款windows上比较好用的SSH工具:

第一款:FinalShell(本人也在用)

官网FinalShell (hostbuf.com)

1610264529229005910

第二款:Xshell(收费)

官网:(https://www.xshell.com/zh/xshell/)

xshell

重点来了……

一般来说所有的Linux中都默认安装了SSH的,对于云服务器来说都是已经安装了的并且开启了可以直接命令SSH进去就行,而桌面级的话默认并没有安装(有些时开启的),需要我们来安装一下并开启;使用最简单的方式就是LINUX包管理器

SSH分为客户端 openssh-client 和服务器 openssh-server,可以利用以下命令确认电脑上是否安装了客户端和服务器。

1
2
dpkg -l | grep ssh                 # ubuntu上的命令
yum list installed | grep ssh # centos上的命令

20220204211724

这里显示已经安装了,再查看一下是否已经开启;

20220204211926

这里看见已经启动了

如果查看到没有的话我们就用一下的命令安装一下;如果只是想远程登陆别的机器只需要安装客户端(Ubuntu默认安装了客户端),如果要开放本机的SSH服务就需要安装服务器。

基于 Debian / Ubuntu 的系统 :

安装 ssh-client

$ sudo apt-get install openssh-client

安装 ssh-server

$ sudo apt-get install openssh-server

基于 RedHat / CentOS 的系统 :

``# yum install openssh-server openssh-clients`

SSH安装上了,我们就可以在终端下输入 ssh 来检查下安装的是否正常。

看见这个界面就说明安装成功了:

启动SSH

已经安装了的只需要启动SSH服务就好了

在终端敲入以下命令:

1
sudo service ssh star

再执行查看ssh服务状态的命令:

1
sudo service ssh status

如果出现以下提示:

1
ssh start/running, process 890

或者出现一下画面就时开启成功了:

20220204182132

来到这说明你的ssh服务已经启动了。如果失败来的话,可以重新按照上面的安装方法进行安装一下再重新启动,或者安装下面的卸载命令,先卸载了然后再重新安装一次就可以了。

卸载SSH服务

如果你用的是redhat,fedora,centos等系列linux发行版,那么敲入以下命令:

1
sudo yum remove ssh

如果你使用的是debian,ubuntu,linux mint等系列的linux发行版,那么敲入以下命令:

1
sudo apt-get –purge remove ssh

然后就会提示卸载完成。

SSH的常用命令

1、登录

口令登录

口令登录非常简单,只需要一条命令,命令格式为: ssh 客户端用户名@服务器ip地址

1
ssh admin@192.168.0.1

如果需要调用图形界面程序可以使用 -X 选项

1
ssh -X admin@192.168.0.1

如果客户机的用户名和服务器的用户名相同,登录时可以省略用户名。

1
ssh 192.168.0.1

还要说明的是,SSH服务的默认端口是22,也就是说,如果你不设置端口的话登录请求会自动送到远程主机的22端口。我们可以使用 -p 选项来修改端口号,比如连接到服务器的1234端口:

1
ssh -p 1234 admin@192.168.0.1

客户机必须要知道服务器的ip地址。可以在服务器端电脑上利用 ifconfig 命令查看该机的ip地址:

1
2
3
4
5
6
7
8
9
admin@ubuntu:~$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.111 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::902a:cd1c:f3c6:bdcf prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:b2:fd:71 txqueuelen 1000 (Ethernet)
RX packets 3930 bytes 985803 (985.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1238 bytes 119044 (119.0 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

inet 192.168.0.111 这个就是IP地址

如果是第一次登录远程主机,系统会给出下面提示:

0220204190930

意思是,该远程主机的真实性无法确定,其公钥指纹为 **********,确定想要继续连接吗?输入yes*即可。这时系统会提示远程主机被添加到已知主机列表。

然后会要求我们输入远程主机的密码,输入的密码正确就可以成功登录了。命令提示符会修改为远程主机的提示符,现在开始,终端中输入的命令都将在服务器中执行。

我们可以通过 Ctrl+D 或者 exit 命令退出远程登录

公钥登录

每次登录远程主机都需要输入密码是很不方便的,如果想要省去这一步骤,可以利用密钥对进行连接,还可以提高安全性。

1、在本机生成密钥对,使用ssh-keygen命令生成密钥对:

1
ssh-keygen -t rsa   #-t表示类型选项,这里采用rsa加密算法

然后根据提示一步步的按enter键即可(其中有一个提示是要求设置私钥口令passphrase,不设置则为空,这里看心情吧,如果不放心私钥的安全可以设置一下),执行结束以后会在 /home/当前用户 目录下生成一个 .ssh 文件夹,其中包含私钥文件 id_rsa 和公钥文件 id_rsa.pub。

2、将公钥复制到远程主机中

使用ssh-copy-id命令将公钥复制到远程主机。ssh-copy-id会将公钥写到远程主机的 ~/ .ssh/authorized_key 文件中(windows中没有ssh-copy-id命令方便地添加公钥到远程主机,需手动添加)

1
ssh-copy-id admin@192.168.0.1

经过以上两个步骤,以后再登录这个远程主机就不用再输入密码了。

3、SSH功能大全

1.登录
ssh -p22 omd@192.168.25.137
2.直接执行命令 –>最好全路径
ssh root@192.168.25.137 ls -ltr /backup/data
==>ssh root@192.168.25.137 /bin/ls -ltr /backup/data
3.查看已知主机
cat /root/.ssh/known_hosts
4.ssh远程执行sudo命令
ssh -t omd@192.168.25.137 sudo rsync hosts /etc/

5.scp
1.功能 –>远程文件的安全(加密)拷贝
scp -P22 -r -p /home/omd/h.txt omd@192.168.25.137:/home/omd/
2.scp知识小结
scp是加密远程拷贝,cp为本地拷贝
可以推送过去,也可以拉过来
每次都是全量拷贝(效率不高,适合第一次),增量拷贝用rsync

6.ssh自带的sftp功能
1.Window和Linux的传输工具
wincp filezip
sftp –>基于ssh的安全加密传输
samba
2.sftp客户端连接
sftp -oPort=22 root@192.168.25.137
put /etc/hosts /tmp
get /etc/hosts /home/omd
3.sftp小结:
1.linux下使用命令: sftp -oPort=22 root@x.x.x.x
2.put加客户端本地路径上传
3.get下载服务器端内容到本地
4.远程连接默认连接用户的家目录

2、ssh常见命令参数

格式;

ssh [user@]host [command]

ssh参数解释

选项:

-1:强制使用ssh协议版本1;

-2:强制使用ssh协议版本2;

-4:强制使用IPv4地址;

-6:强制使用IPv6地址;

-A:开启认证代理连接转发功能;

-a:关闭认证代理连接转发功能;

-b:使用本机指定地址作为对应连接的源ip地址;

-C:请求压缩所有数据;

-F:指定ssh指令的配置文件;

-f:后台执行ssh指令;

-g:允许远程主机连接主机的转发端口;

-i:指定身份文件;

-l:指定连接远程服务器登录用户名;

-N:不执行远程指令;

-o:指定配置选项;

-p:指定远程服务器上的端口;

-q:静默模式;

-X:开启X11转发功能;

-x:关闭X11转发功能;

-y:开启信任X11转发功能。

ssh 登录时常出现的几种错误以及解决方法(Linux)

1、SSH连接时出现Connection refused,如下:

报错如下:
ssh: connect to host 123.123.123.111 port 22: Connection refused

通常是由于22端口未打开、ssh服务未启动或防火墙禁止22端口等原因引起的

解决方法:

【1】启动服务,设置防火墙步骤如下:

<1>.进入该服务器(本地登陆)

<2>.查看ssh服务是否启动
systemctl status sshd

如未启动
systemctl start sshd

<3>.查看端口是否打开
netstat -lnput |grep :22

如未打开,再次启动sshd

<4>测试网络的联通性
ping www.baidu.com (ping外网)

如果ping不通,就检查dns

如果dns无问题,就说明是网络原因,看服务器的网线是否连接或是否有问题

<5>如果能连接外网,就查看服务器的防火墙规则,并开放ssh服务的22号端口(如防火墙未放行ssh的端口)

iptables -L

[1]直接打开端口:
iptables -I INPUT -p tcp –dport 22 -j ACCEPT

[2]永久打开端口

打开防火墙配置文件:
vim /etc/sysconfig/iptables

在iptables文件内容中追加
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT

保存配置文件后,重启防火墙:
service iptables restart(centos6)
systemctl restart iptables(centos7)

2、SSH连接时出现Host key verification failed

报错如下:
Host key verification failed

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

通常是由于访问使用的公钥与服务器记录的差异引起的

ssh服务会把每个曾经访问过计算机或服务器的公钥(public key),记录在~/.ssh/known_hosts
当下次访问曾经访问过的计算机或服务器时,ssh就会核对公钥,如果和上次记录的不同,OpenSSH会发出警告。
而ssh对主机的public_key的检查是有等级的,根据等级执行不同的策略。(StrictHostKeyChecking就是配置等级的参数)

[1]StrictHostKeyChecking=no

最不安全的级别,提示最少,应在相对安全的内网测试时使用。(当连接的服务器的公钥在本地不存在,就会自动添加到文件(默认是known_hosts)中,并且给出警告。

[2]StrictHostKeyChecking=ask

默认的级别。如果连接的服务器的公钥和本地的known_hosts文件中不匹配,就给出提示(Host key verification failed),并拒绝登录。

[3]StrictHostKeyChecking=yes

最安全的级别,如果连接的服务器的公钥和本地的known_hosts文件中的不匹配,就拒绝连接,不会提示详细信息。

解决方法 :

【1】可更改安全选择最低的安全级别。在.ssh/config或/etc/ssh/ssh_config)中配置:

StrictHostKeyChecking no
UserKnownHostsFile /dev/null

(将knownhostfile设为/dev/null),为了方便使用在known_hosts中了)

【2】删除对应ip的在known_hosts相关信息

vim /.ssh/known_hosts

【3】直接删除known_hosts文件
rm known_hosts

3、SSH公私钥正确的情况下免密登录失败

有的时候我们经常会遇到:在服务器上配置ssh公钥后,一段时间可以免密码登录,后来登录时,每次都提示要输入密码。这时我们可以删除known_hosts,重新把id_rsa.pub添加到服务器~/.ssh/authorized_keys下。 如果这个办法也不行,我们(首先考虑是权限问题)要查看日志。

/var/log/auth.log日志中报错如下:
coffeeserver sshd[6761]: Authentication refused: bad ownership or modes for directory /root/.ssh

/var/log/secure日志中报错如下:
Authentication refused: bad ownership or modes for directory /root/.ssh

这些日志都告诉了我们/root/.ssh的目录的权限的配置出现了(权限应为700)

解决方法:

【1】更改目录及文件权限

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

4、SSH连接时密码正确,登陆失败,出现Permission denied, please try again

报错如下:
Password authentication failed

Permission denied, please try again

通常是由于/etc/ssh/sshd_config的PasswordAuthentication或PermitRootLogin参数的配置引起的

补充:
还有特殊一种情况,你要连接的这台服务器的ip地址与你局域网中的某台电脑的ip地址一致,造成冲突。(这种情况,无论怎么改都会失败,会让你怀疑自己。解决方法只能是一方改IP或关闭其中一方,先解决冲突问题

解决方法:

【1】修改相关配置文件

<1>查看本服务器和电脑的防火墙设置,是否打开ssh服务,22端口(一般都是打开的)
如果服务不是打开的要将服务启动,防火墙开放22端口(配置规则看本文目录第1条中)

<2>编辑sshd_config文件

vim /etc/ssh/sshd_config

将PasswordAuthentication前面的#号去掉
将PasswordAuthentication 设为yes

<3> 重启sshd服务

/etc/init.d/sshd restart (centos6)
systemctl restart sshd(centos7)

【2】修改相关配置文件

<1>基本上与上一个方法相同,但编辑sshd_config文件的另一个参数

vim /etc/ssh/sshd_config

将PermitRootLogin前面的#号去掉
将PermitRootLogin设为yes

<2>重启sshd服务

/etc/init.d/sshd restart (centos6)
systemctl restart sshd(centos7)

5、SSH连接时出现Permission denied, please try againssh_exchange_identification: read: Connection reset by peer

报错如下:
Permission denied, please try againssh_exchange_identification: read: Connection reset by peer

原因是由于所访问的服务器启用了tcp_wrapper,拒绝接受该ip或网段发起访问的服务,可能是限制了ip或是网段

解决方法:

【1】修改发起访问端的ip或网段

该方法在无法进入被访问端服务器时使用,但可用率不高,因为大多少情况下是对网段进行限制并开放某些IP。

建议联系 系统管理员解除限制或放开该IP或网段

<1>查看本机的ip或网段

ip a

<2>修改一个正在使用的网卡的配置文件

例如:

vim /etc/sysconfig/network-scripts/ifcfg-eth0
(重点修改IPADDR,NETMASK,GATEWAY,将其修改为新网段的IP)

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.10.10.10
NETMASK=255.255.254.0
GATEWAY=10.10.10.254
DNS1=.8.8.8.8

<3> 重启网卡

service network restart(centos6)
systemctl restart network(centos7)

【2】进入被访问端解除限制或放开IP

<1>进入/etc/hosts.allow中进行修改

(123.123.123.123此处代表发起访问端的IP)

vim /etc/hosts.allow

追加
sshd:123.123.123.123:allow

或仅注释一行
#sshd:123.123.123.123:deny

或注释所有规则,并添加
sshd:all:allow