对于linux运维工作者而言,使用ssh远程远程服务器是再熟悉不过的了!对于ssh的一些严格设置也关系到服务器的安全维护,今天在此,就本人工作中使用ssh的经验而言,做一些总结记录来下。 bash:ssh:commandnotfound 解决办法:yuminstallyopensshserveropensshclinets 1。ssh登录时提示:Readfromsocketfailed:Connectionresetbypeer。 尝试了很多解决方案均无效,无奈!卸载sshd,然后重新安装 yumremoveopenssh rmrfetcssh yuminstallyopenssh systemctlstartsshd。service 2。ssh远程登陆后的提示信息 我们经常会使用中控机ssh信任跳转到其他机器上,但是不知道有没有运维朋友注意到ssh跳转成功后的终端显示的提示信息? 这些提示信息,是为了方便我们在第一时间知道ssh跳转到哪台目标机上,也是为了避免长期频繁跳转后由于大意造成的误入机器操作的风险,我们通常会在ssh跳转到目标机器后显示一些提示信息,在一些国家,登入给定系统前,给出未经授权或者用户监视警告信息,将会受到法律的保护。如下: 〔rootbastionIDC〕sshp22192。168。1。15 Lastlogin:FriJul1513:26:532016from124。65。197。154 HOSTNAME:monitserver IPADDRES:192。168。1。15 IDC监控机 那么上面的提醒信息是在哪设置的呢? 做法一:其实很简单,这些信息是在目标机器的etcmotd文件里自定义的 〔rootmonitserver〕catetcmotd HOSTNAME:monitserver IPADDRES:192。168。1。15 IDC监控机 做法二:在目标机器的etcsshsshdconfig文件里定义,然后重启sshd服务即可。这两种做法是一致的效果! Banneretcsshfile 〔roothost1921681117〕catetcsshfile thisis192。168。1。117 远程登陆: 〔rootlinuxnode2〕ssh192。168。1。117 thisis192。168。1。117 〔roothost1921681117〕 3。实现SSH无密码登录:使用sshkeygen和sshcopyid sshkeygen产生公钥与私钥对。 sshcopyid将本机的公钥复制到远程机器的authorizedkeys文件中,sshcopyid也能让你有到远程机器的homeusername。ssh和。sshauthorizedkeys的权利。 操作记录: 1)第一步:在本地机器上使用sshkeygen产生公钥私钥对 sshkeygentrsa一路默认回车 这样就会在当前用户家目录下的。ssh目录里产生公钥和私钥文件:idrsa。pub、idrsa。可以将idrsa。pub公钥文件复制成authorizedkeys 2)第二步:可以手动将本机的idrsa。pub公钥文件内容复制到远程目标机的。sshauthorizedkeys文件中,可以就可以实现ssh无密码登陆。 当然,也可以在本机直接使用sshcopyid将公钥复制到远程机器中 sshcopyidiroot。sshidrsa。pubuserip把本机的公钥拷贝到远程机器上,比如B机器 也可以不加公钥路径,会默认加上 sshcopyiduserip 注意: sshcopyid将key写到远程机器的。sshauthorizedkey。文件(文件会自动创建)中 对于非22端口(比如22222)情况下的sshcopyid的使用,需要这样用: sshcopyidiroot。sshidrsa。pubp22222root192。168。18。18 3)这样,本机登录到上面远程机器(B机器)就不用输入密码 sshuserip 4。ssh登录失败,报错:Pseudoterminalwillnotbeallocatedbecausestdin 现象: 需要登录线上的一台目标机器A,但是不能直接登录(没有登录权限),需要先登录B机器,然后从B机器跳转到A机器。 脚本如下: localhost:rootcatIDC7。sh !binbash sshroot101。201。114。106sshp25791root103。10。86。7 但是在执行脚本的时候报错如下: Pseudoterminalwillnotbeallocatedbecausestdin 原因: 伪终端将无法分配,因为标准输入不是终端。 解决办法: 需要增加tt参数来强制伪终端分配,即使标准输入不是终端。 在脚本里添加tt参数即可,如下: localhost:rootcatIDC7。sh !binbash sshroot101。201。114。106sshttp25791root103。10。86。7 或者 localhost:rootcatIDC7。sh !binbash sshtroot101。201。114。106sshttp25791root103。10。86。7 5。ssh远程登陆缓慢问题 解决办法: 编译etcsshsshdconfig配置文件: UseDNSno GSSAPIAuthenticationno 然后重启sshd服务即可! 6。ssh登录出现:permissiondenied(publickey。gssapiwithmic) 解决方法: 修改etcsshsshdconfig文件,将其中的: PermitRootLoginno修改为yes PubkeyAuthenticationyes AuthorizedKeysFile。sshauthorizedkeys前面加上屏蔽掉 PasswordAuthenticationno修改为yes 最后重启sshd服务即可! 7。ssh连接错误问题 1)在使用ssh或scp或rsync远程连接的时候,出现如下报错: Addressmapstolocalhost,butthisdoesnotmapbacktotheaddressPOSSIBLEBREAKINATTEMPT! 解决方法: 修改本机sshconfig文件 〔rootkvmserver〕vimetcsshsshconfig GSSAPIAuthenticationno 〔rootkvmserver〕etcinit。dsshdrestart 问题迎刃而解 2)本机scp、rsync命令都已具备,但是在使用scp或rsync远程同步的时候报错: bash:scp:commandnotfound bash:rsync:commandnotfound 原因:是由于远程机器上没有安装scp或rsync造成的!安装这两个命令即可 yuminstallopensshclients yuminstallrsync 3)远程ssh连接时错误TheX11forwardingrequestwasrejected! 解决方法: 将sshdconfig中设置X11Forwardingyes 重启sshd服务。 8。ssh连接超时被踢出问题 当使用xshell,SecureCRT等客户端访问linux服务器,有时候会出现终端定期超时被踢出的情况。 下面介绍三种方法来防止超时被踢出的方法,后两种情况的设置方法以及通过设置shell变量来达到此目的的方法: 1、配置服务器 vimetcsshsshdconfig 1)找到ClientAliveInterval参数,如果没有就自己加一行 数值是秒,比如你设置为120,则是2分钟 ClientAliveInterval120 2)ClientAliveCountMax 指如果发现客户端没有响应,则判断一次超时,这个参数设置允许超时的次数。如3、5等自定义 修改两项参数后如下: ClientAliveInterval120 ClientAliveCountMax30不允许超时次数 修改etcsshsshdconfig文件,将ClientAliveInterval0和ClientAliveCountMax3的注释符号去掉,将ClientAliveInterval对应的0改成60,没有就自己输入。 ClientAliveInterval指定了服务器端向客户端请求消息的时间间隔,默认是0,不发送。而ClientAliveInterval60表示每分钟发送一次,然后客户端响应,这样就保持长连接了。ClientAliveCountMax,使用默认值3即可。ClientAliveCountMax表示服务器发出请求后客户端没有响应的次数达到一定值,就自动断开。正常情况下,客户端不会不响应。 重新加载sshd服务。退出客户端,再次登陆即可验证。 3)重启sshdservice etcinit。dsshrestart 2、配置客户端 vimetcsshsshconfig 然后找到里面的 ServerAliveInterval 参数,如果没有你同样自己加一个就好了 参数意义相同,都是秒数,比如5分钟等 ServerAliveInterval300 3、echoexportTMOUT1000000root。bashprofile;source。bashprofile 在Linux终端的shell环境中通过设置环境变量TMOUT来阻止超时。如果显示空白,表示没有设置,等于使用默认值0,一般情况下应该是不超时。如果大于0,可以在如etcprofile之类文件中设置它为0。 9。ssh远程登陆,公钥授权不通过:Permissiondenied(publickey,gssapikeyex,gssapiwithmic) 公司IDC机房服务器,之前做了跳板机环境,其他机器只允许从跳板机ssh无密码信任过去,并且在信任关系做好后,禁用了其他机器的密码登陆功能(sshdconfig文件里设置PermitEmptyPasswordsno) 后来跳板机出现了问题,打算重装这台机器,重装前取消了其他机器里只允许跳板机ssh信任关系,并且恢复了密码登陆功能: 〔rootbastionIDCssh〕vimetcsshsshdconfig PermitEmptyPasswordsyes 〔rootbastionIDCssh〕servicesshdrestart 修改后,当时在其他机器间是可以ssh相互登陆,当时没在意,以为一切ok了。 可是,到了第二天,再次ssh登陆时,尼玛,居然报错了 Permissiondenied(publickey,gssapikeyex,gssapiwithmic)。 最后发现是selinux惹的祸!关闭它即可。 1)临时关闭selinux 〔rootbastionIDCssh〕setenforce0 〔rootbastionIDCssh〕getenforce Permissive 2)永久关闭 〔rootbastionIDCssh〕vimetcsysconfigselinux SELINUXdisabled 〔rootbastionIDCssh〕reboot重启系统才能生效 说明: 1)ssh可同时支持publickey和password两种授权方式,publickey默认不开启,需要配置为yes。 如果客户端不存在。sshidrsa,则使用password授权;存在则使用publickey授权;如果publickey授权失败,依然会继续使用password授权。 2)GSSAPI身份验证。 GSSAPIAuthentication是否允许使用基于GSSAPI的用户认证。默认值为no。仅用于SSH2。 GSSAPICleanupCredentials是否在用户退出登录后自动销毁用户凭证缓存。默认值是yes。仅用于SSH2。 需要特别注意的是: GSSAPI是公共安全事务应用程序接口(GSSAPI) 公共安全事务应用程序接口以一种统一的模式为使用者提供安全事务,由于它支持最基本的机制和技术,所以保证不同的应用环境下的可移植性。 该规范定义了GSSAPI事务和基本元素,并独立于基本的机制和程序设计语言环境,并借助于其它相关的文档规范实现。 如果我们在服务端打开GSSAPIAuthentication配置项,如下: 〔rootserver〕vimetcsshsshdconfig 。。。。。。。。 GSSAPIAuthenticationyes GSSAPICleanupCredentialsyes 那么在客户端登录服务端会用gssapikeyex,gssapiwithmic进行身份校验,同样客户端也要支持这种身份验证,如下: 〔rootclient〕vimetcsshsshconfig GSSAPIAuthenticationyes GSSAPIDelegateCredentialsyes 我们在客户端连接SSH服务端,如下: sshv192。168。1。11 。。。。。。。。。。。。。。。。。 debug1:Authenticationsthatcancontinue:publickey,gssapikeyex,gssapiwithmic,password debug1:Authenticationsthatcancontinue:publickey,gssapikeyex,gssapiwithmic,password debug1:Authenticationsthatcancontinue:publickey,gssapikeyex,gssapiwithmic,password debug1:Authenticationsthatcancontinue:publickey,gssapikeyex,gssapiwithmic,password 我们看到如下的信息: debug1:UnspecifiedGSSfailure。Minorcodemayprovidemoreinformation Nocredentialscachefound debug1:Authenticationsthatcancontinue:publickey,gssapikeyex,gssapiwithmic,password debug1:Nextauthenticationmethod:gssapikeyex debug1:NovalidKeyexchangecontext 说明SSH登录时采用GSSAPI的方式进行身份验证,但我们的系统不支持。 最后如果我们不用这种方式进行身份验证的话,建议关闭这个选项,这样可以提高验证时的速度。 10。ssh自定义安全设置 1)为了ssh登陆的时候加一层保护,可以修改默认端口。修改ssh服务配置文件etcsshsshdconfig port2222 这样远程连接时加短裤 ssh192。168。1。83p2222 2)ssh使用时加l后面跟用户名,表示登陆到对方的这个用户下面。 sshlwangshibo192。168。1。83p2222 等同于 sshwangshibo192。168。1。83p2222 3)限制ssh登陆的来源ip,白名单设置(hosts。allow优先级最高,具体参考:Linux服务器安全登录设置记录) 一是通过iptables设置ssh端口的白名单,如下设置只允许192。168。1。024网段的客户机可以远程连接本机 vimetcsysconfigiptables AINPUTs192。168。1。024ptcpmstatestateNEWmtcpdport2222jACCEPT 二是通过etchosts。allow里面进行限制(如下),etchosts。deny文件不要任何内容编辑,保持默认! vimetchosts。allow sshd:192。168。1。,192。168。9。,124。65。197。154,61。148。60。42,103。10。86。7:allow sshd:all:deny 4)仅允许特定的用户通过SSH登陆 如不允许root用户登录; 只允许几个指定的用户登录(比如wangshibo、guohuihui、liuxing用户) 禁止某些指定的用户登录(比如zhangda,liqin用户) 但是要注意:设置的这几个用户必须同时存在于本机和对方机器上 修改ssh服务配置文件etcsshsshdconfig PermitRootLoginno将yes修改为no AllowUserswangshiboguohuihuiliuxing这个参数AllowUsers如果不存在,需要手动创建,用户之间空格隔开 DenyUserszhagndaliqin这个参数DenyUsers如果不存在,需要手动创建,用户之间空格隔开 也可以设置仅允许某个组的成员通过ssh访问主机。 AllowGroupswheelops 实例说明: 1)只允许指定用户进行登录(白名单): 在etcsshsshdconfig配置文件中设置AllowUsers选项。格式如下: AllowUsersrootgracekevinapp 表示只允许grace用户、kevin用户通过ssh登录本机。 AllowUsersroot192。168。10。10app192。168。10。11kevin192。168。10。13 表示只允许从192。168。10。10登录的root用户、从192。168。10。11登录的app用户、从192。168。10。13登录的kevin用户可以通过ssh登录本机。 2)只拒绝指定用户进行登录(黑名单):) 在etcsshsshdconfig配置文件中设置DenyUsers选项。格式如下: DenyUserswangbolinanzhangyang 表示拒绝wangbo、linan和zhangyang用户通过ssh登录本机。 需要注意的是: AllowUsers、DenyUsers跟后面的配置之间使用TAB键进行隔开 多个百名单或黑名单之间使用空格隔开 例子: 〔rootCentos6〕catetcsshsshdconfig 。。。。。。。 AllowUsersroot192。168。10。202app192。168。10。200kevin192。168。10。202 〔rootCentos6〕etcinit。dsshdrestart 〔rootCentos6〕catetcsshsshdconfig 。。。。。。。 AllowUsersrootappkevin 〔rootCentos6〕etcinit。dsshdrestart 〔rootCentos6〕catetcsshsshdconfig 。。。。。。。 DenyUserswangbolinanzhangyang 〔rootCentos6〕etcinit。dsshdrestart 如下,由于已经允许了app和root登录,则后面针对root192。168。10。202和app192。168。10。200的限制就无效了(两者别放在一起配置) 〔rootCentos6〕catetcsshsshdconfig 。。。。。。。 AllowUsersapprootroot192。168。10。202app192。168。10。200 〔rootCentos6〕etcinit。dsshdrestart 还可以使用pam规则限制ssh登录 1)允许指定的用户(比如kevin、grace账号)进行登录 在etcpam。dsshd文件第一行加入,一定要在第一行,因为规则是自上而下进行匹配的。 authrequiredpamlistfile。soitemusersenseallowfileetcsshusersonerrfail 然后在etc下建立sshusers文件,编辑这个文件,加入你允许使用ssh服务的用户名,不用重新启动sshd服务。 最后重启sshd服务即可! 操作如下: 〔rootdockertest1〕vimetcpam。dsshd PAM1。0 authrequiredpamlistfile。soitemusersenseallowfileetcsshusersonerrfail 。。。。。。。。 〔rootdockertest1〕touchetcsshusers 〔rootdockertest1〕vimetcsshusers kevin grace 〔rootdockertest1〕etcinit。dsshdrestart 2)pam规则也可以写成deny的。比如拒绝kevin、grace账号进行登录 操作如下: 〔rootdockertest1〕vimetcpam。dsshd PAM1。0 authrequiredpamlistfile。soitemusersensedenyfileetcsshusersonerrsucceed 。。。。。。。。 〔rootdockertest1〕touchetcsshusers 〔rootdockertest1〕vimetcsshusers kevin grace 〔rootdockertest1〕etcinit。dsshdrestart 3)pam规则可以使用group限制。 允许规则: authrequiredpamlistfile。soitemgroupsenseallowfileetcsecurityallowgroupsonerrfail 禁止规则: authrequiredpamlistfile。soitemgroupsensedenyfileetcsecuritydenygroupsonerrsucceed 操作如下: 〔rootdockertest1〕vimetcpam。dsshd PAM1。0 authrequiredpamlistfile。soitemgroupsenseallowfileetcsecurityallowgroupsonerrfail 新建一个组,组名为bobo,然后将kevin和grace添加到这个bobo组内 〔rootdockertest1〕groupaddbobo 〔rootdockertest1〕gpasswdakevinbobo Addinguserkevintogroupbobo 〔rootdockertest1〕usermodGbobograce 〔rootdockertest1〕idkevin uid1000(kevin)gid1000(kevin)groups1000(kevin),1002(bobo) 〔rootdockertest1〕idgrace uid1001(grace)gid1001(grace)groups1001(grace),1002(bobo) 在etcsecurityallowgroups文件按中加入组名(注意如果不加root,则root就不能被允许登录了) 〔rootdockertest1〕vimetcsecurityallowgroups bobo 〔rootdockertest1〕etcinit。dsshdrestart 如上设置后,则只有kevin用户能被允许登录! 如果是禁止规则,则第一行改为下面内容: authrequiredpamlistfile。soitemgroupsensedenyfileetcsecuritydenygroupsonerrsucceed 除此之外,禁止某些用户ssh登录,可以使用passwd或usermod命令进行账号锁定 5)取消密码验证,只用密钥对验证 修改ssh服务配置文件etcsshsshdconfig PasswordAuthenticationno PubkeyAuthenticationyes 6)给账号设置强壮的密码:将密码保存到文本进行复制和粘帖就可以了 yumyinstallexpect mkpasswdl128d8C15s10 lVj。jgsKrf0cvtgmydqo7qPotxzxen9mefy?ej!kcaX2gQrcu2ndftkeamllznxiHikTagiVz0cMtqOcIypkpd,vvDkJhs3qsb:CiCqgtqdqvse5lssfmranbtx 参数说明: l密码长度 d多少个数字 C大写字母个数 s特殊符号的个数 7)只允许通过指定的网络接口来访问SSH服务,(如果本服务器有多个IP的时候) 仍然是修改etcsshsshdconfig,如下: ListenAddress192。168。1。15默认监听的是0。0。0。0 这样,就只允许远程机器通过ssh连接本机的192。168。1。15内网ip来进行登陆了。 8)禁止空密码登录 如果本机系统有些账号没有设置密码,而ssh配置文件里又没做限制,那么远程通过这个空密码账号就可以登陆了,这是及其不安全的! 所以一定要禁止空密码登陆。修改etcsshsshdconfig,如下: PermitEmptyPasswordsno这一项,默认就是禁用空密码登陆 9)sshconfig和sshdconfig sshconfig和sshdconfig都是ssh服务器的配置文件,二者区别在于,前者是针对客户端的配置文件,后者则是针对服务端的配置文件。两个配置文件都允许你通过设置不同的选项来改变客户端程序的运行方式。sshdconfig的配置一般都比较熟悉,下面单独说下sshconfig针对客户端的配置文件: 〔rootdns01dnsrsync〕catetcsshsshconfig Sitewidedefaultsforvariousoptions Host ForwardAgentno ForwardX11no RhostsAuthenticationno RhostsRSAAuthenticationno RSAAuthenticationyes PasswordAuthenticationyes FallBackToRshno UseRshno BatchModeno CheckHostIPyes StrictHostKeyCheckingno IdentityFile。sshidentity Port22 Cipherblowfish EscapeChar 下面对上述选项参数逐进行解释: Sitewidedefaultsforvariousoptions 带表示该句为注释不起作,该句不属于配置文件原文,意在说明下面选项均为系统初始默认的选项。说明一下,实际配置文件中也有很多选项前面加有注释,虽然表示不起作用,其实是说明此为系统默认的初始化设置。 Host Host只对匹配后面字串的计算机有效,表示所有的计算机。从该项格式前置一些可以看出,这是一个类似于全局的选项,表示下面缩进的选项都适用于该设置,可以指定某计算机替换号使下面选项只针对该算机器生效。 ForwardAgentno ForwardAgent设置连接是否经过验证代理(如果存在)转发给远程计算机。 ForwardX11no ForwardX11设置X11连接是否被自动重定向到安全的通道和显示集(DISPLAYset)。 RhostsAuthenticationno RhostsAuthentication设置是否使用基于rhosts的安全验证。 RhostsRSAAuthenticationno RhostsRSAAuthentication设置是否使用用RSA算法的基于rhosts的安全验证。 RSAAuthenticationyes RSAAuthentication设置是否使用RSA算法进行安全验证。 PasswordAuthenticationyes PasswordAuthentication设置是否使用口令验证。 FallBackToRshno FallBackToRsh设置如果用ssh连接出现错误是否自动使用rsh,由于rsh并不安全,所以此选项应当设置为no。 UseRshno UseRsh设置是否在这台计算机上使用rloginrsh,原因同上,设为no。 BatchModeno BatchMode:批处理模式,一般设为no;如果设为yes,交互式输入口令的提示将被禁止,这个选项对脚本文件和批处理任务十分有用。 CheckHostIPyes CheckHostIP设置ssh是否查看连接到服务器的主机的IP地址以防止DNS欺骗。建议设置为yes。 StrictHostKeyCheckingno StrictHostKeyChecking如果设为yes,ssh将不会自动把计算机的密匙加入HOME。sshknownhosts文件,且一旦计算机的密匙发生了变化,就拒绝连接。 IdentityFile。sshidentity IdentityFile设置读取用户的RSA安全验证标识。 Port22 Port设置连接到远程主机的端口,ssh默认端口为22。 Cipherblowfish Cipher设置加密用的密钥,blowfish可以自己随意设置。 EscapeChar EscapeChar设置escape字符。 比如说,A机器的ssh端口是22,B机器的端口是22222,一般来说A机器ssh连接B机器的时候是使用p22222指定端口。但是可以修改A机器的etcsshsshconfig文件中的 Port为22222,这样A机器ssh连接的时候就默认使用22222端口了。 去掉SSH公钥检查的方法(交互式yesno) SSH公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击。但是在特定情况下,严格的SSH公钥检查会破坏一些依赖SSH协议的自动化任务,就需要一种手段能够绕过SSH的公钥检查。 SSH连接远程主机时,会检查主机的公钥。如果是第一次连接该主机,会显示该主机的公钥摘要,弹出公钥确认的提示,提示用户是否信任该主机(Yesno)。当选择Yes接受,就会将该主机的公钥追加到文件。sshknownhosts中。当再次连接该主机时,就不会再提示该问题了。 SSH公钥检查有好处,但首次连接时会导致某些自动化任务中断,或者由于。sshknownhosts文件内容清空,导致自动化任务中断。 去掉SSH公钥检查的方法: 1)SSH客户端的StrictHostKeyChecking配置指令,可以实现当第一次连接服务器时,自动接受新的公钥。只需要修改etcsshsshconfig文件,包含下列语句: StrictHostKeyCheckingno 2)或者在ssh连接命令中使用oStrictHostKeyCheckingno参数 〔rootpuppet〕sshp22222172。168。1。33oStrictHostKeyCheckingno 或者 〔rootpuppet〕sshp22222172。168。1。33oUserKnownHostsFiledevnulloStrictHostKeyCheckingno ssh登陆忽略knownhosts文件 使用ssh登录远程机器,同时会把ssh信息记录在本地的。sshknownhsots文件中。如果出现ssh冲突了,需要手动删除或修改knownhsots里面对应远程机器的ssh信息。那么如果忽略掉这个knownhosts的访问?操作如下: 1)修改etcsshsshdconfig配置文件中的选项IgnoreUserKnownHosts改成yes,重启sshd服务即可。 2)如果还是不行,就在etcsshsshdconfig配置文件中再加入一下几行,然后再重启sshd服务。 StrictHostKeyCheckingno UserKnownHostsFiledevnull ansible中取消ssh交换式yesno 配置文件etcansibleansible。cfg的〔defaults〕中(打开注释) uncommentthistodisableSSHkeyhostchecking hostkeycheckingFalse ssh只允许使用key登录,禁止使用密码登录 1)生产公私钥文件 sshkeygentrsa 上面命令一路回车,此时在root。ssh目录下生成了2个文件,idrsa为私钥,idrsa。pub为公钥。 私钥自己下载到本地电脑妥善保存(丢了服务器可就没法再登陆了),为安全,建议删除服务器端的私钥。公钥则可以任意公开。 使用以下命令将公钥导入到系统中: catroot。sshidrsa。pubroot。sshauthorizedkeys 2)修改SSH的配置文件etcsshsshdconfig vimetcsshsshdconfig RSAAuthenticationyes PubkeyAuthenticationyes AuthorizedKeysFile。sshauthorizedkeys 默认PasswordAuthentication为yes,即允许密码登录,改为no后,禁止密码登录 PasswordAuthenticationno 3)重启SSH服务 etcinit。dsshdrestart 4)使用私钥登录xshell或securecrt客户端了 SSH服务启动报错案例 在某台服务器上部署了sftp服务,最后发现sftp远程登录正常,但是ssh远程登录失败(尽管已经输入了正确的用户名和密码)。 〔rootkevinssh〕servicesshdrestart Stoppingsshd:〔OK〕 Startingsshd:etcsshsshdconfigline81:UnsupportedoptionGSSAPIAuthentication etcsshsshdconfigline83:UnsupportedoptionGSSAPICleanupCredentials Startingsshd:〔OK〕 如上启动后,远程ssh登录这台机器,输入正确的用户名和密码,则会登录失败!! 〔rootkevinssh〕sshV OpenSSH7。6p1,OpenSSL1。0。1efips11Feb2013 原因是新版本的openssh不支持以上参数,需要修改sshd的配置文件。 修改内容如下,否则还是无法通过ssh登录这台服务器: 〔rootkevinssh〕vimetcsshsshdconfig 。。。。。。。 去掉前面的注释,允许root通过ssh登录 PermitRootLoginyes 注释掉下面三个参数 GSSAPIAuthenticationyes GSSAPICleanupCredentialsyes UsePAMyes 再次重启ssh,上面的报错信息就没有了。此时远程ssh登录就OK了! 〔rootkevinssh〕servicesshdrestart Stoppingsshd:〔OK〕 Startingsshd:〔OK〕 SSH连接超时时间(timedout)设置 1)使用下面命令连接,可以减少ssh连接超时等待的时间 sshoConnectTimeout5p22root172。16。60。20 或者修改sshdconfig文件里面的UseDNS选项,改为UseDNSno 2)设置SSH超时时间的方法 vimroot。bashprofile exportTMOUT1000000以秒为单位。或者修改etcprofile文件也可以。 sourceroot。bashprofile vimetcsshsshdconfig ClientAliveInterval60 servicesshdrestart 意思是每过一分钟,sshd都会和sshclient打个招呼(即服务器端给客户端发送一个空包),检测它是否存在,如果不存时则断开连接! 这里需要注意:设置完成后,要退出ssh远程连接,再次登录后才可以生效。因为要再读取一次bashprofile文件。 总结: 在ClientAliveInterval(etcsshsshdconfig)、环境变量TMOUT(在etcprofile或。bashprofile中设置)以及putty的Secondsbetweenkeepalives(默认为0)这些设置方法中, 经检测验证,只有TMOUT可以控制ssh连接在空闲时间超时,自动断开连接的时间,数字单位为秒。在设置了TMOUT后(非0),另外两个变量则不起作用的。 另外,特别提醒的是,设置好ssh的登录超时时间以后,记得退出重新登录或重启系统,以使配置生效。 3)SSH禁止超时设置 SSH默认过一段时间会超时,有时候正在执行着脚本,出去一会回来就断开了,输出信息都看不到了,很是无奈! 其实禁止SSH自动超时最简单的办法就是:每隔一段时间在客户端和服务器之间发送一个空包!!!!! 至于到底是从客户端发给服务器,还是服务器发给客户端其实都不重要,重要的是需要它们之间要有通信。 下面介绍两种阻止SSH连接超时的方法(推荐方法二): 方法一:客户端阻止SSH超时 编辑本地的SSH配置文件:。sshconfig vim。sshconfig ServerAliveInterval120 这个设置会让客服端机器在使用SSH连接服务器时,每隔120秒给服务器发送一个空包,保持它们之间的连接。 方法二:服务器端阻止SSH超时 如果有服务器端的root权限,可以在服务端进行配置,这样就不需要每个客户端都单独配置。 vimetcsshsshdconfig ClientAliveInterval120 ClientAliveCountMax720 第一行,表示每隔120秒向客户端发送一个空包,以保持于客户端的连接。 第二行,表示总共发送720次空包,之后断开它们之间的连接,也就是:120秒72086400秒24小时后。 最后重启sshd服务,再打开新终端进行ssh连接就可以了,在24小时内不会出现连接超时。 etcinit。dsshrestart SSH公钥下发无效 ssh的。pub公钥已经拷贝到远程主机的。sshauthorizedkeys文件里,但是ssh跳转时,仍然要输入密码!!即公钥下发后,ssh信任关系没有生效! 解决办法: 1)远程主机对应用户家目录下的。ssh目录必须是700或755权限,绝不能是775或777权限!即只对该用户有写权限!(一般设置700权限) 2)远程主机对应用户家目录下的。sshauthorizedkeys文件权限必须是600权限!即只对该用户有写权限!(一般设置600权限) 3)远程主机对应用户家目录的权限必须是700或755权限,绝不能是775或777权限!即只对该用户有写权限!(一般设置700权限),大多数情况下都是由于这个原因导致的!!! 如果。ssh目录和。sshauthorizedkeys文件权限对别的用户有写权限,则就会导致ssh认证失败! 例如在一次ansible自动化部署中,之前配置好的ssh信任关系失效,报错如下: {changed:false,msg:SSHError:datacouldnotbesenttoremotehost172。16。60。240。Makesurethishostcanbereachedoverssh,unreachable:true} 查看现象,发现之前配置好的ssh信任关系失效了!! 〔rootbz3devjenci1002lx0319〕sshp22kevin172。16。60。240 Authorizedonly。Allactivitywillbemonitoredandreported kevin172。16。60。240spassword: 分析原因及解决办法: 登录172。16。60。240这台机器的kevin用户下,发现authorizedkeys文件里确实已经传入了ansible主节点的idrsa。pub公钥内容,并且下面两个权限都正确: 〔kevinbz4autestap1002〕lld。ssh drwx2kevinkevin4096Jul2410:48。ssh700权限是正确的 〔kevinbz4autestap1002〕ll。sshauthorizedkeys rw1kevinkevin2412Jul2410:45。sshauthorizedkeys600权限也是正确的 然后查看kevin用户目录权限,发现是777!这才是问题根源!该用户目录权限不能对别的用户有写权限,否则会造成ssh认证失败! 〔kevinbz4autestap1002〕lldhomekevin drwxrwxrwx14kevinkevin4096Jul2410:48homekevin 修改为600权限即可 〔kevinbz4autestap1002〕chmod600homekevin 〔kevinbz4autestap1002〕lldhomekevin drwx14kevinkevin4096Jul2410:48homekevin 再次在远程尝试ssh认证跳转 〔rootbz3devjenci1002lx0319〕sshp22kevin172。16。60。240 〔kevinbz4autestap1002〕 Centos7修改ssh默认端口的方法 CentOS7对于防火墙这一块的设置有一定的修改,修改ssh端口后,必须关闭防火墙和selinux之后才能正常重启sshd服务,否则启动失败。操作记录如下: 1)修改etcsshsshdconfig这个是修改ssh服务端配置文件。 〔rootk8smaster01〕vimetcsshsshdconfig 。。。。。。。。。 Port22这行最好去掉号,防止配置失效以后不能远程登录,还得去机房修改,等修改以后的端口能使用以后在注释掉 Port6666下面添加这一行 〔rootk8smaster01〕vimetcsshsshconfig这个是修改ssh客户端配置文件,一般可以不用修改。 。。。。。。。。 Port22 Port6666 ssh客户端配置文件使用场景: 比如A机器的etcsshsshconfig客户端配置文件的ssh端口是22,B机器的etcsshsshdconfig服务端配置文件是6666 那么A机器ssh连接B机器时就要带上p6666,如果A机器的ssh客户端配置文件的端口也是6666的话,就可以直接ssh连接B机器了。 2)要关闭防火墙和selinux。否则,centos7修改ssh端口后会启动sshd服务失败!一定要注意这个! 〔rootk8smaster01〕systemctldisablefirewalld 〔rootk8smaster01〕systemctlstopfirewalld 〔rootk8smaster01〕firewallcmdstate notrunning 〔rootk8smaster01〕catetcsysconfigselinux 。。。。。。。 SELINUXdisabled 〔rootk8smaster01〕setenforce0 〔rootk8smaster01〕getenforce Disabled 这样,在修改ssh端口后,就能顺利启动sshd服务了! 这里还需要注意下:如果是打开了防火墙或selinux,则需要将修改的sshd端口添加到对应的防火墙规则中(默认只加了ssh的22端口) a)firewalld配置 添加到防火墙: firewallcmdzonepublicaddport6666tcppermanent(permanent是保存配置,不然下次重启以后这次修改无效) 重启: firewallcmdreload 查看添加端口是否成功,如果添加成功则会显示yes,否则no firewallcmdzonepublicqueryport6666tcp b)selinux配置 使用以下命令查看当前SElinux允许的ssh端口: semanageportlgrepssh 添加6666端口到SELinux semanageportatsshporttptcp6666 然后确认一下是否添加进去 semanageportlgrepssh 如果成功会输出 sshportttcp6666,22 c)然后就可以顺利启动sshd服务了。