总结ssh常用参数用法

少年恃险若平地,独倚长剑凌清秋。这篇文章主要讲述总结ssh常用参数用法相关的知识,希望能为你提供帮助。
      ssh(Secure Shell)是一种加密的网络传输层协议,它代替了传统的telnet协议,可以帮助我们实现安全的远程登录,进行加密通信。具体的软件实现包括dropbear和OpenSSH,其中,OpenSSH在CentOS 默认安装,Ubuntu在安装时需要选择??(如下图)??,否则安装完无法直接使用远程登录。

    ssh分为服务器端和客户端两种,执行? ls /etc/ssh? 命令可看到ssh_config和sshd_config,前者为客户端的配置文件,后者为服务器端的配置文件??(如下图)??,我们这里所谈的ssh指的是客户端的,此篇主要是结合ssh的一些常用功能来总结其参数和用法。



  1. ?远程登录主机?
    ssh最常用的功能之一就是实现远程登录主机,实现方式有两种,一种是ssh直接跟上目标主机的ip,另一种则是ssh跟上指定主机ip上的用户登录。
?1.1 ssh加ip登录?
    ssh直接跟目标主机ip等登录时,会默认以当前的用户名称作为目标主机的用户去登录,如果目标主机不存在该名称的用户,则无法登录,如果存在,输入目标主机的用户mi码后可登录??(如下图)??。

【总结ssh常用参数用法】
    ssh能实现加密通信,不过首次连接时的安全性是无法保证的,如果有中间人的存在,发了一份假的公钥,则我们后续的连接也是不安全的,所以可以在首次连接时进行验证。但是连接时提供的目标主机公钥是经过哈希算法加密过的,一般人看不懂,有个很简单的方法就是目标主机自己连接自己,将显示出的经过哈希算法加密的公钥与ssh客户端进行对比??(如下图)??。


?1.2 ssh指定用户登录?
    ssh也可根据目标主机上已有的用户,进行指定用户名+ip的方式登录,如果之前已经连接过目标主机,再次连接时只需输入目标主机中的指定用户登录mi码即可??(如下图)??。

?1.3  首次登录免公钥确认?
    上面谈到首次连接时需要进行公钥的确认,输入“yes”,如果企业内部不使用外网,连接时的安全性会有所增加,一台台机器去确认公钥会比较麻烦。不想进行公钥的确认也可以实现,ssh客户端的配置文件为/etc/ssh/ssh_config,找到“StrictHostKeyChecking ask  ”,将ask改为no即可??(如下图)??。


    另一种方法是不修改配置文件,加上-o来执行命令完成免公钥确认??(如下图)??。


?1.4 远程执行命令和脚本?
    ssh可以帮我们在不切换到目标主机的情况下,远程执行命令??(如下图)??。

    同时我们也可远程执行脚本,笔者以centos7.9为客户端,创建一个脚本内容很简单,就是新建a.txt,执行 ?ssh 10.10.10.154 /bin/bash < ssh.sh? 命令,即可在名为hello-world的目标主机看到多出指定名称文件??(如下图)??。




  1. ?指定端口号登录?
    ssh远程登录时,默认的端口号为22,在实际生产过程中可能会不太安全,这时我们可以考虑更换端口号。linux系统端口号范围为0-65535,其中0不使用;1-1023 由系统保留,只能由root用户使用;1024-4999 由客户端程序自由分配;5000-65535 由服务器端程序自由分配。修改端口号需要修改/etc/ssh/sshd_config配置文件信息,找到“Port 22”改为想要的数字,笔者这边以9527为例??(如下图)??,修改保存后,需执行  ?service sshd restart? 命令生效。

    此时,如果客户端是无法直接连接的,必须加上-p和端口号才能登录??(如下图)??。



  1. ?强制伪终端分配?
    强制伪终端分配这一功能有点类似于跳板,比如客户端C想去登录服务器端S,而S屏蔽掉了C的ip,C是无法直接登录S的。如果此时中间有一个A的存在,A能够正常连接到S,并且C能够连接到A,则能实现C→A→S的登录。
    笔者这边准备三台虚拟机,ip地址分别为10.10.10.153-155,153结尾的主机名为LeoMessi,现在Messi想登录155结尾的目标主机centos7.9,但是centos7.9屏蔽了Messi的ip,Messi直接登录不可实现??(如下图)??。


    此时有一个名叫hello-world的主机存在,可以远程登录centos7.9,而Messi可以远程登录hello-world??(如下图)??。


    此时,我们在已经登录到hello-world主机上的Messi可以执行 ?ssh 10.10.10.155? 命令,实现伪终端的强制登录??(如下图)??。

    当然这样的登录方式会比较麻烦,我们可以使用-t,直接一条命令实现登录,即执行  ?ssh -t 10.10.10.154 ssh 10.10.10.155? 命令??(如下图)??。



  1. ?scp和rsync?
