【Linux】SSH协议 SSH登录和SCP传文件指令 ssh命令中变量的空格问题
SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
SSH在实际工作开发中非常常用,它很好地解决了数据同步问题,同时也保证了一定的安全。
SSH并不难,但是非常重要。
SSH登录
指令登录——基于口令的安全认证
ssh user@hostname
user
用户名
hostname
IP地址或域名
首次登入某个服务器的时候会有警告
The authenticity of host '......' can't be established.ECDSA key fingerprint is SHA256:iy237yysfCe013/l+kpDGfEG9xxHxm0dnxnAbJTPpG8.Are you sure you want to continue connecting (yes/no/[fingerprint])?
输入yes就可以了
之后本地会保存该服务器的信息,记录到~/.ssh/known_hosts
文件中
输入密码就可以登录远程服务器了
配置文件
在.ssh
目录下创建文件config
输入
Host myseverHostname IP地址或域名User 用户名
可以保存服务器别名,之后直接使用myserver
就可以登录服务器,名字可以任取。
可以在此文件中存入多个服务器的别名,格式同上。
登录服务器指令
ssh myserver
密钥登录——基于密匙的安全认证
- 在家目录下输入指令创建密钥
ssh-keygen
一直回车,执行结束后~/.ssh
会多两个文件:
id_rsa
密钥
id_rsa.pub
公钥 - 之后只需要将公钥传给服务器即可免密登录
两种方法- 复制公钥内容到服务器的
~/.ssh/authorized_keys
文件中 - 指令一键添加
ssh-copy-id myserver
- 复制公钥内容到服务器的
执行命令
其实不需要每次都先登录服务器再操作,也可以直接在本地用以下指令
ssh user@hostname command
注意command内容若需要解析,则需添加单引号;
单引号在服务器解析,双引号在本地解析,在接受指令的时候,会在本地解析一遍,变成一个字符串传给服务器,服务器接收到字符串之后又会再解析一遍。
如果这指令使用了双引号,那么还没有ssh到服务器的时候,双引号就被本地解析掉了,同时地,循环也被拆散了,本地不知道$i
的值,为空,报错。
ssh myserver 'for i in 1 2 3 do echo $i; done'
一个很重要的例子——关于ssh命令中变量的空格问题
比如说需要在服务器的家目录下的tmp/test/
目录下 创建一个名为传入参数$1
的文件夹
ssh myserver mkdir tmp/test/\"$1\" #正确ssh myserver mkdir ~/tmp/test/\"$1\" #错误
注意不要用~
来代表家目录,~
在这里会被解析为本地的家目录,从而报错。
那这里为什么又要加\" \"
?
涉及到ssh命令中变量的空格问题,如果说$1
带有空格,那创建的文件夹名字很可能只取了$1
的前半段,所以我们就需要加上引号来避免它被拆开。
如果只加单引号,那么$1就会原样传过去,服务器同样会原样保留,那么$1
就是空了。
但是如果只加双引号,那么在本地解析的时候双引号就被解析掉了,到了服务器之后还是没有引号。
所以我们要给双引号转义,让本地第一遍解析的时候不要把双引号解析掉,这样传到云端的时候就保留了双引号。
不过我们还有另一种办法,就是双引号嵌套单引号
ssh myserver mkdir tmp/test/"'$1'" #正确ssh myserver mkdir ~/tmp/test/'"$1"' #错误
双引号在本地被第一遍解析掉,同时$1
被识别,到云端之后剩下单引号和一个可能包含空格的字符串。
但是单引号嵌套双引号的话,单引号里的内容就会被原样保留。
更改端口
ssh服务默认端口为22,如果想登录特定端口也可以
ssh user@hostname -p 22
但一般来讲更改了就无法正常登陆了
SCP传文件
命令
- 基本指令格式:将source路径下的文件复制到destination中
scp source destination
- 当然也可以一次复制多个路径文件
scp source1 source2 destination
- 复制文件夹 直接加参数
-r
scp -r source destination
- 举两个例子
destination可以是绝对路径,如果不是绝对路径则默认从家目录开始。
.
指当前路径- 将本地文件夹复制到服务器
scp -r ~/test myserver:~/root/tmp
- 将服务器文件夹复制到本地当前路径下
scp -r myserver:tmp/ .
- 也可以指定端口号 参数
-P
scp -P 22 source1 source2 destination
注意参数要加在source前
- 使用scp配置其他服务器的vim和tmux
scp ~/.vimrc ~/.tmux.conf myserver:
这样裸的vim和tmux就装修好了,可以更方便地使用了。
开发者涨薪指南
48位大咖的思考法则、工作方式、逻辑体系