Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1142199
  • 博文数量: 1096
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 11060
  • 用 户 组: 普通用户
  • 注册时间: 2018-03-07 15:17
个人简介

linux工程师,RHCE

文章分类

全部博文(1096)

文章存档

2023年(84)

2022年(314)

2021年(251)

2020年(244)

2019年(176)

2018年(27)

我的朋友

分类: 系统运维

2021-12-13 14:20:29


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


一、何为SSH协议?

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

二、如何配置sshd服务

我们说系统中一切皆文件,那么作为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 root@20.10.115.201

Password:

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

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

四、远程传输命令

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

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

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

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

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

阅读(343) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~