当前位置: 首页 > 科技观察

几个LinuxSSH实用技巧

时间:2023-03-14 19:15:27 科技观察

现在最常用的远程服务器管理方式就是SSH(SecureShell)。SSH以其最方便的方式连接并加密通信过程。根据所使用的算法,通常认为通过ssh窃听通信几乎是不可能的。SSH使用的客户端一般在Linux或Unix上直接使用ssh命令,在Windows上也支持Cygwin或WSL等类Linux环境。Windows系统会用到很多客户端软件,比如SecureCRTXshell,我用的是免费开源的Putty。使用ssh有很多技巧,有些非常简单,有些超出了终端应用程序的范围。我们知道ssh可以安全传输文件(scp),也可以通过ssh挂载远程文件系统;您可以使用ssh浏览器安全漫游网络,也可以使用ssh隧道加密流量。在本文中,虫虫将向您介绍SSH的一些技巧。我们假设读者了解SSH的一些基础知识:使用scp和sftp进行文件复制,使用ssh-copy-id设置无密码证书登录。SSH别名ssh命令行有很多选项需要记住,比如IP、端口、用户名、私钥(如果不是有标准位置和名称的证书,或者有多个证书时),但实际上它可以偷懒,甚至IP,我们不需要记住端口,我们只需要在~/.ssh/config文件中创建一个别名,并设置这些选项。例如,假设我们要连接一个主机,我们给他设置了一个别名为虫虫:HostchongchongHostNameijz.mePort1234UserccIdentityFile~/.ssh/chongchong_idForwardX11yesCompressionyesTCCPKeepAliveyes你可以使用任意多个别名。至于添加多个“主机”配置行。一个Host语句中可以添加多个别名。后续选项可以与任一别名一起使用。配置完成后,我们只需要连接到sshcongchong,所有配置的选项都会被启用。当然,如果你使用的是Putty客户端,主要的选项就在其配置的Session面板和SSH面板中。可能没有太多选择,但有一些可以尝试。几个有用的配置项1.ControlMaster有一套非常有用的SSH配置项,包括设置主控制文件。例如:ControlMasterautoControlPath~/.ssh/master-%r@%h:%p这允许连接到同一主机的多个会话共享一个TCP套接字。因为设置安全套接字需要一些时间,所以如果两台主机之间有多个会话,此设置会加快速度。可以使用配置文件中的Host*项为所有主机设置。您也可以将它用于全局选项。需要注意的是,如果通过多个连接传输大量数据,ControlMaster配置可能会影响传输。这时可以使用-Snone暂时覆盖全局设置,将其关闭。此外,如果您尝试在关闭所有其他连接之前退出,那么第一个ssh会话可能会挂起。您可以通过在登录到经常连接的主机时运行隐藏的ssh会话来避免此问题。但是,更好的方法是将ControlPersist设置为yes。这会将原始会话无限期地置于后台。你可以在上面设置一个时间限制,比如将ControlPersist设置为180(或其他数字)。表示三分钟内没有连接,自动关闭连接。这种方法还有一个缺点就是会产生很多master垃圾文件。可以设置为登录时自动清理,比如rc.local设置:/bin/rm/home/*/.ssh/master-*||true>/dev/null如果使用Putty客户端,你可以在SSH选项面板中选择“ShareSSHconnectionsifpossible”多个选项来设置。2.BatchMode配置文件中也用到了很多配置选项。例如,BatchMode告诉ssh该连接是一个无人值守的应用程序,避免不必要地提示用户输入密码或其他交互内容。如果认证项没有设置完整,会直接报错退出。3.SendEnv可以在SSH连接时向远程主机发送环境变量。例如,想在工作站和服务器上保持LS_COLORS始终相同,但会经常更改,不想使用相同的配置文件。可以添加以下配置:4.SendEnvLS_COLORSPutty可以从其配置页面的“连接/数据”选项卡设置环境变量。5、TCPKeepAlive在网络侧。如果想让server和client在空闲的时候不断开连接,可以将TCPKeepAlive设置为yes。如果连接空闲,则不会断开连接。.远程命令执行这是SSH最有用的技巧。我们经常需要登录主机只是为了执行一些命令。如果是个别命令或者批量操作需要(当然也可以使用ansible等),需要登录宿主机操作,有点不方便。其实如果只是执行命令或者脚本,可以不用登录远程主机直接使用ssh命令。简单的命令执行SSH远程执行命令的格式为:ssh[用户名]@[远程主机名或IP][命令或脚本]比如我们要获取远程主机的运行信息,可以使用uptime:sshchongchonguptimeresult:11:23:55up28days,23:41,0users,loadaverage:2.46,1.16,0.49比如我们需要获取远程主机的磁盘信息,可以使用sshchongchongdf-h执行多个命令。其他命令类似。如果命令较长或涉及多条命令,命令中有部分用引号括起来:例如获取主机状态和主机磁盘状态:sshchong"uptime&&df-h"或者使用:sshchong"uptime;df-h"remote抓包想象一个更复杂的例子,我们需要抓包远程主机,然后在本地用Wireshark分析:sshroot@someserver'tcpdump-c1000-nn-w-notport1234'|wireshark-k-i-当命令行需要使用tshark操作。sshroot@someserver'tcpdump-c1000-nn-w-notport1234'|wireshark-i-结果:…3.759005112.215.162.105->112.252.251.70TCP78[TCPDupACK840#2]outlaws>65522[ACK]Seq=49AckWin=90193126Len=0TSval=2402288138TSecr=2506305501SLE=91561SRE=942973.759022112.252.251.70->112.215.162.105TCP143465522>outlaws[ACK]Seq=95665Ack=49Win=309Len=1368TSval=2506305583TSecr=24022881383.761937fe80::6d94:f636:7715:26dc->ff02::1:2DHCPv6150SolicitXID:0x58568dCID:000100011dd4af3b00155d6d34043.762006Cisco_d3:c7:bf->BroadcastARP60Whohas103.218.185.171?Tell103.218.185.13.762374121.50.168.101->121.50.168.255NBNS92NamequeryNBXENNO.INFO<00>3.768515169.254.2.31->169.254.255.255NBNS92NamequeryNBFSIGNS.DUBA.NET<00>3.780159Cisco_d3:c7:bf->BroadcastARP60Whohas202.74.234.238?Tell202.74.234.13.796134Cisco_d3:c7:bf->BroadcastARP60Whohas112.252.251.93?Tell112.252.251.13.801334112.215.162.105->112.252.251.70TCP78[TCPDupACK840#3]不法分子>65522[ACK]Seq=49Ack=90193Win=126Len=0TSval=2402288179TSecr=2506305501SLE=91561SRE=956653.801394112.252.251.70->112.215.162.105TCP1434[TCPFastRetransmission]65522>outlaws[ACK]Seq=90193Ack=49Win=309Len=1368TSval=2506305625TSecr=24022881793.804767185.216.140.36->157.119.69.59TCP6051426>52622[SYN]SEQ=0WIN=1024LEN=03.806149CISCO_D3:C7:C7:BF->BRF->BRODCASTARP60WHOHAS103.248.220.220.220.220.121?Tell103.248.221.13.809116fe80::a563:2c5c:97df:13ca->ff02::1:2DHCPv6148SolicitXID:0x5c67c7CID:000100011dd4af3b00155d6d34043.811726Cisco_d3:c7:bf->BroadcastARP60Whohas202.74.232.203?Tell202.74.232.13.812418Cisco_d3:c7:bf->BroadcastARP60Whohas157.119.71.127?Tell157.119.71.13.819393fe80::910c:1871:e52f:9b82->ff02::1:2DHCPv6152SolicitXID:0x8a263aCID:00010001205a760c00155df47d053.838355Cisco_d3:c7:bf->BroadcastARP60Whohas202.74.234.147?告诉202.74.234.13.84033145.249.181.172->239.255.255.250SSDP216M-SEARCH*HTTP/1.13.84057058.215.162.105->142.252.251.70TCP66outlaws>65522[ACK]Seq=49Ack=95665Win=117Len=0TSval=2402288220TSecr=25063056253.840608142.252.251.70->58.215.162.105TCP143465522>outlaws[ACK]Seq=97033Ack=49Win=309Len=1368TSval=2506305664TSecr=2402288220...执行脚本我们写一个简单的脚本来获取远程主机的一些信息,包括主机名、正常运行时间、内存、磁盘和内核信息:#!/bin/bashecho"--------CPU名称--------------------------------------------"hostnamectlecho-e"\n"echo"--------系统信息----------------------------------------"uptimeecho-e"\n"echo"--------可用内存----------------------------------------“自由机械电子”\n“回声”---------磁盘信息--------------------------------------------》df-hecho-e"\n"echo"--------内核版本--------------------------------------------"uname-aecho-e"\n"echo"------------------------------------------------------------》然后用下面的语句来execute:sshchongchong'bash-s'<主机信息.sh也可以使用pipeline形式,但是会有提示信息:cathost-info.sh|sshchongchongSSH测速是最好的技巧,SSH连接要快才爽,所以SSH连接快还是快不是,我们可以用pv来测速:yes|pv|sshchongchong"cat>/dev/null"sshfs挂载远程目录如果SSH连接速度快,我们可以用sshfsbased将远程主机的目录挂载到本地在SSH上。挂载的目录是一个FUSE文件系统,可以用作常规用户程序而不是内核文件系统。mkdir~/remotesharedsshfs@:/remotepath~/remoteshared注意,如果普通用户要使用sshfs挂载远程目录,需要先将用户添加到fuse用户组,否则会报错:fuse:failedtoexecfusermount:Permissiondenied我们使用:usermod-a-Gfusecc这样我们就可以使用sshfs了:sshfschongchong:/tmp./dataOK,现在我们可以在data中操作远程主机的/tmp目录了。注意有一个早期阶段你的ssh连接需要很快,否则你对目录(父目录)的操作(与ls相比)会很慢。这时候可以使用:fusermount-udata删除挂载。注意df中也会显示sshfs的mount:df-hFilesystemSizeUsedAvailUse%Mountedon/dev/sda3886G16G825G2%/tmpfs8.0G08.0G0%/dev/shm/dev/sda1485M87M374M19%/bootchongchong:/tmp7.7G2.7G5.0G35%/home/cc/data本文总结了我们SSH使用中一些有用但鲜为人知的技巧,希望对大家有所帮助。当然,SSH的技巧还不止这些,其他的内容以后再给大家介绍。