当前位置 主页 > 服务器问题 > Linux/apache问题 >

    怎么用ssh连接服务器?从正确地配置ssh开始

    栏目:Linux/apache问题 时间:2021-01-11 13:27

         ssh相当于windows上的远程桌面连接,但没有桌面,只有文字终端。ssh是许多Linux使用者入门时必学的一个命令。借助ssh,开发人员可以很方便地连接远程或是局域网的其他电脑,直接在上面进行开发工作。
         ssh客户端与服务端
         想要使用ssh,首先需要有个终端软件,其次本地系统要安装有ssh客户端,远程系统要有服务端。
         比如从mac系统连接远程linux服务器,item2无疑是首选的终端软件,而ssh客户端在mac上是内置的;windows建议使用cmder软件,cmder是一款优秀的开源软件,可以让你在windows上有着类似linux的操作感觉。cmder直接集成了ssh客户端。
         对于处在远程的服务端,还需要远程的ssh服务器安装并打开。比如对一台新安装的ubuntu18.04系统,一般是只有ssh而没有ssh服务端,可进行下列安装操作:
    sudo apt update
    sudo apt install openssh-server -y
    sudo systemctl status ssh #查看状态
         # 如果你的防火墙开启了,使用下面语句:
    sudo ufw allow ssh
         连接方式
         基本的ssh连接方法是ssh username@ip。
         username表示该机器的用户名,ip表示对应的ip地址。比如,笔者在10.22.75.212的用户名是qiangzibro,只需要在终端输入ssh qiangzibro@10.22.75.212
         接下来,终端会提示你一条信息,输入yes回车,会提示你输入密码,就像这样。
         先别着急使用下去,稍加配置可以让我们使用得更加舒心、安全。
         基本配置
         1、给ip地址取别名。
         长长的ip地址不好记,给ip地址取个别名吧!在mac或者linux上,可以编辑/etc/hosts这个文件,由于是系统文件,需要使用管理员权限。编辑器可以自选,我使用的是neovim
    sudo nvim /etc/hosts。
         比如我想给10.22.75.177取名叫lab1,添加下面一行:
         10.22.75.177 lab1
         在以后的使用中,凡是需要用到ip地址,可以直接用别名代理,比如:ping lab1。
         给特定主机上的用户取别名
         ip地址取完别名后,我们可以使用类似ssh qiangzibro@lab1的方式进行连接,实际上,这样的连接方式还可以进一步简化。也就是说,给qiangzibro@lab1也取个别名,不建议自己造轮子,早年间曾写过比如alias sshqiang="ssh qiangzibro@lab1”的别名,其实没有太大必要。
         进行下面配置可以让以后使用更方便:
         类unix系统(mac或者linux)可以直接编辑~/.ssh/config这个文件,如果没有,自己创建一个。语法如下
    Host l1
    HostName lab1
    Port 22
    User qiangzibro
         配置很简单,四行分别表示别名、远程主机ip、远程主机ssh端口、远程主机用户名。然后我们可以用ssh l1进行连接。
         2、免密码登录。
         经常使用密码登录,一个问题是有安全风险,另外一个是麻烦,太懒了啊,每次输密码多麻烦!ssh还提供一种使用密匙验证的方式进行登录,相信大家在配置github免密登录时也遇到过。百度百科上对其解释如下:
         原理是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。
         也就是说,把本地公钥拷贝到远程服务器上,就不需要每次登录使用密码了。具体讲,是把本地~/.ssh/id_rsa.pub内的内容拷贝到远程~/.ssh/authorized_keys文件里。首先看看本地有没有公钥:cat ~/.ssh/id_rsa.pub。没有,则生成一个ssh-keygen -t rsa。一路回车按下去,便生成在了~/.ssh/id_rsa.pub。
         你可以使用复制粘贴最原始的方法,而这种操作也有命令简化了:
         ssh-copy-id l1 # 将本地公钥拷贝到远程名为l1用户下,也就是/home/qiangzibro/.ssh/authorized_keys里。
         更多用法:
         前几个配置做完,相信你一定可以更加舒适地使用ssh了。但除了常用的远程连接,ssh还有许多使用的技巧。
         使用scp传文件。
         基于ssh协议——把名为local_path的文件, 从本地传到远程家目录下。
         scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
         scp [-r] local_path l1:~
         两点注意:如果local_path是文件夹,则带一个-r参数,再一个是注意中间的冒号。
         同理,远程到本地:scp [-r] l1:remote_path local_path通过ssh运行远程脚本运行远程机器的一个命令:ssh l1 "ls"。
         也许你会问:直接ssh连接到远程机器,运行程序不就好了,为什么通过ssh命令运行呢?
         其实,单个命令确实没有什么必要,但对于复杂、批量的操作,写在脚本里,可以大大提高我们的效率。比如笔者自己维护的一个dotfiles,其功能就是能够使自己的笔记本,和几个linux服务器同步一份配置,有着相同的使用感觉。整个项目是用git和github管理的。如果一个地方做改动,想同步到其他地方,需要一个机器先push,其他机器再pull等多个操作。其实这些操作都可以交给脚本完成。分享一段笔者写的自动更新脚本:
         关于dotfiles,就不分享自己的项目了,建议大家创建一份属于自己的dotfiles。毕竟各种配置,只有适合自己的才是最舒服的嘛!
         ssh做代理:
         ssh 命令除了登陆外还有三种代理功能:
         正向代理(-L):相当于 iptable 的 port forwarding。
         反向代理(-R):相当于 frp 或者 ngrok。
         socks5 代理(-D):相当于 ss/ssr。