远程联机服务 SSH/VNC
---------------------------------------------------------------------------------------------------------------------------------------------
1 文本接口联机服务器: SSH 服务器
---------------------------------------------------------------------------------------------------------------------------------------------
SSH(Secure Shell)是一种能够以安全的方式提供远程登录的协议,也是目前远程管理Linux系统的首选方式。
想要使用SSH协议来远程管理Linux系统,则需要部署配置sshd服务程序。sshd是基于SSH协议开发的一款远程管理服务程序,不仅使用起来方便快捷,而且能够提供
两种安全验证的方法:
基于口令的验证:用账户和密码来验证登录;
基于密钥的验证:需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,该方式相较来说更安全。
1.1 配置sshd服务
---------------------------------------------------------------------------------------------------------------------------------------------
运维人员一般会把保存着最主要配置信息的文件称为主配置文件,而配置文件中有许多以#号开头的注释行,要想让这些配置参数生效,需要在修改参数后再去掉
前面的#号。
sshd服务的配置信息保存在/etc/ssh/sshd_config文件中。sshd服务配置文件中包含的重要参数如下表所示。
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 | 是否允许空密码登录(很不安全) |
+-----------------------------------+---------------------------------------+
在RHEL 7系统中,已经默认安装并启用了sshd服务程序。接下来使用ssh命令进行远程连接,其格式为“ssh [参数] 主机IP地址”。要退出登录则执行exit命令。
一般的服务程序并不会在配置文件修改之后立即获得最新的参数。如果想让新配置文件生效,则需要手动重启相应的服务程序。最好也将这个服务程序加入到开机
启动项中,这样系统在下一次启动时,该服务程序便会自动运行,继续为用户提供服务。
[root@linuxprobe ~]# systemctl restart sshd
[root@linuxprobe ~]# systemctl enable sshd
查看服务器网络信息:
netstat -tlnp | grep ssh
客户端连接:
ssh 192.168.10.10
提示输入密码。
1.2 安全密钥验证
---------------------------------------------------------------------------------------------------------------------------------------------
加密是对信息进行编码和解码的技术,它通过一定的算法(密钥)将原本可以直接阅读的明文信息转换成密文形式。密钥即是密文的钥匙,有私钥和公钥之分。在
传输数据时,如果担心被他人监听或截获,就可以在传输前先使用公钥对数据加密处理,然后再行传送。这样,只有掌握私钥的用户才能解密这段数据,除此之外
的其他人即便截获了数据,一般也很难将其破译为明文信息。
第1步:在客户端主机中生成“密钥对”
命令:
[root@linuxprobe ~]# ssh-keygen
第2步:把客户端主机中生成的公钥文件传送至远程主机
命令:
ssh-copy-id [email protected]
或者:
将公钥复制到目标主机,然后运行:
cat 公钥.pub >> .ssh/authorized_keys
将公钥追加到授权密钥文件中。
第3步:对服务器进行设置,使其只允许密钥验证,拒绝传统的口令验证方式。记得在修改配置文件后保存并重启sshd服务程序。
编辑:
vim /etc/ssh/sshd_config
行:PasswordAuthentication no
重启服务器:systemctl restart sshd
连接:
[root@linuxprobe ~]# ssh 192.168.10.10
此时不需要密码直接登录。
■ chmod 600 .ssh/authorized_keys
-----------------------------------------------------------------------------------------------------------------------------------------
这个很重要,必须将 .ssh/authorized_keys 设为 600 ,否则免密码登录无效。
1.3 客户端 ssh 命令
---------------------------------------------------------------------------------------------------------------------------------------------
1.3.1 直接登入远程主机的命令 ssh
---------------------------------------------------------------------------------------------------------------------------------------------
语法:
[root@www ~]# ssh [-f] [-o 参数项目] [-p 非正规端口] [帐号@]IP [指令]
选项与参数:
-f :需要配合后面的 [指令] ,不登录远程主机直接发送一个指令过去而已;
-o 参数项目:主要的参数项目有: ConnectTimeout=秒数 :联机等待的秒数,减少等待的时间
StrictHostKeyChecking=[yes|no|ask]:默认是 ask,若要让 public key 主动加入 known_hosts ,则可以设定为 no 即可,对脚本很有用。避免
回答 “yes”
-p :如果你的 sshd 服务启动在非默认的端口 (22),需使用此项目;
[指令] :不登录远程主机,直接发送指令过去。但与 -f 意义不太相同。
如果不写帐号,会以本地机器的帐号尝试登录远程机器,也就是说,如果本地与远程机器具有相同的帐号,不写帐号也没关系。
■ 登录对方主机执行过指令后立刻离开的方式:
-----------------------------------------------------------------------------------------------------------------------------------------
[root@www ~]# ssh [email protected] find / &> ~/find1.log student@localhost's password:
此时你会发现画面卡住了?这是因为上面的指令会造成,已经登录远程主机,但执行的指令尚未跑完,因此会一直等待当中。
如何指定系统自己跑? 加上 -f 参数:
[root@www ~]# ssh -f [email protected] find / &> ~/find1.log
此时会立刻注销 127.0.0.1 ,但 find 指令会自己在远程服务器跑!
这个范例最有用!如果想要让远程主机进行关机的指令,如果不加上 -f 的参数,那就会等待对方主机关机完毕再断开联机,这比较不合理。因此,加上 -f
就很重要,因为会指定远程主机自己跑关机,而不需要在空空等待。例如:
ssh -f root@some_IP shutdown -h now
■ 服务器公钥记录文件: ~/.ssh/known_hosts
-----------------------------------------------------------------------------------------------------------------------------------------
当登录到远程服务器时,本机会主动的用接收到的服务器的 public key 去比对 ~/.ssh/known_hosts 有无相关的公钥, 然后进行下面的操作:
● 若接收的公钥尚未记录,则询问用户是否记录。若要记录 (范例中回答 yes 的那个步骤) 则写入 ~/.ssh/known_hosts 且继续登入的后续工作;若不
记录 (回答 no) 则不写入该文件,并且离开登录工作;
● 若接收到的公钥已有记录,则比对记录是否相同,若相同则继续登录动作;若不相同,则出现警告信息,且离开登录操作。这是客户端的自我保护功能,
避免服务器是被别人伪装的。
1.3.2 模拟 FTP 的文件传输方式: sftp
---------------------------------------------------------------------------------------------------------------------------------------------
ssh 是登录远程服务器进行工作。如果只是想要从远程服务器下载或上传文件,那就不是使用 ssh,而必须要使用 sftp 或 scp. 这两个指令也都是使用 ssh 的
通道 (port 22),只是模拟成 FTP 与复制的操作。本节探讨 sftp 命令。
用法:
sftp [email protected]
进入 sftp 之后,就跟一般的 FTP 操作没有区别了,下表列出 sftp 接口下指令用法:
+===============================================================+
| 针对远程服务器主机 (Server) 行为 |
+-----------------------------------+---------------------------+
| 变换目录到 /etc/test 或 | cd /etc/test |
| 其他目录 | cd PATH |
+-----------------------------------+---------------------------+
| 列出目前所在目录下的文件名 | ls |
| | dir |
+-----------------------------------+---------------------------+
| 建立目录 | mkdir directory |
+-----------------------------------+---------------------------+
| 删除目录 | rmdir directory |
+-----------------------------------+---------------------------+
| 显示目前所在的目录 | pwd |
+-----------------------------------+---------------------------+
| 更改文件或目录组 | chgrp groupname PATH |
+-----------------------------------+---------------------------+
| 更改文件或目录拥有者 | chown username PATH |
+-----------------------------------+---------------------------+
| 更改文件或目录的权限 | chmod 644 PATH |
+-----------------------------------+---------------------------+
| 建立连接 | ln oldname newname |
+-----------------------------------+---------------------------+
| 删除文件或目录 | rm PATH |
+-----------------------------------+---------------------------+
| 更改文件或目录名称 | rename oldname newname |
+-----------------------------------+---------------------------+
| 离开远程主机 | exit (or) bye (or) quit |
+-----------------------------------+---------------------------+
+===============================================================+
| 针对本机 (Client) 的行为(都加上 l, L 的小写) |
+-----------------------------------+---------------------------+
| 变换目录到本机的 PATH 当中 | lcd PATH |
+-----------------------------------+---------------------------+
| 列出目前本机所在目录下的文件名 | lls |
+-----------------------------------+---------------------------+
| 在本机建立目录 | lmkdir |
+-----------------------------------+---------------------------+
| 显示目前所在的本机目录 | lpwd |
+-----------------------------------+---------------------------+
+===========================================================================================+
| 针对资料上传/下载的行为 |
+-------------------------------+-----------------------------------------------------------+
| 将档案由本机上传到远程主机 | put [本机目录或文件] [远程] |
| | put [本机目录或文件]:档案会放置到目前远程主机的目录下 |
+-------------------------------+-----------------------------------------------------------+
| 将档案由远程主机下载回来 | get [远程主机目录或文件] [本机] |
| | get [远程主机目录或文件]:则文件会放置在目前本机所在的目录|
| | 当中!可以使用通配符,例如: get * get *.rpm |
+-------------------------------+-----------------------------------------------------------+
1.3.3 远程传输命令:scp
---------------------------------------------------------------------------------------------------------------------------------------------
通常使用 sftp 是因为可能不知道服务器上有什么文件存在,如果已经知道服务器上的文件名了,最简单的文件传输则是透过 scp 这个指令。
scp(secure copy)是一个基于SSH协议在网络之间进行安全传输的命令。
用法:
上传: scp [-pr] [-l 速率] file [账号@]主机:目录名
下载: scp [-pr] [-l 速率] [账号@]主机:file 目录名
选项与参数:
-p 保留原文件的权限数据;
-r 复制来源为目录时,可以复制整个目录 (含子目录);
-l 可以限制传输的速度,单位为 Kbits/s ,例如 [-l 800] 代表传输速限 100Kbytes/s
-v 显示详细的连接进度
-P 指定远程主机的sshd端口号
-6 使用IPv6协议
在使用scp命令把文件从本地复制到远程主机时,首先需要以绝对路径的形式写清本地文件的存放位置。如果要传送整个文件夹内的所有数据,还需要添加 -r 参数
进行递归操作。然后写上要传送到的远程主机的IP地址,远程服务器便会要求进行身份验证了。当前用户名称为root,而密码则为远程服务器的密码。如果想使用
指定用户的身份进行验证,可使用用户名@主机地址的参数格式。最后需要在远程主机的IP地址后面添加冒号,并在后面写上要传送到远程主机的哪个文件夹中。
只要参数正确并且成功验证了用户身份,即可开始传送工作。由于scp命令是基于SSH协议进行文件传送的,而 又设置好了密钥验证,因此当前在传输文件时,并不
需要账户和密码。
范例:
将本机的 /etc/hosts* 全部复制到 192.168.1.10 上的 devalone 用户主目录内:
scp /etc/hosts* [email protected]:~
将 192.168.1.10 这部远程主机的 /etc/bashrc 复制到本机的 /tmp 下:
scp [email protected]:/etc/bashrc /tmp
2 图形接口: VNC 服务器 (tigervnc-server-1.8.0)
---------------------------------------------------------------------------------------------------------------------------------------------
VNC ———— Virtual Network Computing
VNC server 会在服务器端启动一个监听用户要求的端口号,一般端口号码在 5901 ~ 5910 之间。当客户端启动 X server 联机到 5901 之后, VNC server 再将
一堆预先设置好的 X client 通过这个联机传递到客户端上,最终就能够在客户端显示服务器的图形接口了。
不过需要注意的是,默认的 VNC server 都是独立提供给“单一”一个客户端来联机的,因此当要使用 VNC 时,再联机到服务器去启动 VNC server 即可。所以,一
般来说,VNC server 都是使用手动启动的,然后使用完毕后, 再将 VNC server 关闭即可。整个作法其实很简单,可以这样做:
2.1 服务器设置
---------------------------------------------------------------------------------------------------------------------------------------------
■ 服务器启动命令选项:
[root@www ~]# vncserver [:端口] [-geometry 分辨率] [options]
[root@www ~]# vncserver [-kill :号码]
选项与参数:
:端口 :就是将 VNC server 开在哪个端口上,如果是 :1 则代表 VNC 5901 端口
-geometry :分辨率,例如 1024x768 或 800x600 之类的
options :其他 X 相关的选项,例如 -query localhost 之类的
-kill :将已经启动的 VNC 端口删除!依据身份控制。
■ 安装服务器软件:
-----------------------------------------------------------------------------------------------------------------------------------------
[root@www ~]# yum install tigervnc-server
■ 复制配置模板文件为vncserver@:1.service
-----------------------------------------------------------------------------------------------------------------------------------------
cp /lib/systemd/system/[email protected] /etc/systemd/system/vncserver@:1.service #复制并被重命名为vncserver@:1
cp /lib/systemd/system/[email protected] /etc/systemd/system/vncserver@:2.service #复制并被重命名为vncserver@:2
...
cp /lib/systemd/system/[email protected] /etc/systemd/system/vncserver@:10.service #复制并被重命名为vncserver@:10
■ 修改/lib/systemd/system/vncserver@:1.service配置文件
-----------------------------------------------------------------------------------------------------------------------------------------
编辑配置文件
vim vncserver@:1.service
找到下面两行修改
● User=<USER> ==> 改为:User=root
==> 改为 root 用户,考虑权限问题,其他用户也可以
● ExecStart=/usr/bin/vncserver %i
修改为: ExecStart=/usr/bin/vncserver %i -depth 16 -securitytypes=none -fp /usr/share/X11/fonts/misc
● PIDFile=/home/<USER>/.vnc/%H%i.pid ==> 此行改为:PIDFile=/root/.vnc/%H%i.pid
==> 如果不是 root 用户,修改为 PIDFile=/home/devalone/.vnc/%H%i.pid
修改后结果为:
[Service]
Type=forking
# User=<USER>
User=devalone
# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=-/usr/bin/vncserver -kill %i
# ExecStart=/usr/bin/vncserver %i
ExecStart=/usr/bin/vncserver %i -depth 16 -securitytypes=none -fp /usr/share/X11/fonts/misc
# PIDFile=/home/<USER>/.vnc/%H%i.pid
PIDFile=/home/devalone/.vnc/%H%i.pid
ExecStop=-/usr/bin/vncserver -kill %i
■ 重新加载 systemd
-----------------------------------------------------------------------------------------------------------------------------------------
由于在systemd中添加了新的内容,需要让系统重新加载:
systemctl daemon-reload
■ 为vncserver@:1.service设置密码:
-----------------------------------------------------------------------------------------------------------------------------------------
vncpasswd
■ 防火墙设置
-----------------------------------------------------------------------------------------------------------------------------------------
CentOS7 默认采用新防火墙 firewall, 不在用 iptables 。
firewall-cmd --permanent --add-service vnc-server #添加 vnc-server 访问权限
systemctl restart firewalld.service #重启firewalld
#systemctl stop firewalld.service #停止firewall(start,启动)
#systemctl disable firewalld.service #设置开机禁止firewall(enable 开机启动)
■ 启动VNC服务(设置开机启动)
-----------------------------------------------------------------------------------------------------------------------------------------
① 第一种方式:使用 Linux 服务管理配置开机自启动,经测试总是黑屏,不太好用
---------------------------------------------------------------------------------------------------------------------------------
systemctl enable vncserver@:1.service #设置开机启动
systemctl start vncserver@:1.service #启动vnc会话服务
#systemctl status vncserver@:1.service #查看nvc会话服务状态
#systemctl stop vncserver@:1.service #关闭nvc会话服务
② 第二种方式:编写 shell 启动配置文件,用户通过 ssh 登录到系统时自动启动 vncserver ,经测试这种方式很顺畅。
---------------------------------------------------------------------------------------------------------------------------------
vi ./vnc/xstartup
添加如下内容:
if [ -f ~/.vnc/xstartup ]; then
{
vncserver :1
}
fi
重新登录
vncviewer 登录时 CentOS 7 需要管理员权限配置彩色方案
2.2 客户端连接:
---------------------------------------------------------------------------------------------------------------------------------------------
■ Linux 客户端程序: vncviewer
-----------------------------------------------------------------------------------------------------------------------------------------
安装客户端:
yum install tigervnc
运行客户端:
vncviewer 192.168.1.10:1
■ win7 上的 VNC Viewer
-----------------------------------------------------------------------------------------------------------------------------------------
下载地址:http://www.realvnc.com/download/viewer/
启动 VNC Viewer, 地址栏使用服务器 IP:1 连接服务器
范例:
192.168.1.10:1
2.3 解决 CentOS 下安装 VNC server 黑屏问题
---------------------------------------------------------------------------------------------------------------------------------------------
① 查看日志 cat /root/.vnc/online.sansovo.org:1.log
发现如下报错:
/root/.vnc/xstartup: line 27: xsetroot: command not found
/root/.vnc/xstartup: line 28: xterm: command not found
/home/cake/.vnc/xstartup: line 29: twm: command not found
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server “:0″^M
after 141 requests (140 known processed) with 0 events remaining.^M
看起来是因为xsetroot/xterm/twm没有安装导致的。
使用yum安装:
# yum install xsetroot
# yum install xterm
# yum install twm
kill掉vncserver进程,然后重新启动。
# vncserver -kill :1
# vncserver :1
再次用VNCViewer连接, OK
② vi .vnc/xstartup
-----------------------------------------------------------------------------------------------------------------------------------------
添加 如下内容
gnome-session &
或
xterm -geometry 1280x960 -ls -title "$VNCDESKTOP Desktop" &
twm &
kill掉vncserver进程,然后重新启动。
# vncserver -kill :1
# vncserver :1
再次用VNCViewer连接, OK
③ 手动启动(测试使用最好使的方法):启动后 ssh 登录主机,执行: vncserver :1
-----------------------------------------------------------------------------------------------------------------------------------------
2.4 修改 VNC 分辨率大小
---------------------------------------------------------------------------------------------------------------------------------------------
调整 vncserver -geometry 参数值,默认为 1024x768
sudo vi /lib/systemd/system/vncserver@:1.service
修改 -geometry 参数值:
ExecStart=/usr/bin/vncserver %i -geometry 1280x960