linux工程师,RHCE
分类: 系统运维
2021-12-13 14:20:29
最近在写自动化测试用例的时候经常会用python语言去实现文件的上传下载功能,这里主要用到的就是SSH协议。为了更好的理解SSH协议,我就翻看了手头的书,回顾SSH的相关知识点,今天就把它总结下,希望对用到SSH协议的小伙伴能够有所帮助。
SSH是一种不同于HTTP协议的网络协议,用于服务器之间的加密登录。如果一个用户想从本地使用SSH协议登录另一台远程服务器,需要对方服务器的用户名,密码,地址。这是目前Linux系统进行远程管理的首选方式。最开始的时候,互联网都是明文通信,一旦被截获,信息就被暴露无遗,因此很不安全,很容易被黑攻击而导致网站瘫痪。自从SSH协议问世之后,因其安全性很快成为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 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协议,从配置到使用都有很详细的介绍。不管你处于什么水平,都很适合你去查阅。