SSH( Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理Linux 系统的首选方式。在此之前,一般使用 FTP 或 Telnet 来进行远程登录。
使用 SSH 协议来远程管理 Linux 系统, 则需要部署配置 sshd 服务程序。sshd 是基于 SSH 协议开发的一款远程管理服务程序, 不仅使用起来方便快捷, 而且能够提供两种安全验证的方法:
sshd 服务的配置信息保存在/etc/ssh/sshd_config 文件中。
sshd 服务配置文件中包含的重要参数如表所示。
参数 | 作用 |
---|---|
Port 22 | 默认的 sshd 服务端口 |
ListenAddress 0.0.0.0 | 设定 sshd 服务器监听的 IP 地址 |
Protocol 2 | SSH 协议的版本号 |
HostKey /etc/ssh/ssh_host_key | SSH 协议版本为 1 时, DES 私钥存放的位置 |
HostKey /etc/ssh/ssh_host_rsa_key | SSH 协议版本为 2 时, RSA 私钥存放的位置 |
HostKey /etc/ssh/ssh_host_dsa_key | SSH 协议版本为 2 时, DSA 私钥存放的位置 |
PermitRootLogin yes | 设定是否允许 root 管理员直接登录 |
StrictModes yes | 当远程用户的私钥改变时直接拒绝连接 |
MaxAuthTries 6 | 最大密码尝试次数 |
MaxSessions 10 | 最大终端数 |
PasswordAuthentication yes | 是否允许密码验证 |
PermitEmptyPasswords no | 是否允许空密码登录(很不安全) |
ssh 命令进行远程连接,其格式为“ssh [参数] 主机 IP 地址”。要退出登录则执行 exit 命令。
如果禁止以 root 管理员的身份远程登录到服务器,则可以大大降低被黑客暴力破解密码的几率。下面进行相应配置。首先使用 Vim 文本编辑器打开 sshd 服务的主配置文件,然后把第 48 行#PermitRootLogin yes 参数前的井号( #)去掉,并把参数值 yes 改成 no,这样就不再允许 root 管理员远程登录了。记得最后保存文件并退出。
[root@linuxprobe ~]# vim /etc/ssh/sshd_config ………………省略部分输出信息……………… 46 47 #LoginGraceTime 2m 48 PermitRootLogin no 49 #StrictModes yes 50 #MaxAuthTries 6 51 #MaxSessions 10 52 ………………省略部分输出信息………………
一般的服务程序并不会在配置文件修改之后立即获得最新的参数。如果想让新配置文件生效,则需要手动重启相应的服务程序。最好也将这个服务程序加入到开机启动项中,这样系统在下一次启动时,该服务程序便会自动运行,继续为用户提供服务。
[root@linuxprobe ~]# systemctl restart sshd [root@linuxprobe ~]# systemctl enable sshd
配置了密钥验证方式,其步骤如下。
第 1 步:在客户端主机中生成“密钥对”。
[root@linuxprobe ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa):按回车键或设置密钥的存储路径 Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): 直接按回车键或设置密钥的密码 Enter same passphrase again: 再次按回车键或设置密钥的密码 Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 40:32:48:18:e4:ac:c0:c3:c1:ba:7c:6c:3a:a8:b5:22 root@linuxprobe.com The key's randomart image is: +--[ RSA 2048]----+ |+*..o . | |*.o + | |o* . | |+ . . | |o.. S | |.. + | |. = | |E+ . | |+.o | +-----------------+
第 2 步:把客户端主机中生成的公钥文件传送至远程主机:
[root@linuxprobe ~]# ssh-copy-id 192.168.10.10 The authenticity of host '192.168.10.20 (192.168.10.10)' can't be established. ECDSA key fingerprint is 4f:a7:91:9e:8d:6f:b9:48:02:32:61:95:48:ed:1e:3f. 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.10.10's password:此处输入远程服务器密码 Number of key(s) added: 1 Now try logging into the machine, with: "ssh '192.168.10.10'" and check to make sure that only the key(s) you wanted were added.
第 3 步:对服务器进行设置,使其只允许密钥验证,拒绝传统的口令验证方式。记得在修改配置文件后保存并重启 sshd 服务程序。
[root@linuxprobe ~]# vim /etc/ssh/sshd_config ………………省略部分输出信息……………… 74 75 # To disable tunneled clear text passwords, change to no here! 76 #PasswordAuthentication yes 77 #PermitEmptyPasswords no 78 PasswordAuthentication no 79 ………………省略部分输出信息……………… [root@linuxprobe ~]# systemctl restart sshd
第 4 步:在客户端尝试登录到服务器,此时无须输入密码也可成功登录。
[root@linuxprobe ~]# ssh 192.168.10.10 Last login: Mon Apr 13 19:34:13 2017
scp( secure copy)是一个基于 SSH 协议在网络之间进行安全传输的命令,其格式为“scp[参数] 本地文件 远程帐户@远程 IP 地址:远程目录”。
scp 命令中可用的参数及作用:
参数 | 作用 |
---|---|
-v | 显示详细的连接进度 |
-P | 指定远程主机的 sshd 端口号 |
-r | 用于传送文件夹 |
-6 | 使用 IPv6 协议 |
在使用 scp 命令把文件从本地复制到远程主机时,首先需要以绝对路径的形式写清本地文件的存放位置。如果要传送整个文件夹内的所有数据,还需要额外添加参数-r 进行递归操作。然后写上要传送到的远程主机的 IP 地址,远程服务器便会要求进行身份验证了。当前用户名称为 root,而密码则为远程服务器的密码。如果想使用指定用户的身份进行验证,可使用用户名@主机地址的参数格式。最后需要在远程主机的 IP 地址后面添加冒号,并在后面写上要传送到远程主机的哪个文件夹中。
[root@linuxprobe ~]# echo "Welcome to LinuxProbe.Com" > readme.txt [root@linuxprobe ~]# scp /root/readme.txt 192.168.10.20:/home root@192.168.10.20's password:此处输入远程服务器中 root 管理员的密码 readme.txt 100% 26 0.0KB/s 00:00
此外,还可以使用 scp 命令把远程主机上的文件下载到本地主机,其命令格式为“scp [参数] 远程用户@远程 IP 地址:远程文件 本地目录”。
例如,可以把远程主机的系统版本信息文件下载过来,这样就无须先登录远程主机,再进行文件传送了,也就省去了很多周折。
[root@linuxprobe ~]# scp 192.168.10.20:/etc/redhat-release /root root@192.168.10.20's password:此处输入远程服务器中 root 管理员的密码 redhat-release 100% 52 0.1KB/s 00:00 [root@linuxprobe ~]# cat redhat-release Red Hat Enterprise Linux Server release 7.0 (Maipo)
screen 是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异 常中断或为了同时控制多个远程终端窗口而设计的程序。用户还可以使用 screen 服务程序同 时在多个远程会话中自由切换,能够做到实现如下功能。
screen 命令能做的事情非常多:可以用-S 参数创建会话窗口;用-d 参数将指定会话进行离线处理;用-r 参数回复指定会话;用-x 参数一次性恢复所有的会话;用-ls 参数显示当前已有的会话;以及用-wipe 参数把目前无法使用的会话删除,等等。
在日常的生产环境中,其实并不是必须先创建会话,然后再开始工作。可以直接使用screen 命令执行要运行的命令,这样在命令中的一切操作也都会被记录下来,当命令执行结束后 screen 会话也会自动结束。
[root@linuxprobe ~]# screen vim memo.txt welcome to linuxprobe.com
为了演示 screen 不间断会话服务的强大之处,我们先来创建一个名为 linux 的会话,然后强行把窗口关闭掉(这与进行远程连接时突然断网具有相同的效果):
[root@linuxprobe ~]# screen -S linux [root@linuxprobe ~]# [root@linuxprobe ~]# tail -f /var/log/messages Feb 20 11:20:01 localhost systemd: Starting Session 2 of user root. Feb 20 11:20:01 localhost systemd: Started Session 2 of user root. Feb 20 11:21:19 localhost dbus-daemon: dbus[1124]: [system] Activating service name='com.redhat.SubscriptionManager' (using servicehelper) Feb 20 11:21:19 localhost dbus[1124]: [system] Activating service name='com. redhat.SubscriptionManager' (using servicehelper) Feb 20 11:21:19 localhost dbus-daemon: dbus[1124]: [system] Successfully activated service 'com.redhat.SubscriptionManager' Feb 20 11:21:19 localhost dbus[1124]: [system] Successfully activated service 'com. redhat.SubscriptionManager' Feb 20 11:30:01 localhost systemd: Starting Session 3 of user root. Feb 20 11:30:01 localhost systemd: Started Session 3 of user root. Feb 20 11:30:43 localhost systemd: Starting Cleanup of Temporary Directories... Feb 20 11:30:43 localhost systemd: Started Cleanup of Temporary Directories.
由于刚才关闭了会话窗口,这样的操作在传统的远程控制中一定会导致正在运行的命令 也突然终止,但在 screen 不间断会话服务中则不会这样。我们只需查看一下刚刚离线的会话 名称,然后尝试恢复回来就可以继续工作了:
[root@linuxprobe ~]# screen -ls There is a screen on: 13469.linux (Detached) 1 Socket in /var/run/screen/S-root. [root@linuxprobe ~]# screen -r linux [root@linuxprobe ~]# [root@linuxprobe ~]# tail -f /var/log/messages Feb 20 11:20:01 localhost systemd: Starting Session 2 of user root. Feb 20 11:20:01 localhost systemd: Started Session 2 of user root. Feb 20 11:21:19 localhost dbus-daemon: dbus[1124]: [system] Activating service name='com.redhat.SubscriptionManager' (using servicehelper) Feb 20 11:21:19 localhost dbus[1124]: [system] Activating service name='com. redhat.SubscriptionManager' (using servicehelper) Feb 20 11:21:19 localhost dbus-daemon: dbus[1124]: [system] Successfully activated service 'com.redhat.SubscriptionManager' Feb 20 11:21:19 localhost dbus[1124]: [system] Successfully activated service 'com.redhat.SubscriptionManager' Feb 20 11:30:01 localhost systemd: Starting Session 3 of user root. Feb 20 11:30:01 localhost systemd: Started Session 3 of user root. Feb 20 11:30:43 localhost systemd: Starting Cleanup of Temporary Directories... Feb 20 11:30:43 localhost systemd: Started Cleanup of Temporary Directories. Feb 20 11:40:01 localhost systemd: Starting Session 4 of user root. Feb 20 11:40:01 localhost systemd: Started Session 4 of user root.
如果我们突然又想到了还有其他事情需要处理,也可以多创建几个会话窗口放在一起使用。如果这段时间内不再使用某个会话窗口,可以把它设置为临时断开( detach)模式,随后在需要时再重新连接( attach)回来即可。这段时间内,在会话窗口内运行的程序会继续执行。
screen 命令不仅可以确保用户在极端情况下也不丢失对系统的远程控制,保证了生产环境中远程工作的不间断性,而且它还具有会话共享、分屏切割、会话锁定等实用的功能。其中,会话共享功能是一件很酷的事情,当多个用户同时控制主机的时候,它可以把屏幕内容共享出来,也就是说每个用户都可以看到相同的内容。
会话共享功能的流程拓扑:
要实现会话共享功能,首先使用 ssd 服务程序将终端 A 远程连接到服务器,并创建一个会话窗口。
[root@client A ~]# ssh 192.168.10.10 The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established. ECDSA key fingerprint is 70:3b:5d:37:96:7b:2e:a5:28:0d:7e:dc:47:6a:fe:5c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts. root@192.168.10.10's password: 此处输入 root 管理员密码 Last login: Wed May 4 07:56:29 2017 [root@client A ~]# screen -S linuxprobe [root@client A ~]#
然后,使用 ssh 服务程序将终端 B 远程连接到服务器,并执行获取远程会话的命令。接下来,两台主机就能看到相同的内容了。
[root@client B ~]# ssh 192.168.10.10 The authenticity of host '192.168.10.10 (192.168.10.10)' can't be established. ECDSA key fingerprint is 70:3b:5d:37:96:7b:2e:a5:28:0d:7e:dc:47:6a:fe:5c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.10.10' (ECDSA) to the list of known hosts. root@192.168.10.10's password: 此处输入 root 管理员密码 Last login: Wed Feb 22 04:55:38 2017 from 192.168.10.10 [root@client B ~]# screen -x [root@client B ~]
本文作者:Gustav
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!