?4.1 scp?
    scp命令是ssh客户端常用的命令之一,它可以帮助我们实现远程拷贝功能。笔者这边准备两台虚拟机,分别名为hello-world和centos7.9,hello-world将/data/test下的三个文件远程拷贝给centos7.9,执行  ?scp -r /data/test/ 10.10.10.155:/data? 命令,此时centos7.9查看/data目录,发现过了/test文件夹,并且里面包含了指定文件??(如下图)??。


?4.2 rsync?
    现在hello-world对f1.txt进行了更改,还是使用之前的命令,从centos7.9上的文件生成时间可以看出会重新覆盖centos7.9上的三个文件,即所有的文件都重新传输一遍??(如下图)??。


    如果是在生产中,文件内容比较大,使用scp来更新数据会比较麻烦,此时就可以用上rsync命令。rsync基于增量数据同步,即只复制两方不同的文件。执行  ?rsync -a /data/test 10.10.10.155:/data? 命令,对比hello-world和接收者centos7.9对应文件夹下的文件生成时间,可见是相同的??(如下图)??。


    此时我们对hello-world主机上的f2.txt进行更改,执行  ?rsync -av /data/test 10.10.10.155:/data? 命令??(v选项可看到更新细节)??,显示只传输了f2.txt,即其他文件没有进行传输,回到centos7.9主机上查看test文件夹下,也确实只有f2.txt的时间发生了变动??(如下图)??。


    可见,rsync在远程数据更新时确实比scp更实用。当然,如果我们在本地主机上删除了某个文件,直接使用上述命令是无法同步的。比如现在对hello-world对f3.txt进行了更改,同时删除了f1.txt,直接上一步的同步命令,只能对centos7.9中的f3.txt进行更新,而不能删除其f1.txt??(如下图)??。


    要想保证对方也同步删除,还需加上--delete。我们再对f2.txt进行更改,同时执行  ?rsync -av --delete /data/test 10.10.10.155:/data? 命令,显示删除了对方的f1.txt,同时对f2.txt进行了数据更新??(如下图)??。




  1. ?sftp?
    sftp是一种交互式文件传输工具,用法和传统的ftp工具相似,利用ssh服务实现安全的文件上传和下载。
    笔者以hello-world主机为客户端,centos7.9为例,执行 ?sftp 10.10.10.155? 命令,远程登录操作,可以查看主机相关文件等,如果是查看本机情况,需要在命令前加!,同时可实现上传和下载等功能??(如下图)??。



  1. ?基于key验证?
    由于不同的主机之间实现远程登录需要输入mi码,这种情况有时是不安全的,如果是企业里想要登录的远程主机比较多,一个个输入mi码也比较麻烦,这时就可以考虑基于key验证。
    基于key验证是在客户端上生成公钥私钥对,同时将自己的公钥放入目标远程主机中,从而实现免密登录。只要客户端的私钥不被偷走,就不会产生安全问题,同时私钥是可以再加密的,中间人偷走了也打不开。
    笔者这里以hello-world主机为客户端,清空之前实验留下的 .ssh目录下的数据,执行  ?ssh-keygen? 命令即可生成公钥私钥对,默认的为rsa算法,如果想填其他的也可以,因为是实验,笔者这边就不对私钥进行加密了。此时会自动生成.ssh目录,并将id_rsa.pub和id_rsa放在里面??(如下图)??。

    我们将生成的公钥发送到目标主机中,即执行  ?ssh-copy-id -i .ssh/id_rsa.pub 10.10.10.155? 命令,这一步操作时还是要进行手动确认的,此时目标主机centos7.9中会自动生成.ssh目录,并将hello-world的公钥放入到.ssh目录下的authorized_keys中??(如下图)??。


    到这里我们的基于key验证也就做完了,hello-world主机上执行 ?ssh 10.10.10.155? ,可以直接登录到centos7.9上??(如下图)??。



  1. ?sshpass?
?    ?如果我们不做基于key验证的话,使用ssh登录时是不能直接在命令行中填写mi码的,而sshpass解决了这个问题。sshpass是一款自动登录ssh工具,允许用-p参数指明明文mi码直接登录远程服务器。不过sshpass需要下载,同时是由epel源提供,我们得保证epel源可用。

    笔者这里以hello-world登录LeoMessi为例,执行  ?sshpass -p 123456 ssh -o StrictHostKeyChecking=no root@10.10.10.153? 命令即可直接登录目标主机??(如下图)??。

    我们也可使用此种方法将公钥发给目标主机,下次就可以直接用ssh+ip来登录??(如下图)??。


    推荐阅读