远程联机服务 SSH/VNC


远程联机服务 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






猜你喜欢

转载自blog.csdn.net/devalone/article/details/80550420