> 文档中心 > 【Linux】SSH协议 SSH登录和SCP传文件指令 ssh命令中变量的空格问题

【Linux】SSH协议 SSH登录和SCP传文件指令 ssh命令中变量的空格问题


SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。

SSH在实际工作开发中非常常用,它很好地解决了数据同步问题,同时也保证了一定的安全。
SSH并不难,但是非常重要。

SSH登录

指令登录——基于口令的安全认证

ssh user@hostname

user用户名
hostnameIP地址或域名
首次登入某个服务器的时候会有警告

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就装修好了,可以更方便地使用了。

开发者涨薪指南 【Linux】SSH协议 SSH登录和SCP传文件指令 ssh命令中变量的空格问题 48位大咖的思考法则、工作方式、逻辑体系