针对linux管理员在维护众多服务器的时候,使用SSH公钥自动登录linux服务器,避免繁琐的用户名和密码的输入,节约登录多台服务器的时间,自动地达到同时登录多台服务器的目的。 |
作为一名 linux 管理员,在多台 Linux 服务器上登陆进行远程操作是每天工作的一部分。但随着服务器的增多,每次登陆,系统都会提示输入用户名和密码,频繁的输入用户名和密码是一件让人很烦的事情。也许有人说可以用一些客户端工具,比如:SecureCRT 等,的确使用这些软件会方便很多,但是这些软件不是价格昂贵的商业软件就是依附于特定平台才能安装使用,所以我今天介绍的是使用 ssh 自带的功能实现使用客户端工具所能带来的便利,那就是使用 ssh 的公钥密钥实现自动登陆。
测试环境:
操作系统:Red Hat Enterprise Linux AS release 4 (Nahant Update 8)
软件版本:OpenSSH_3.9p1, OpenSSL 0.9.7a
管理服务器:ip:192.168.0.1 机器名:server
被管理服务器:ip:192.168.0.2 机器名:client
首先,如果你没有安装OpenSSH,请先安装,我们现在的 linux 服务器默认都安装 openssh 的软件。
生成公钥密钥对是在管理服务器上生成的:
[root@server ~]# ssh-keygen -b 1024 -t rsa Generating public/private rsa key pair. #提示正在生成rsa密钥对 Enter file in which to save the key (/home/usrname/.ssh/id_dsa): #询问公钥和私钥存放位置,默认位置回车即可 Enter passphrase (empty for no passphrase): #询问输入私钥密语,输入密语 Enter same passphrase again: #再次提示输入密语确认 Your identification has been saved in /home/usrname/.ssh/id_dsa. #提示公钥和私钥已经存放在/root/.ssh/目录下 Your public key has been saved in /home/usrname/.ssh/id_dsa.pub. The key fingerprint is: x6:68:xx:93:98:8x:87:95:7x:2x:4x:x9:81:xx:56:94 root@server #提示key的指纹
简单说明一下:
-b 1024采用长度为1024字节的公钥/私钥对,最长4096字节,一般1024或2048就足够满足安全需要了,太长的话加密解密需要的时间也增长。
-t rsa 采用rsa加密方式的公钥/私钥对,除了rsa还有dsa方式,rsa方式最短不能小于768字节长度。
如果还需要使用更多其他参数请参考man ssh-keygen。
在生成密钥对的过程中你被询问:输入密码短句 Enter passphrase (empty for no passphrase) ,密码短句(passphrase)是你使用一个短语或者一句话作为密码输入,再由系统内部的加密或是散列算法生成虚拟密码后,进行下一步的认证。好处是增强了安全性不易被破解。看过很多文章,里面都把这个短句输入为空,也就是代表不使用密码短句。在这里我强烈要求你输入密码短句。有人会说使用密码短句后,登陆还要输入密码短句这样使用没有比使用用户名和密码登陆方便多少,我说请你不要急,接着看我的文章。
注意:如果你生成密钥对而不设置密码短语,那么如果你的私钥丢失了,那么就你的麻烦可能会比丢失用户名密码还严重。
在你的管理服务器上把你的公钥拷贝到被管理服务器上要进行自动登陆的用户目录下。
[root@server ~]# scp .ssh/id_dsa.pub remote_usrname@192.168.0.2: #比如你想使用用户peter登陆,则remote_usrname请以peter代替
登陆被管理的服务器,进入需要远程登陆的用户目录,把公钥放到用户目录的 .ssh 这个目录下(如果目录不存在,需要创建~/.ssh目录,并把目录权限设置为700),把公钥改名为authorized_keys2,并且把它的用户权限设成600。
[peter@client ~]$ ls id_rsa.pub [peter@client ~]$ mkdir ~/.ssh #如果当前用户目录下没有 .ssh 目录,请先创建目录 [peter@client ~]$ chmod 700 ~/.ssh [peter@client ~]$ mv id_rsa.pub ~/.ssh [peter@client ~]$ cd ~/.ssh [peter@client ~]$ cat id_rsa.pub >> authorized_keys2 [peter@client ~]$ rm -f id_rsa.pub [peter@client ~]$ chmod 600 authorized_keys2 [peter@client ~]$ ls -l total 4 -rw------- 1 peter peter 225 Oct 10 11:28 authorized_keys2
[root@server ~]# ssh peter@192.168.0.2 Enter passphrase for key '/root/.ssh/id_rsa': #提示输入密码短语,请输入刚才设置的密码短语 Last login: Sun Oct 10 11:32:14 2010 from 192.168.0.1 [peter@client ~]$
如果你不能用正确的登录,应该重新检查一下你的authorized_keys2的权限。
使用 ssh-agent(ssh代理)自动输入密码短语牢记你的“密码短句”,现在你可以用你的密钥而不是密码来登录你的服务器了,但是这样仍然没有省什么事,你还是要输入密钥的“密码短语”。有更简便的方法吗?答案就是采用SSH代理(ssh-agent),一个用来帮你记住“密码短语”的程序。 ssh-agent是OpenSSH中默认包括的ssh代理程序。
登陆管理服务器[root@server ~]# ssh-agent SSH_AUTH_SOCK=/tmp/ssh-vEGjCM2147/agent.2147; export SSH_AUTH_SOCK; SSH_AGENT_PID=2148; export SSH_AGENT_PID; echo Agent pid 2148;
当你运行ssh-agent,它会打印出来它使用的 ssh 的环境和变量。要使用这些变量,有两种方法,一种是手动进行声明环境变量,另一种是运行eval命令自动声明环境变量。
方法一:手动声明环境变量
[root@server ~]# SSH_AUTH_SOCK=/tmp/ssh-vEGjCM2147/agent.2147; export SSH_AUTH_SOCK; [root@server ~]# SSH_AGENT_PID=2148; export SSH_AGENT_PID; [root@server ~]# printenv | grep SSH #检查 ssh 环境变量是否已经加入当前会话的环境变量 SSH_AGENT_PID=2148 SSH_AUTH_SOCK=/tmp/ssh-vEGjCM2147/agent.2147
方法二:运行eval命令自动声明环境变量
[root@server ~]# eval `ssh-agent` Agent pid 2157 [root@server ~]# printenv | grep SSH #检查 ssh 环境变量是否已经加入当前会话的环境变量 SSH_AGENT_PID=2148 SSH_AUTH_SOCK=/tmp/ssh-vEGjCM2147/agent.2147
现在 ssh-agent 已经在运行了,但是 ssh-agent 里面是空白的不会有解密的专用密钥。我们要告诉它我们有私钥和这个私钥在哪儿。这就需要使用 ssh-add 命令把我们的专用密钥添加到 ssh-agent 的高速缓存中。
[root@server ~]# ssh-add ~/.ssh/id_dsa Enter passphrase for /home/user/.ssh/id_dsa: #输入你的密码短语 Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa) [root@server ~]# ssh-add -l #查看 ssh代理的缓存内容 1024 72:78:5e:6b:16:fd:f2:8c:81:b1:18:e6:9f:77:6e:be /root/.ssh/id_rsa (RSA)
输入了密码短句,现在好了,你可以登录你的远程服务器而不用输入你的密码短语了,而且你的私钥是密码保护的。
[root@server ~]# ssh peter@192.168.0.2 Last login: Sun Oct 10 11:32:45 2010 from 192.168.0.1 [peter@client ~]$
登陆服务器进行操作结束后,记得还要把 ssh-agent 关掉,不然其他人登陆后也可以远程了。
[root@server ~]# ssh-agent -k unset SSH_AUTH_SOCK; unset SSH_AGENT_PID; echo Agent pid 2148 killed; [root@server ~]# ssh-add -l #查看一下,缓存里已经没有了密钥了 The agent has no identities.
当然了如果管理数量众多的服务器(服务器数量≥2位数),第一次上传公钥可能会是比较累的工作,但是以后就可以在维护工作中体会这种公钥密钥自动登陆的便利了。
原文来自:http://7056824.blog.51cto.com/69854/403669
本文地址: http://www.linuxprobe.com/ssh_linux_server.html
本文来自博客园,作者:linux_pro,转载请注明原文链接:http://www.cnblogs.com/linuxpro/p/17420360.html
一:插件记录AtlanticNight AuroraX autoDocstring BetterComments BracketPairColorizer BracketsLightPro Chinese CodeRunner CodeSpellChecker DraculaOffical FireFlyPro GitLens Helium Ini-format Jupyter JupyterKeymap JupyterNotebookRenderers Kite OpenInDefaultBrowser PathAutocomplete Pylance Python SettingSync TabOut Topper VSCodeGreatIcons复制二.vscode配置远程编辑1.安装remotedevelopment插件2.同时按ctrl+shift+p,选择addnewsshhost3.按照格式填入对应的用户和IPsshroot@192.168.120.66-A4.然后选择第一个配置文件,如下图5.输入密码即可6.然后切换到远程界面,点击箭头指向的类似于文件夹图标7.弹出新窗
说一下项目中常见的甲方的需求。背景如下:Order在SF端生成以后,在status为completed以后,需要点击按钮同步到SAP或者其他的MDM,客户希望的是,如果order的状态为completed以后,才展示customaction/button,点击以后同步,如果状态为draft场景,则不展示。我们的solution通常是告诉客户,action/button配置在pagelayout以后,无法进行移除,我们在点击按钮以后,可以先判断状态,如果状态不为completed以后,就给客户报一个错误,告诉客户当前状态不允许同步。尽管需求可以实现,但是总归不是客户最想要的。当然,和上一篇博客的dynamicform相似,salesforce同样也针对此种类似的需求推出了dynamicaction。以后这种类似的需求就可以通过dynamicaction快速高效的解决了。一.DynamicActionDynamicAction和dynamicform相同,启用以及配置的入口都是在lightningappbuilder中,所以如果你的项目是classic的,肯定是用不了的。和dynamicf
代码链接:https://github.com/watersink/mtcnn-linux-as本代码可以在模拟器下进行跑。环境:windows10Androidstudio3.6Sdk:android10api29Ndk:r15cNcnn:20200226Linux下的代码测试:cdmtcnn_linux/build cmake.. make ./mtcnn复制如果可以跑通,输出正确结果,证明mtcnn代码的准确性。实际操作的时候,首先基于linux把c++代码调试通,方便后续的android调试。Android进行c++调试时,使用__android_log_print函数进行log的输出,开发:(1)工程建立新建android工程,选择NativeC++,工程名为mtcnn,C++Standard选择c++11(2)资源文件res修改:src/main/res/drawable下面随便复制一张带有人脸的照片,比如这里,复制了一张beauty.pngsrc/main/res/layout下面新加main.xml。详细内容,<?xmlversion="1.0"
107.二叉树的层次遍历II给定一个二叉树,返回其节点值自底向上的层次遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如: 给定二叉树[3,9,20,null,null,15,7],3 /\ 920 /\ 157复制返回其自底向上的层次遍历为:[ [15,7], [9,20], [3] ]复制解题思路以及代码首先这个题是在二叉树的层次遍历的基础上进行的。 可以看一下,我写的这个题解: LeetCode102.二叉树的层序遍历这里就不在啰嗦层次遍历了。如果你不懂二叉树的遍历可以看: 我是怎么一步一步调试出来二叉树的遍历(超精彩配图),二叉树遍历再也不用愁了解这个题时,我们可以使用链表的头插法进行插入。每一层的List都插入另一个List的头部,即可完成本题。由于太简单了,所以就不添加注释了。只改动了一个地方: lists.add(0,list);核心代码:staticpublicList<List<Integer>>levelOrder(TreeNoderoot){ List<List<Integer>>lists=ne
安全,区块链领域举足轻重的话题,为什么一行代码能瞬间蒸发几十亿市值?合约底层函数的使用不当会引起哪些漏洞?游戏合约中又存在哪些漏洞? 「区块链大本营」携手「成都链安科技」团队重磅推出「合约安全漏洞解析连载」,以讲故事的方式,带你回顾区块链安全走过的历程;分析漏洞背后的玄机。让开发者在趣味中学习,写出更加牢固的合约,且防患于未然。 当然,这些文章并不是专为开发者而作的,即使你不是开发者,当你读完本连载,相信再有安全问题爆出时,你会有全新的理解。引子:故纸堆里寻惑源,多少旧事屡重演——无名上回说到:地址恢复功亏一篑,身份判断轻虑浅谋。逻辑补全自圆其说,原理辨析帷幄运筹。没看过的请戳:合约安全漏洞连载之五本回咱们来聊聊:区块链游戏江山如画,安全防护未规划,一片残阳西挂。区块链行业日新月异,发展迅猛,各个公链及项目方奇思妙想层出不穷。俗话说,玩是人的天性,将数字货币与游戏结合,运用游戏的机制吸引投资者参与到互动中来的想法以标新立异、推陈出新的姿态引领了最近的潮流。各种区块链游戏聚集大量的虚拟货币,价值动辄上千万,承诺下的丰厚回抱吸引了越来越多的目光,投资者们跃跃欲试,人人都想充当“头号
作者:JJian 原文:JJianwww.cnblogs.com/jian0110/p/9452592.html复制前言SqlSession是Mybatis最重要的构建之一,可以简单的认为Mybatis一系列的配置目的是生成类似JDBC生成的Connection对象的SqlSession对象,这样才能与数据库开启“沟通”,通过SqlSession可以实现增删改查(当然现在更加推荐是使用Mapper接口形式),那么它是如何执行实现的,这就是本文所介绍的东西,其中会涉及到简单的源码讲解。了解SqlSession的运作原理是学习Mybatis插件的必经之路,因为Mybatis的插件会在SqlSession运行过程中“插入”运行,如果没有很好理解的话,Mybatis插件可能会覆盖相应的源码造成严重的问题。鉴于此,本文将尽量详细介绍SqlSession运作原理!1、SqlSession简单介绍(1)SqlSession简单原理介绍SqlSession提供select/insert/update/delete方法,在旧版本中使用使用SqlSession接口的这些方法,但是新版的Mybatis中就会
搜索人名是我们在许多应用程序中经常用到的功能。比如对书店来说,按作者名检索的功能就相当重要。虽然很难起一个完美的名字,但是我们可以使用Solr的一些功能,使绝大多数英文名搜索达到绝佳的效果。还记得“作者阿尔法”的辉煌时代吗?我们可以从这样的假设出发,即除了人名中的差异之外,我们作者域中的一个名字很像单个域中的一小部分标记。我们要避免把这些名字中的姓,名和中间部分分开(假设这个规则适用于所有文化背景)。我们先看看作者域中的一些样本名称:作者:DougTurnbullTurnbull,DouglasTurnbull,DouglasG.Turnbull,D.G.D.GraemeTurnbull好了,您已经可以清楚看出我们在表示英语人名时的差异,这让我们有了检索方法。首先,为了记录,我们在作者域中使用这个非常基本的分析链,它将完成删除标点符号和统一小写字母的工作:<fieldTypename="AuthorsType"class="solr.TextField"positionIncrementGap="100"> <
项目地址:https://github.com/luxiaoming/awesome-android-ui本文推荐一些常用的UI库,方便快速开发app,避免重复开发控件,引出不必要的bug。主要推荐一些按钮,退表,标签,列表,动画和特效。关于最新的一些UI控件,可以搜索AndroidSupportLibrary来查看官方引入的新的UI。或者看文章末尾的链接,了解相关内容。推荐理由: 可以借鉴里面的实现原理,能够方便我们开发使用,部分效果图为:Android-ObservableScrollView这个库可以推荐下,里面有一些关于滚动条的事件处理,(当然现在可以直接用AndroidSupportLibrary里面的控件替换了)。AndroidViewAnimations动画推荐这个,比起原生的,这个很简单,使用操作也比较友好。MaterialEditText一个实现的Material风格的编辑框,值得一看。效果截图:扩展链接:http://www.open-open.com/lib/view/open1436152483833.htmlhttp://www.jcodecraeer.com
大家好,又见面了,我是你们的朋友全栈君。1.数据类型的种类 js一共有六种数据类型其中有五种简单数据类型 包括:String、Number、Boolean、undefined、Null2.数据类型的检测 可以使用typeof来检测数据类型: “undefined”–>这个变量是未定义的(为初始化的变量和未声明的变量的typeof操作都返回undefined) ”boolean“–>这个值是布尔值 ”string“–>这个值是字符串 ”number“–>这个值是数字 ”object“–>这个值为null或者obejct ”function“–>这个值是函数toString:注意,不可以转null和underfinedString()方法可以转换其他类型1,number类型的变量+“”,当+两边一个操作符是字符串类型,一个操作符是其它类型的时候,将返回字符串类型的数据。2,Number()方法:Number()可以把任意值转成数值类型,如果目标字符串中,只要有一个字符不是数值型的字符,返回NaN,也就是说Number()只能用来转换纯数字的字符串。3,p
必读: Android12(S)图像显示系统-开篇 前言 Android源码中有包含drm_hwcomposer:/external/drm_hwcomposer/ drm_hwcomposer这个过程下的代码架构变化还是很频繁的,我这里分析直接去drm_hwcomposer的官方地址抓取最新的code来做分析了 解析 这个工程编译后会产生sharedlibrary:/vendor/lib/hw/hwcomposer.drm.so drm_hwcomposer作为一个HALmodule,其写作实现还是遵循了旧有的AndroidHALModule的接口实现规则。 看看一些结构体的定义以及他们之间的关系: 结构体hw_device_t的定义 [/hardware/libhardware/include/hardware/hardware.h] typedefstructhw_device_t{ tag;/**tagmustbeinitializedtoHARDWARE_DEVICE_TAG*/ uint32_tversion; structhw
转自https://www.jianshu.com/p/6e9e4156ece3 本篇文章篇幅比较长,先来个思维导图预览一下。 一张图带你看完本篇文章 一、概述 1.计算机网络体系结构分层 计算机网络体系结构分层 2.TCP/IP通信传输流 利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则从链路层往上走。如下: TCP/IP通信传输流 首先作为发送端的客户端在应用层(HTTP协议)发出一个想看某个Web页面的HTTP请求。 接着,为了传输方便,在传输层(TCP协议)把从应用层处收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。 在网络层(IP协议),增加作为通信目的地的MAC地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了。 接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层。当传输到应用层,才能算真正接收到由客户端发送过来的HTTP请求。 如下图所示: HTTP请求 在网络
函数功能: 该函数是由应用程序定义的与函数EnumFontFamilies一起使用的回调函数,它接 收用于描述与可用字体的数据。类型FONTENUMPROC定义了一个指向此回调函数的指针,Enum FontFamProc是应用程序定义的函数的名字的占位符。 函数原型:intCALLBACKEnumFontFamProc(ENUMLOGFONTFAR*lpelf,NEWTEXTMETRICFAR*lpntm,intFontType,LPARAMlParam); 参数: lpelf:指向结构ENUMLOGFONT的指针,该结构包含字体的逻辑属性。该结构是局部定义的。 lpntm:指向结构NEWTEXTMETRIC的指针,该结构包含TrueType字体的物理属性。如果该字体不是TrueType字体,此参数为指向结构TEXTMETRIC的指针。 FontType:指定字体的类型,此参数可以是下列值的组合: DEVICE_FONTTYPE,RASTER_FONTTYPE,TRUETYPE_FONTTYPE。 lParam:指向由函数EnumFontFamilies传来的应用程序定义的
16.1如何将基本数据类型转换成CString类型 用CString的Format方法 voidCDemoView::OnDraw(CDC*pDC) { inta=100; doubleb=1.23; //将整型转换成CString CStringstr1=_T(""); str1.Format(_T("%d"),a); //将实型转换成CString CStringstr2=_T(""); str2.Format(_T("%f"),b); CStringstrText=_T(""); strText.Format(_T("str1=%s"),str1); pDC->TextOut(100,50,strText); strText.Format(_T("str2=%s"),str2); pDC->TextOut(100,100,strText); } 复制 16.2如何将CString类型转换成基本数据类型 atoi:Convertastringtointeger. 参考:http://baike.baidu.com/view/653935.htm voidCDe
JAVA世界 MediaScanner MediaScanner.java native_init(); processFile(); JNI层 libmedia_jni.so android_media_mediaScanner.cpp android_media_MediaScanner_native_init Natvie世界 libmedia.so 关注:native_init与android_media_MediaScanner_native_init是如何对应的?注册。 注册有静态注册和动态注册两种: 1、静态注册,编写MediaScanner.javajava-ojavah-o生成android_media_MediaScanner.h JNIEXPORTvoidJNICALLJava_android_media_MediaScanner_native_linit JNIEXPORTvoidJNICALLJava_android_media_MediaScanner_processFile 2、动态注册 由结构体JNIN
下面是C++中字符编码格式转换(包括ANSI转换为UTF8,UTF8转换为ANSI,ANSI转换为unicode,unicode转换为ANSI,UTF8转换为unicode,unicode转换为UTF8),大小写转换等常用方法,写在这儿,免得忘掉。 头文件: 1#pragmaonce 2 3#include<string> 4#include<vector> 5 6namespaceHi 7{ 8boolreplace(std::string&source,constchar*old,constchar*newStr); 9 10voidtoLower(std::string&source); 11 12voidtoUpper(std::string&source); 13 14/** 15*@brief将utf-8编码的字符串转换为unicode编码的字符串。 16*@param[in]strutf-8编码的字符串 17*@param[out]contentunicode编码的字符串 18*@retvaltrue:成功,
QAQ: A. TwoRabbits 题意: 有两只兔子,距离为n,左边兔子每秒向右跳a,右边兔子每秒向左跳b,问两只兔子何时能相遇,如果不能相遇输出-1。 思路: #include<bits/stdc++.h> usingnamespacestd; typedeflonglongLL; constintmaxn=1e3+10; intmain() { intT; scanf("%d",&T); while(T--) { LLx,y,a,b; cin>>x>>y>>a>>b; if((y-x)%(a+b)!=0) printf("-1\n"); else cout<<(y-x)/(a+b)<<"\n"; } return0; }复制 简单题,直接模拟即可,详细见代码。 代码: B. LongestPalindrome 题意: 给你n个等长的字符串,求由这n个字符串构成的最长的镜像串 思路: 如果有两个是对称的那一定要加上,如果可能的话在中间再放上一个本身是镜
数据库故障学习 数据库管理系统的运行方式 DBMS利用内存和外存这样的存储体系来进行数据库管理。 在内存中,又将其分为程序数据(事务数据)和系统数据。 事务是DBMS对数据库进行控制的基本逻辑单元。 故障恢复涉及到如何保证原子性和持久性。 数据库故障类型 事务故障 某一个事务自身运行错误所引起的故障,影响该事务本身。 系统故障 由于断电,非正常关机等引起的故障,影响正在运行的事务以及数据库缓冲区将涉及正在运行和已经运行的事务。 介质故障 由于介质损坏等所引起的故障,影响是全面的,既影响内存中的数据,又影响介质中存储的数据。 数据库故障恢复 定义 把DB由当前不正确状态恢复到已知为正确的某一状态。 注意 故障恢复是DBMS核心技术 事务故障恢复的手段 事务故障可通过重做事务Redo和撤销事务Undo来恢复。重做事务可保证已提交事务的持久性,而撤销事务则消除未提交事务的影响。 系统故障恢复的手段 运行日志SystemLog 运行日志是DBMS维护的一个文件,该文件以流水方式记录了每一个事务对数据库的每一次操作及操作顺序。 运行日志直接写入介质存储上,会保持正确性。
第二章JavaScript时间格式化 2.1Ticks转换为常规日期 2.2常规日期格式化 <input type="button" value="时间格式化" onclick="datetimeFormart('/Date(1388505600000)/')" /> <input type="button" value="时间格式化" onclick="datetimeFormart('/Date(1388505600000)/')" /> <script type="text/javascript"> Date.prototype.format=function(timeStr){ varo={ "M
Redis是一种NoSQL的文档数据库,通过key-value的结构存储在内存中,Redis读的速度是110000次/s,写的速度是81000次/s,性能很高,使用范围也很广。 下面用一个实例实现redis的读写分离,步骤如下: 第一步:下载redis 官网下载地址: https://redis.io/download 下载最新的稳定版,解压拷贝到~/redis中 编译代码: $make $test复制 第二步:配置redis 编辑redis.conf文件 bind127.0.0.1 port6379 复制 拷贝redis.conf文件,改名为slave.conf,打开编辑 bind127.0.0.1 port6380 slaveof127.0.0.16379 复制 第三步:运行服务 开启【主服务】 $src/redis-server 复制 开启【从服务】 $src/redis-serverslave.conf复制 运行【主服务】的客户端 $src/redis-cli复制 运行【从服务】的客户