使用Linux,从正确配置ssh开始

前言

ssh相当于windows上的远程桌面连接,但没有桌面,只有文字终端。ssh是许多Linux使用者入门时必学的一个命令。借助ssh,开发人员可以很方便地连接远程或是局域网的其他电脑,直接在上面进行开发工作。

拿笔者自己平时工作流举例,每天到实验室首先打开mac上的item2终端,连接两个扩展屏,再ssh连入几台服务器,切换到tmux,大部分工作都可以在一个终端上完成。

可以说,使用好ssh,我们能更舒心地连接远程;使用好终端,开发人员能够更顺利地完成自己的开发工作。

本文介绍一些使用ssh的小技巧,非常容易操作,那么, let’s do it!

基础

ssh客户端与服务端

想要使用ssh,首先需要有个终端软件,其次本地系统要安装有ssh客户端,远程系统要有服务端。

比如从mac系统连接远程linux服务器,item2无疑是首选的终端软件,而ssh客户端在mac上是内置的;windows建议使用cmder软件,cmder是一款优秀的开源软件,可以让你在windows上有着类似linux的操作感觉。cmder直接集成了ssh客户端,下载方式见2。

对于处在远程的服务端,还需要远程的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 [email protected]

接下来,终端会提示你一条信息,输入yes回车,会提示你输入密码,就像这样。

先别着急使用下去,稍加配置可以让我们使用得更加舒心、安全。

基本配置

给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

进行连接。

免密码登录

经常使用密码登录,一个问题是有安全风险,另外一个是麻烦,太懒了啊,每次输密码多麻烦!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。毕竟各种配置,只有适合自己的才是最舒服的嘛!github也有许多dotfiles的分享,读者可以去参考。

ssh做代理

ssh 命令除了登陆外还有三种代理功能:

正向代理(-L):相当于 iptable 的 port forwarding反向代理(-R):相当于 frp 或者 ngroksocks5 代理(-D):相当于 ss/ssr

这里不展开赘述,可以参考

韦易笑:SSH 命令的三种代理功能(-L/-R/-D)383 赞同 · 23 评论文章

总结

本文总结了常用的linux ssh操作,虽然大部分操作都很简单,但可以提升我们使用的体验。作为开发人员,“舒舒服服”地使用操作系统,可是常规操作哦。

你好,我是强子哥,一个Linux爱好者,也是三维深度学习方向的在读研究生,欢迎关注,共同学习。

参考

[^1]: 韦易笑:SSH 命令的三种代理功能(-L/-R/-D) "韦易笑 SSH 命令的三种代理功能(-L/-R/-D)"

[^2]: https://github.com/cmderdev/cmder/ "cmder的github"

[^3]: https://cmder.net/ "cmder官网"