前言
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][3]。
对于处在远程的服务端,还需要远程的ssh服务器安装并打开。比如对一台新安装的ubuntu18.04系统,一般是只有ssh而没有ssh服务端,可进行下列安装操作
sudoaptupdatesudoaptinstallopenssh-server-ysudosystemctlstatusssh#查看状态#如果你的防火墙开启了,使用下面语句sudoufwallowssh连接方式
基本的ssh连接方法是
sshusername@ip
sshqiangzibro@10.22.75.212
接下来,终端会提示你一条信息,输入yes回车,会提示你输入密码,就像这样。
image-20200820184652666
先别着急使用下去,稍加配置可以让我们使用得更加舒心、安全。
sudonvim/etc/hosts
比如我想给10.22.75.177取名叫lab1,添加下面一行:
10.22.75.177lab1
pinglab1给特定主机上的用户取别名
sshqiangzibro@lab1
的方式进行连接,实际上,这样的连接方式还可以进一步简化。
也就是说,给qiangzibro@lab1也取个别名
不建议自己造轮子,早年间笔者曾写过比如alias sshqiang=”ssh qiangzibro@lab1”的别名,其实没有太大别要,因为进行下面配置可以让以后使用更方便:
Hostl1HostNamelab1Port22Userqiangzibro
配置很简单,四行分别表示别名、远程主机ip、远程主机ssh端口、远程主机用户名。然后我们可以用
sshl1
进行连接。
免密码登录
经常使用密码登录,一个问题是有安全风险,另外一个是麻烦,太懒了啊,每次输密码多麻烦!ssh还提供一种使用密匙验证的方式进行登录,相信大家在配置github免密登录时也遇到过。百度百科上对其解释如下:
原理是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。
也就是说,把本地公钥拷贝到远程服务器上,就不需要每次登录使用密码了。具体讲,是把本地~/.ssh/id_rsa.pub内的内容拷贝到远程~/.ssh/authorized_keys文件里。首先看看本地有没有公钥:
cat~/.ssh/id_rsa.pub
没有,则生成一个
ssh-keygen-trsa
一路回车按下去,便生成在了~/.ssh/id_rsa.pub
你可以使用复制粘贴最原始的方法,而这种操作也有命令简化了:
ssh-copy-idl1#将本地公钥拷贝到远程名为l1用户下,也就是/home/qiangzibro/.ssh/authorized_keys里更多用法
前几个配置做完,相信你一定可以更加舒适地使用ssh了。但除了常用的远程连接,ssh还有许多使用的技巧。
使用scp传文件
基于ssh协议——把名为local_path的文件, 从本地传到远程家目录下
scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
scp[-r]local_pathl1:~
两点注意:如果local_path是文件夹,则带一个-r参数,再一个是注意中间的冒号。
同理,远程到本地:
scp[-r]l1:remote_pathlocal_path通过ssh运行远程脚本
运行远程机器的一个命令
sshl1″ls”
也许你会问:直接ssh连接到远程机器,运行程序不就好了,为什么通过ssh命令运行呢?
其实,单个命令确实没有什么必要,但对于复杂、批量的操作,写在脚本里,可以大大提高我们的效率。比如笔者自己维护的一个dotfiles,其功能就是能够使自己的笔记本,和几个linux服务器同步一份配置,有着相同的使用感觉。整个项目是用git和github管理的。如果一个地方做改动,想同步到其他地方,需要一个机器先push,其他机器再pull等多个操作。其实这些操作都可以交给脚本完成。分享一段笔者写的自动更新脚本:
image-20200820195507087
关于dotfiles,就不分享自己的项目了,建议大家创建一份属于自己的dotfiles。毕竟各种配置,只有适合自己的才是最舒服的嘛!github也有许多dotfiles的分享,读者可以去参考。
ssh做代理
ssh 命令除了登陆外还有三种代理功能:
正向代理(-L):相当于 iptable 的 port forwarding
反向代理(-R):相当于 frp 或者 ngrok
socks5 代理(-D):相当于 ss/ssr
这里不展开赘述,可以参考[1]
总结
本文总结了常用的linux ssh操作,虽然大部分操作都很简单,但可以提升我们使用的体验。作为开发人员,“舒舒服服”地使用操作系统,可是常规操作哦。
参考
[1]: https://zhuanlan.zhihu.com/p/57630633 “韦易笑 SSH 命令的三种代理功能(-L/-R/-D)”
[2]: https://github.com/cmderdev/cmder/ “cmder的github”
[3]: https://cmder.net/ “cmder官网”