Linux之SSH协议知识点总结

最近在写自动化测试用例的时候经常会用python语言去实现文件的上传下载功能,这里主要用到的就是SSH协议。为了更好的理解SSH协议,我就翻看了手头的书,回顾SSH的相关知识点,今天就把它总结下,希望对用到SSH协议的小伙伴能够有所帮助。

 

一、何为SSH协议?

SSH是一种不同于HTTP协议的网络协议,用于服务器之间的加密登录。如果一个用户想从本地使用SSH协议登录另一台远程服务器,需要对方服务器的用户名,密码,地址。这是目前Linux系统进行远程管理的首选方式。最开始的时候,互联网都是明文通信,一旦被截获,信息就被暴露无遗,因此很不安全,很容易被黑攻击而导致网站瘫痪。自从SSH协议问世之后,因其安全性很快成为Linux系统的标配。

二、如何配置sshd服务

我们说“Linux系统中一切皆文件”,那么作为Linux系统远程管理的首选,我们要对哪个文件做怎样的配置呢?sshd服务的配置在系统的/etc/ssh/sshd_config文件中,我们可以打开此文件看看里边都有啥配置。这个配置文件我用的最多的就是开启虚机的root权限,可以用vim文本编辑器打开此配置文件,然后把第48行#PermitRootLogin yes参数前的#去掉,然后保存文件并退出,仅仅是这样文件是没生效的,一定要记得重启sshd服务,也就是在系统中执行service sshd restart命令,这样才算真正把该虚机的root权限打开。这里附上用python语言实现该功能的代码:

def create_ssh_connect_object(ip_remote, port_remote, username, password):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        print('Connecting to {0}:{1}'.format(ip_remote, port_remote))
        ssh.connect(ip_remote, port_remote, username=username, password=password, timeout=TIMEOUT)  # timeout protection
        return ssh
    except:
        print('Failed to connect {0}, now will retry'.format(ip_remote))
        ssh.connect(ip_remote, port_remote, username=username, password=password, timeout=TIMEOUT)  # timeout re-try
        print('Retry failed, please check the IP, port, account

and password')

def permit_root_login():
    """
    Enable ssh connection for root
    """
    ssh = create_ssh_connect_object(VXM_IP, 22, VXM_USER, VXM_PASSWORD)
    print('Connecting to new VxRail Manager with mystic')
    channelSSHOb = ssh.invoke_shell()
    remove_offending_key_cmd = 'ssh-keygen -R {0} -f /root/.ssh/known_hosts'.format(NEW_VXM_IP)
    channel_exe_cmd(channelSSHOb, remove_offending_key_cmd)
    connect_to_new_vxm_cmd = 'ssh -o "StrictHostKeyChecking no" mystic@{0}'.format(NEW_VXM_IP)
    if channel_exe_cmd(channelSSHOb, connect_to_new_vxm_cmd).endswith(u"Password: "):
        print('Entering the password for mystic')
        mystic_pwd = 'mystic'
        channel_exe_cmd(channelSSHOb, mystic_pwd)
    change_to_root_cmd = 'su'
    if channel_exe_cmd(channelSSHOb, change_to_root_cmd).endswith(u"Password: "):
        print('Switch user to root')
        root_pwd = 'Passw0rd!'
        channel_exe_cmd(channelSSHOb, root_pwd)
    print('Permit root login for SSH')
    permit_root_login_cmd = "sed -i 's/PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config"
    channel_exe_cmd(channelSSHOb, permit_root_login_cmd)
    restart_sshd_cmd = 'service sshd restart'
    channel_exe_cmd(channelSSHOb, restart_sshd_cmd)
    ssh.close()

三、安全密钥验证

SSH作为一种安全的远程登录协议,它是怎么实现安全验证的呢?

SSH提供了两种安全的验证方法:

  1. 基于口令的验证,也就是用账户和密码来进行登录验证。如:

mystic@mystic-vm:~$ ssh [email protected]

Password:

这种方式需要用户提供用户名和密码,很像我们看的抗日战争片中,共产党想要夜袭日本的军备司令部,想要进入大门,经常会要对暗号,这个暗号就像密码,对,则放行,不对,则拦截。

  1. 基于密钥的验证,这种方法类似于需要用钥匙开门,一把钥匙开一个门,钥匙不对,则门就打不开,不管你是谁。我只认钥匙。作为一个码农,这个是在我们使用Github的时候使用SSH协议克隆代码经常会用到的,我们想要在某台虚机上克隆github的代码,就先要在该虚机上生成密钥对,然后把密钥对中的公钥上传至github,让该虚机和github相互识别,然后才能成功的把代码克隆到该虚机。

四、远程传输命令

在我们的日常工作中,经常会涉及到文件在不同服务器之间的上传下载,最方便快速的方式是使用scp命令,scp也是基于SSH协议的,scp的语法格式:

 把本地文件上传到远程服务器:Scp  [参数] 本地文件 远程账户@远程IP 地址:/远程目录

 把远程服务器文件下载到本地:Scp  [参数] 远程账户@远程IP 地址:/远程目录 本地目录

使用scp命令进行文件的上传下载时,一定要写清楚文件的具体位置,如果是压缩文件,记得加参数-r进行递归操作。只要文件地址正确,远程服务器的账户密码正确,就可以开始文件的传输工作,这种方式比我们用文件传输工具传输文件更高效,省去了登录工具的麻烦,同时传输效率也更快。

以上就是我日常工作中经常用到SSH协议的使用场景,总结的可能不是很全面,毕竟认知有限,有疏漏的地方欢迎大家给予指正,如果说刚好你的工作中也需要用到这些,希望对你有所帮助。如果你还想对SSH协议有更深层次的理解,但苦于找不到好资料,这里推荐给你《Linux就该这么学》这本书,这本书的第9章很全面的介绍了SSH协议,从配置到使用都有很详细的介绍。不管你处于什么水平,都很适合你去查阅。

Guess you like

Origin blog.csdn.net/yaxuan88521/article/details/121810232